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.

[参考译文] TM4C1294NCPDT:发生奇数 I2C 错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1336570/tm4c1294ncpdt-odd-i2c-error-occurring

器件型号:TM4C1294NCPDT

我拥有 Tiva 固件、该固件定期(每~200ms)读取单个 I2C 总线上的几个不同器件。  我们经常会看到总线上的 SCL 和 SDA 线保持高电平、尽管 Tiva 固件继续执行 I2C 读取的代码。   下面显示了 SCL 和 SDA 何时从正常工作过渡到无限期保持高电平的示波器屏幕截图。

奇怪的是、I2C 外设配置为开漏、我们在 SCL 和 SDA 线路上使用上拉电阻、但我们从未看到任何一条线路都变为低电平、尽管我们提到过、 固件 继续进行周期性的 I2C 读取、调用 TivaWare 函数、如 I2CMasterSlaveAddrSet、I2CMasterDataPut、I2CMasterSlaveAddrSet、I2CMasterControl 和 I2CMasterDataGet。

在我们看到 SCL 和 SDA 无限期保持高电平后、我已经检查了 I2C 通道的  I2CMCS 寄存器(见下面的第二个图)并 看到一些非常冲突的状态。  例如、总线同时处于忙状态和空闲状态。

此外、我们还增加了按需触发一些"复位逻辑"的功能。  该复位逻辑将禁用 I2C 外设、将 SDA 和 SCL 引脚更改为 GPIO、并尝试根据 Analog Devices AN-686应用手册来复位 I2C 总线(基本来说是一次位后复位以释放总线)、然后切换回 I2C。  这 可以正常工作、但通常只需一秒钟或两秒钟、它就会返回到 SCL 和 SDA 线路都无限期保持高电平的先前状态。

任何人对这一问题的任何想法都将不胜感激。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尽管 Tiva 固件继续执行 I2C 读取的代码、我们经常会看到总线上的 SCL 和 SDA 线保持高电平。   下面显示了 SCL 和 SDA 从正常工作过渡到无限期保持高电平的时间的示波器屏幕截图。

    您好、Terence:

     为了确保我们在同一个页面上、您能回答几个问题吗?

     - I2C 的运行速度是多少? 100K 或更高、比如400K?

     -如果你目前运行在较高的速度,它是否能在100k 运行有区别?

     -在哪个 I2C 设备上你看到总线卡滞了? 是始终在访问特定从器件后访问还是随机访问?

     -如果总线总是在读取一个特定的从属后卡住,那么你可以带那个从属的一段时间。 您是否可以在其他设备上再次重复同样的问题、反之亦然?

     -您可以在另一个定制板上重复同样的问题吗?

     -可以在 LaunchPad 上重复同样的问题吗?

     -如果您仔细检查示波器,您是否看到时钟上有任何毛刺?

    奇怪的是、I2C 外设被配置为开漏、我们是在 SCL 和 SDA 线路上使用上拉电阻器、然而我们从来没有看到过任何线路变成低电平、尽管如前所述、 以便固件 继续执行周期性的 I2C 读取、调用 TivaWare 函数、如 I2CMasterSlaveAddrSet、I2CMasterDataPut、I2CMasterSlaveAddrSet、I2CMasterControl 和 I2CMasterDataGet。

     -我想确保您使用 GPIOPinTypeI2CSCL()和 GPIOPinTypeI2C() 作为 SCL 和 SDA  引脚,而不是您自己的引脚。 下面是一个示例。  

    MAP_GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0);
    MAP_GPIOPinTypeI2C (GPIO_PORTD_BASE、GPIO_PIN_1);

     -您使用的上拉电阻值是多少?

    此外、我们还添加了按需触发一些"重置逻辑"的功能。  该复位逻辑将禁用 I2C 外设、将 SDA 和 SCL 引脚更改为 GPIO、并尝试根据 Analog Devices AN-686应用手册来复位 I2C 总线(基本来说是一次位后复位以释放总线)、然后切换回 I2C。  这是 可行的,但通常只有一两秒钟后,它将返回到以前的状态,其中 SCL 和 SDA 线都无限期地保持高电平。[/报价]

    通过总线位绑定来恢复/重新同步主器件和从器件是我认为可靠的唯一方法。 一旦主器件和从器件丢失同步、仅仅复位 I2C 主器件是不够的、因为从器件不知道主器件已复位、并且它仍处于等待下一个时钟到达的状态。 唯一的方法是在不进行冷功率循环的情况下、对总线进行位冲击以强制两侧进入相同状态。  

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

    您好、Charles、感谢您的回复。   我很遗憾地通知您、这似乎是硬件问题。  我们的电气工程团队对此进行了更详细的研究、显然发现了 一些电缆屏蔽问题。   解决此问题可以解决 I2C 通信问题。

    非常感谢您的全面及时回应。  对于误报、我们深表歉意。

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

    您好、Terence:

     很高兴您的问题得到解决。