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.

[参考译文] MSP430F5529:400kHz I2C主模式下的UCB1传输无限SCL脉冲

Guru**** 2524550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/640803/msp430f5529-ucb1-in-400khz-i2c-master-mode-transmitting-infinite-scl-pulses

部件号:MSP430F5529

我在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偏离轨道时,总线停止或怠速(通信停止)。

    我还建议查看以下应用说明以进一步调试。

    MSP430 MCU上常见eUSCI和USCI串行通信问题的解决方案

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢,Jace。 当总线卡住时,它处于RX模式,我看到UCB1CTL1中设置了UCTXSTP。 文档显示在生成停止时会自动清除此信息,因此我怀疑它仍在尝试发送停止。 SCL持续脉冲,SDA高。 如果SDA一直处于低位,我就会明白MSP430为什么会在条件清除之前切换SCL,以便生成停止条件。 但由于自失能率高,所以不应驾驶巴士,而应可在需要时自行停车。

    您知道有什么方法可以进入SDA高时SCL持续脉冲的状态?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael,

    SDA的状态无关紧要。 如果任一设备需要停止总线,则将通过保持SCL线路低电平来完成。 我怀疑您正在尝试使用某种类型的fo中断来生成停止条件,但RX中断具有更高的优先级并继续执行。 您是否知道您将始终获得的最大接收数量? 如果是这样,我会在RX中断中放置一个计数变量,并在RX中断内手动生成停止条件,然后关闭RX中断。 这应该会有所帮助。

    另外,请务必查看我之前提到的应用说明,因为它描述了中断优先级问题的解决方法,我相信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace,

    要明确一点,SCL保持在低电平时,总线不会停止-它在400kHz时持续脉冲。

    您知道我正在使用中断生成停止条件。 接收数量提前已知,因此RX ISR正在递减计数器,并在计数器达到1时设置TXSTP (这意味着最后一个字节当前正在处理)。 正在清除RX中断标志,但未禁用RX中断。 我可以尝试一下。 我还将检查调试器中是否设置了任何UCB1IFG位。 我知道在调试器中查看控制寄存器时设置了TXSTP,因此我至少已经通过了代码路径来传输停止。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael,

    在此处查看您的测试是否揭示了问题。

    此外,了解您的总线不会因SCL过低而停转。 我只是澄清,根据I2C标准,SCL的定义是"保持低"。 随着它的不断跳动,一些东西正在推动它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很遗憾,我还没有机会尝试一下,因为我一直忙于其他事情。 我希望下星期能够这样做。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次检查,我尝试添加中断禁用。 但是,在 我完成接收足够的字节之前就发生了该问题,因此它并没有真正的区别。 我正在进行2字节读取,MSP430 (主)是NACKing,它是返回的第一个字节,然后连续脉冲SCL。 未设置USB1IFG位,UCB1STAT为0x10 (仅占线)。 UCB1CTL0 = 0x2F,UCB1CTL1 = 0x80 (UCSSEL_2)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Michael,

    我应该已在前面检查此部件的勘误表。 直到现在,它才单击"这可能是USCI30勘误表"。 我建议查看USCI 30的变通办法,并实施其中一种变通办法。 有时,当您立即进入ISR时,只需阅读RXBUFF即可,但勘误表文档提供了更多防弹方法。