我在400kHz I2C主模式下使用UCB1,在读取几个字节后,I2C引擎似乎在设置繁忙位时挂起。 如果你看一个示波器上的SCL线,你可以看到400kHz SCL脉冲一直持续。 如果我卸下外部设备,使总线上没有任何东西,脉冲将继续,从而使脉冲来自MSP430。
写入事务或100kHz I2C似乎不会发生这种情况。 我想不出为什么巴士会陷入这种状态。 调试此问题有什么建议? 我应该运行的任何实验或应该收集的数据?
谢谢!
Michael
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我在400kHz I2C主模式下使用UCB1,在读取几个字节后,I2C引擎似乎在设置繁忙位时挂起。 如果你看一个示波器上的SCL线,你可以看到400kHz SCL脉冲一直持续。 如果我卸下外部设备,使总线上没有任何东西,脉冲将继续,从而使脉冲来自MSP430。
写入事务或100kHz I2C似乎不会发生这种情况。 我想不出为什么巴士会陷入这种状态。 调试此问题有什么建议? 我应该运行的任何实验或应该收集的数据?
谢谢!
Michael
您好Michael:
如果MSP430是主控制器,则SCL线路由MSP430控制。 从属设备可以将其保持在低的时钟拉伸状态。当发生这些时钟脉冲时,它们是在MSP430上处于TX模式还是RX模式? 如果是TX模式,则您将重复填充TXbuf。 如果您正在接收,则可能是未正确发送停止,而您仍在读取RXbuf,因为如果RXbuf未及时读取,MSP430将停止I2C。 我可以看到一个场景,如果你运行的CPU真的很慢,你的I2C也很快,你可能会遇到一个循环(取决于外部逻辑),试图总是接收。而不是及时检查接收计数和发送停止。 通常,当I2C偏离轨道时,总线停止或怠速(通信停止)。
我还建议查看以下应用说明以进一步调试。
Jace,
要明确一点,SCL保持在低电平时,总线不会停止-它在400kHz时持续脉冲。
您知道我正在使用中断生成停止条件。 接收数量提前已知,因此RX ISR正在递减计数器,并在计数器达到1时设置TXSTP (这意味着最后一个字节当前正在处理)。 正在清除RX中断标志,但未禁用RX中断。 我可以尝试一下。 我还将检查调试器中是否设置了任何UCB1IFG位。 我知道在调试器中查看控制寄存器时设置了TXSTP,因此我至少已经通过了代码路径来传输停止。