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.

[参考译文] tm4c1292ncpdt:I2C 总线仲裁丢失错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/590101/tm4c1292ncpdt-i2c-bus-arbitration-lost-error

我收到 I2C0总线仲裁丢失错误。 在探测 SDA 线时发现它一直处于低电平。 即使执行下电上电也没有任何帮助。 查看了各种论坛、建议在其中切换配置为 GPIO 的 SCL 线路几次。 我的操作与下面列出的操作相同:-

MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

MAP_GPIOPinTypeGPIOInput (GPIO_PORTB_BASE、GPIO_PIN_3);// I2C 数据
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_2);// I2C 时钟
计数= 0;
while (MAP_GPIOPinRead (GPIO_PORTB_BASE、GPIO_PIN_3)=0){
MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_2、0);
//for (i=0;i<1000;i++);
SysCtlDelay (((120000000/(3 * 1000000))* 1);//等待1ms

MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_2、GPIO_PIN_2);
//for (i=0;i<1000;i++);
SysCtlDelay ((120000000/(3 * 1000))* 1);//等待1ms

count++;
if (count > 100)//max 100在放弃前切换、以确保我们不会在这里卡住
中断;

之后、我照常初始化 I2C 外设。  

上述方法无法解决我的问题。 我甚至 按照别人的建议、将 I2CSDA 配置为开漏、即 MAP_GPIOPinTypeGPIOOutputOD (GPIO_PORTB_BASE、GPIO_PIN_2)、甚至这种配置也不起作用。 能否有人帮助我解决此问题?

谢谢

Sumeet Deo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sumeet、
    总线上是否有多个主器件? 仲裁丢失通常发生在有多个主器件竞争总线时、一个主器件最终将丢失仲裁。 如果您没有多个主器件、那么 I2C 从器件也有可能将 SDA 拉低。 有时从器件会将 SDA 拉低、因为它无法返回主器件。 当 SDA 被拉低时、主器件会将其检测为仲裁丢失。 因此、我建议您研究谁将 SDA 拉低、是主器件还是从器件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    感谢您的快速响应。
    否、我们不在总线上使用多个主器件。 它只是一个控制器作为主控制器、即 TM4Cncpdt。
    但连接了多个从器件。 我们怀疑其中一个从器件会将 SDA 拉低。

    因此、正如许多人所建议的、我遵循了将 SCL 输入(PB2)配置为 GPIO 输出、将 SDA 配置为 GPIO (PB3)输入的方法。
    并多次切换 SCL、直到检测到 SDA 为高电平。

    但这种方法似乎对我不起作用。
    您能不能建议我在这里遗漏的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您有多个从器件、并且怀疑其中一个从器件将 SDA 保持在低电平、您能否逐个移除从器件并识别出有问题的模块? 您使用的上拉电阻器值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们为 SDA 和 SCL 使用2K 的上拉电阻器。 并尝试识别有问题的模块。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们移除了违规的从设备、并修复了卡住的问题。 但是、我们如何在软件中从这种问题中恢复呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    I2C 是一种开漏总线。 如果一个不良的从器件将 SDA 线路保持在低电平、那么主器件中的软件不能做任何事情来释放 I2C 总线。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    与供应商的 Bob 达成一致(几乎)-这是一个特别不幸和"难以克服"的问题。

    然而(有时)简单地更换/(尤其是)"麻烦"远程设备将消除(或大大减少)问题的发生。

    我们早已使用该"脉冲 SCL 方法"从(类似)"I2C 挂起"情况中恢复。

    如果更换(特殊-有问题的器件 IC)没有得到很大改善-我们发现您的"备用 GPIO 的专用性"、无论是通过自身还是通过驱动小型 FET、都可以向该遥控器施加电源并切断电源、 I2C 从设备-大多数(始终)将"清除该故障"。   

    一如既往、更换"麻烦"器件和远程 PCB、以消除"单板/芯片异常"、从而节省大量(和浪费)时间和精力!   当然、在到达这里之前、您已经(真的)测量并验证了所有连接(尤其是电源)对有问题的电路板和芯片的适当性!

    [编辑]还请注意、未提供此故障电路板/器件与控制 MCU 之间的"距离"!   I2C 并不是(著名的)远距离成功!

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

    [引用 user="Bob Crosby"]如果一个错误的从器件 SDA 线路保持在低电平则主器件中的软件不能执行任何操作来释放 I2C 总线。

    然而-两个都是正常的 我已经注意到-由于应用了足够数量的 SCL 时钟-有问题的从器件(也许)将 SDA 从其接地保持状态中释放出来。  Fi/I 和多个其他方已经这么做了很多次、实际上我们的 I2C 软件会识别出这种"错误从器件"情况(可能)的发生、软件会在检测到时实施 SCL 时钟(纠正)措施。

    如果我们不担心"核查"被应用于持有这一报价的职位(我可以说"不完美/有限")。

    实际上、如果从器件"真的很糟糕"并且拒绝 SCL 时钟序列和/或从器件电源移除/恢复-那么(仅)主器件无法恢复 I2C。

    我认为这一点值得澄清!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CB1、
    你是对的。 感谢您明确说明这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也感谢 Bob。 (已验证的帖子应力求正确。)
    应该注意的是、您首先建议"一对一-从器件移除-以识别"麻烦"器件。"