我在PIC24HJ256GP610A上的I2C模块有问题。我的代码(参见下面的代码片段)在PIC24HJ256GP610上运行得很好,注意:不是610A。我使用I2C总线与DS1374 RTCC通信。但在610A上,当尝试使用I2C将值写入RTCC时,它会在轮询ACKSTAT位时卡住。此外,大多数情况下,通过I2C读取值时,RTCC值不会递增(有时会按应该递增的方式递增)。有什么想法吗?处理I2C模块的610和610A之间的配置位/模式/设置是否存在差异?我试着换掉RTCC芯片,换掉处理器。因此,这里唯一的区别是I2C通信在610上工作,而不是在610A上。
610和610A之间有什么区别?610是不再生产的过时部件,还是会继续生产?
在实验、探测信号和使用调试器逐步执行时,我注意到了一些事情:
1)。在将要发送的第20位上,I2C时钟无限期地变高,如果我暂停调试器,它就会在轮询ACKSTAT位时被卡住。第一位似乎是起始位,然后是9位,然后是另一个开始/停止位,然后是9位,然后时钟线变为高电平。
2)。当时钟线卡住并使用监视窗口时,I2C1STATbits寄存器中的值为0x8008,表示从从机接收到NACK,并且最后检测到起始(或重复起始)位。
3)。我总是能够从带有610和610A的从属设备(RTCC)读取数据。但是,有时使用610A时,其值不会递增,并保持在某个整数值。我相信当我切断所有东西的电源并对所有东西重新编程时,RTCC的值就会改变。有时它在读取值时保持不变,可能有25%的时间它实际上会在读取值时发生应该的变化。
4)。我无法使用610A通过I2C向RTCC写入任何内容。处理器在轮询ACKSTAT位时被卡住(我假设是因为它从RTCC收到了一个NACK )。610的性能非常好。
工具: MPLAB v8.86、C30 v3.31、ICD3
谢谢你,布拉德
//Write RTCC Register: This functions writes a Byte to the DS1374 RTCC
void Write_RTCC_Register(int Register, unsigned char Byte
{
unsigned int config2, config1;
/* Baud rate is set for 100 Khz */
config2 = 0x97;
/* Configure I2C for 7 bit address mode */
config1 = (I2C1_ON & I2C1_IDLE_CON & I2C1_CLK_HLD &
I2C1_IPMI_DIS & I2C1_7BIT_ADD &
I2C1_SLW_DIS & I2C1_SM_DIS &
I2C1_GCALL_DIS & I2C1_STR_DIS &
I2C1_NACK & I2C1_ACK_DIS & I2C1_RCV_DIS &
I2C1_STOP_DIS & I2C1_RESTART_DIS &
I2C1_START_DIS);
OpenI2C1(config1,config2);
IdleI2C1();
StartI2C1();
//Configure RTCC
//Wait till Start sequence is completed
while(I2C1CONbits.SEN);
//Clear interrupt flag
IFS1bits.MI2C1IF = 0;
//Write Slave address and set master for transmission
MasterWriteI2C1(0xD0);
//Wait till address is transmitted
while(I2C1STATbits.TBF); // 8 clock cycles
while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle
IFS1bits.MI2C1IF = 0; // Clear interrupt flag
while(I2C1STATbits.ACKSTAT);
OpenI2C1(config1,config2);
IdleI2C1();
StartI2C1();
//Wait till Start sequence is completed
while(I2C1CONbits.SEN);
//Clear interrupt flag
IFS1bits.MI2C1IF = 0;
//Write Slave address and set master for transmission
MasterWriteI2C1(Register);
//Wait till address is transmitted
while(I2C1STATbits.TBF); // 8 clock cycles
while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle
IFS1bits.MI2C1IF = 0; // Clear interrupt flag
***while(I2C1STATbits.ACKSTAT); //problem here***
//Clear interrupt flag
IFS1bits.MI2C1IF = 0;
//Write Slave address and set master for transmission
MasterWriteI2C1(Byte);
//Wait till address is transmitted
while(I2C1STATbits.TBF); // 8 clock cycles
while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle
IFS1bits.MI2C1IF = 0; // Clear interrupt flag
while(I2C1STATbits.ACKSTAT);
StopI2C1();
//Wait till stop sequence is completed
while(I2C1CONbits.PEN);
CloseI2C1();
}; //Write RTCC Register发布于 2012-09-11 06:34:21
我找到问题了。我重新启用了I2C模块,并在"...ACKSTAT);//problem here“代码行上方的几行断言了一个不必要的启动条件。模块的重新启用似乎不会有什么不同,问题是重新断言了开始条件位。
我不确定为什么它可以与610一起工作,而不是610A。无论如何,问题都解决了!
...
...
...
//**DELETED** OpenI2C1(config1,config2);
//**DELETED** IdleI2C1();
//**DELETED** StartI2C1();
////**DELETED** Wait till Start sequence is completed
//**DELETED** while(I2C1CONbits.SEN);
//Clear interrupt flag
IFS1bits.MI2C1IF = 0;
//Write Slave address and set master for transmission
MasterWriteI2C1(Register);
//Wait till address is transmitted
while(I2C1STATbits.TBF); // 8 clock cycles
while(!IFS1bits.MI2C1IF); // Wait for 9th clock cycle
IFS1bits.MI2C1IF = 0; // Clear interrupt flag
while(I2C1STATbits.ACKSTAT); // ** problem no more!
...
...
...https://stackoverflow.com/questions/12333861
复制相似问题