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 ARBLOSTRIS 状态位

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/859008/tm4c1294ncpdt-i2c-arblostris-status-bit

器件型号:TM4C1294NCPDT

您好!

 我正在连接的 TivaTmC 系列 TM4C1294上开发 I2C 主设备的驱动程序
具有驱动程序库的 LaunchPad 评估套件。

我使用 I2C 中断来优化代码。

该评估板通过上拉电阻器连接到压力传感器。

每100ms、主器件开始从从器件接收四个字节的数据。

30或40秒后、我在状态处理程序中看到状态0x80或0x81、表示仲裁丢失。

此问题的根源在哪里? 从机还是主机? 原因是什么?

如何从这种情况中恢复? 我读取了一些"脉冲时钟"方法或复位 I2C 外设。 在复位 I2C 外设时、没有变化。 总线总是很忙。

您是否有一些说明重新启动 I2C 总线通信正确方法的代码示例?

感谢你的帮助。

 此致。

                   FWX。

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

    Francois 您好、

    仲裁丢失情况通常发生的原因有两个:

    1) 1)总线上竞争总线的多个主器件-但从您的描述来看、这听起来不像样例吗?

    2) 2)从器件由于某种原因将 SDA 保持在低电平。

    您应该能够在线路的示波器上看到 SDA 是否被保持在低电平。

    如果是这样、您可以通过计时从该状态恢复: https://e2e.ti.com/support/microcontrollers/other/f/908/p/590101/2170537#2170537

    如果从器件将 SDA 保持在低电平、则需要采取纠正措施、如上述 POST 所述。 在这里、重置 I2C 外设没有帮助。

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

    您可能还需要使用示波器查看 SDA 线。 如果上升时间过慢、则可以将其视为仲裁丢失。 您可能必须降低速度(您没有提到您使用的速度)或降低上拉电阻值以获得更快的上升时间。

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

    您好!

    我是否可以同意供应商代理以及作为引用(过去)过账的(成功)参与者、提供我公司为关键客户提供的最新"调查结果报告"。   (客户一致同意发布此数据。)

    遵循我们的"技术概要"、其目的是(大大减少、理想情况下防止)从"中删除"I2C 从器件指定器件"、将 SDA 信号线锁存为低电平、同时提高数据交换速度和稳健性

    • 如果和何时/在可能的情况下-将 I2C 从器件的数量限制为'4或更少'。   我们在各种"连接路径和(两者) PCB 布线长度和电缆长度"上测试了4家不同供应商提供的"已知良好的从属器件"。   客户和我的公司"无法积极发现出现这种限制的原因"-但确实如此-并且在"双眼"测试下存在(甚至)-由我的团队和此客户执行(两者都执行)。   请注意、随着 I2C 主设备和从设备之间的距离增加、"增强了4个从设备上的切断"。   我们在添加从器件时降低了上拉电阻器的值、并采用了先进的"阻抗测量设备"、甚至这也不能"指向"导致这种切断的原因、而且这种规律性也很高。   当需要4个以上的从器件时-我们建议使用"I2C 总线中继器"和/或"使用第二个 I2C 通道"。   (即独立的 I2C 通道)
    • 正如预期的那样-更高速度的 I2C 数据速率(两种):"缩短了我们可以进行可靠交换的长度"和"增加了此类 I2C SDA 总线挂起的数量!"   再说一次-这是"I2C 中继器"通常解决此类问题的一个区域。

    I2C PCB 布线长度和电缆长度(延长)-数据传输速度减慢-并极大地增加了出现这些"DA 挂起!"的次数   我们发现- 9厘米经证明容易出错- 16厘米以上经证明特别容易出错。   利用射频传输线路技术-包括扩大两条布线(尤其是 SCL 布线)、可显著改善距离并提高交换速度。   当 PCB 布线为:

    • 太长
    • 太窄
    • 过于间接(即方向改变-特别是>45°)
    • 通过过孔

    • 经理论化、这个"多余的走线电感"引起了"变化中的瞬态"-这导致 I2C 从器件的"闩锁"-挂起 SDA。
    • 50Ω 在"每个从器件"的 SDA 和 SCL 引脚附近添加了小值串联电阻器(即33k Ω)。   这似乎减少了此问题。

    我们采用的测试:

    • 3个不同的 ARM Cortex MCU (来自3个不同的供应商- 2个 M4、1M7)和一个用作 I2C "脚轮"的 FPGA。
    • I2C 从设备-最常使用-驻留于"官方评估板"上、再次来自各种"名称源"。
    • 定制 PCB、可在 I2C 主设备和从设备之间提供"接口:布线长度和布线宽度"
    • 传输为"标准(100Kbps)和快速模式(400Kbps)"。   还测试了2种更高速度的模式-这些结果未经"授权披露"。
    • 所有测试均在"抗射频室"中进行、这是一个实验室级电源、被保险为"纯功率和充足功率"。

    我们要感谢客户让我们能够"收集此数据"、并相信(许多人)将从这项努力中受益...

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

    您好 CB1、

    非常感谢您与社区分享如此详细的调查结果! 并向您的客户表示感谢。 这肯定会帮助许多其他人、我们感谢您分享公司的经验。

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

    您好 Ralph、

    在我的示例中、只有一个器件连接到 I2C 总线、没有其他主器件。 因此、当只有一个主器件时、我不会低估状态位"仲裁丢失"。

     我尝试使用以下代码对 SCL 信号进行脉冲:

    静态空 ResetI2CModule (空)

     //重置 I2C 模块
     //停止 MasterFunction 中的时钟、复位和 EnableI2C 模块
     SysCtlPeripheralDisable (PSENSOR_I2C_SYSCTL_Periph);
     SysCtlPeripheralReset (PSENSOR_I2C_SYSCTL_Periph);
     SysCtlPeripheralEnable (PSENSOR_I2C_SYSCTL_Periph);

     //等待 Peripheralto 为编程做好准备
     while (!SysCtlPeripheralReady (PSENSOR_I2C_SYSCTL_Periph));

     #ifdef 调试
     trace_I2C ("I2C 已重置、%d 次\n"、++NbI2CReset);
     #endif

     //复位中断
     I2CMasterIntClearEx (PSENSOR_I2C_BASE、I2CIntFlags);
     //I2CMasterIntClear (PSENSOR_I2C_BASE);
     LastIntStatus = 0;
     //I2CMasterEnable (PSENSOR_I2C_BASE);
     I2CMasterInitExpClk (PSENSOR_I2C_base、system_clock、false);
     //启用 I2C 主机中断。
     I2CMasterIntEnableEx (PSENSOR_I2C_BASE、I2CIntFlags);

    空 READ_I2C_DEVICE (空)

    (笑声)

     //尝试在 I2C 总线上读取之前完成的测试:

      if (I2CMasterBusy (PSENSOR_I2C_BASE))
      {
       uint32_t LineState;
       LineState = I2CMasterLineStateGet (PSENSOR_I2C_BASE);
       TRACE_I2C ("I2C 总线忙! %XH SDA %s SCL %s\n",LineState, LineState&0x02?"开":"关",LineState&0x01?"开":"关");
       //重置 I2C 模块
       //停止 MasterFunction 中的时钟、复位和 EnableI2C 模块
       SysCtlPeripheralDisable (PSENSOR_I2C_SYSCTL_Periph);
       TRACE_I2C ("I2C BEGIN Pulse SCL\n");
       //将 SDA 配置为 DTR 输出信号调制解调器
       GPIOPinConfigure (GPIO_PN4_U1DTR);
       GPIOPinTypeGPIOOutput (PSENSOR_GPIO_PORT_BASE、PSENSOR_I2C_SDA_PIN);
       {
        uint32_t SignalState;
        //SignalState = GPIOPinRead (PSENSOR_GPIO_PORT_base、PSENSOR_I2C_SCL_PIN|PSENSOR_I2C_SDA_PIN);
        for (int i = 0;i < 50;+i)
        {
         //复位 SCL 和 SDA
         GPIOPinWrite (PSENSOR_GPIO_PORT_BASE、PSENSOR_I2C_SCL_PIN|PSENSOR_I2C_SDA_PIN、PSENSOR_I2C_SCL_PIN/*|PSENSOR_I2C_SDA_PIN*/);
         //vTaskDelay (1);
         SysCtlDelay ((system_clock/3/100000)+50);
         //复位 SCL 和 SDA
         GPIOPinWrite (PSENSOR_GPIO_PORT_base、PSENSOR_I2C_SCL_PIN|PSENSOR_I2C_SDA_PIN、PSENSOR_I2C_SDA_PIN);
        }
       }
       //为 I2C 功能配置引脚复用
       GPIOPinConfigure (PSENSOR_I2CSDA_PIN);  
       //为这些引脚选择 I2C 功能
       GPIOPinTypeI2C (PSENSOR_GPIO_PORT_BASE、PSENSOR_I2C_SDA_PIN);
       TRACE_I2C ("I2C 端脉冲 SCL\n");

         ResetI2CModule();

    (笑声)

     它可以正常工作四到五次、但稍后、器件定义不会回答...

    感谢您的回答。

     此致。

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

    [引用用户="Ralph Jacobi"]非常感谢您与社区分享如此详细的发现!

    您好 Ralph、

    员工/我感谢您的善意-以及持续的支持、"供应商代理为该论坛社区提供了帮助"。

    我们的客户-阅读我们的帖子-已授权发布我们的其他4项调查结果:  (注意:在所有情况下-仅聘用了"一名总线管理员"!)

    • 过去曾使用过一家技术公司"Public"-我们拥有一个"存储正确、"原始"I2C 从设备的集合。   这些器件(以前的)包含在我们的"I2C 从器件库存"中、它(主要)包含较新的从器件。   现在、这些"旧/旧"器件(~15-20年(通过生产日期代码))与"更大的器件几何形状/功能"一起实施、经过"理论化"、将证明"对以下情况具有"更强的抵抗力":
      • SDA 挂起
      • 距离限制(即主设备和从设备之间)
      • 这种理论(更耐受)是"坚定的肯定!"

    • 通过将一个小信号 FET (能够为从器件提供所需的电流)与 FET 置于 MCU 的 GPIO 控制下运行、我们(几乎)始终能够从 SDA 挂起中"快速恢复"!   这些测试主要在许多/大多数论坛用户可能使用的"最新/最出色"I2C 从设备上执行。  
    • 虽然尚未完全确定-尽管"对 SCL 信号进行脉冲"(通常)会释放 SDA Hang -但我们相信、"脉冲技术可以避免解决 SDA Hang 的原因-而且进一步的 SDA Hang -及时-(可能)会导致器件损坏!
    • 如果这些 SDA 挂起定期发生-可能会出现、
      • 电路板设计问题(布线、布线宽度、不需要的(相邻)噪声和/或信号耦合)
      • 主从设备之间的间隔过大
      • "上拉"电阻值不正确

    同样、所有这些结果都源于"仅一个 I2C 主设备"的实现、因此"仲裁"实际上并不起作用。   相反-"DA Hang (DA 悬挂)"可能会提供"警告"-"一切都不好..."

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

    Francois 您好、

    您是否能够使用示波器查看 SDA 线路? Bob 详述了许多原因、这些原因也可能导致这种情况、而这种情况在没有第二个主器件的情况下会发生。 考虑到您所报告的内容、这应该是下一步。 即使在100kbps 时、也需要评估上拉电阻器。 您可能还需要参阅有关上拉电阻的应用手册。  http://www.ti.com/lit/an/slva689/slva689.pdf


    感谢 CB1提供的其他四项调查结果!

    [引用 USER="CB1_MOBILE]*如果这些 SDA 挂起定期发生-很可能会出现、

    • 电路板设计问题(布线、布线宽度、不需要的(相邻)噪声和/或信号耦合)
    • 主从设备之间的间隔过大
    • "上拉"电阻值不正确

    [/报价]

    在评估其中一些挂起的根本原因时、范围上限上是否有任何行为可帮助指示存在哪些问题? 我想第1点和第2点的行为是相似的、但与错误估价的上拉相比、前两点的行为是怎样的?

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

    [引用用户="Ralph Jacobi"]……范围上限上是否有任何行为可帮助指示出现了哪些问题?[/引用]

    我们有数百个示波器电容器:"PRE、AT 和 Post"触发器。   实际上、由条件1和2引入的(不需要的)增加的电感会产生瞬态尖峰、超出了从器件的规格。   在此阶段-我们的客户认为、"此处提供了有效数据、以便(真正)感兴趣的人员能够进行自己的调查..."

    同样、潜在的"关键发现"是、重复出现的"DA Hang (由从属方发起)"是设计/实施缺陷的"工具"。

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

    您好 CB1、

    哦、我没有要求发布示波器捕获或任何相关内容、只是想了解 Francois 在分析硬件时可以尝试关注哪些内容。 您的最新回复对此提供了足够的建议、因此再次感谢您提供的所有贡献。

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

    您好 Ralph、

    我们没有收到此海报的反馈、因此我们不知道有什么(如果有)被吸收了。

    我可以补充、"并非所有从器件都以相同的程度表现出这种"DA 灵敏度"!    这是关键/关键!

    例如、"有缺陷的 PCB 布局"可能(及时)破坏特定的从属器件-但"替代器件"(理想情况下具有匹配的 PCB 封装)可能会表现出、远小于甚至没有此类灵敏度!    这是一个(赦免)相当壮观的发现-你不同意吗?   (我们再次感谢我们的客户允许"公开分享"我们的关键/关键"I2C 发现!"

    通常(但并非始终如此)、多家供应商可能提供(接近)相同的器件、从而能够"搜索并(希望)成功识别"正在运行的性能、从器件"、该从器件可以"搜索(甚至)成功识别"低于原始状态"的电路板/噪声/PCB 实施布局...   此类(可能)证明此(迄今为止)"对我们沉默"海报的"最佳行动方案"。

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

    感谢 Ralph 和 CB1的回答。

    我无法使用振荡器来查看信号的状态、因为我没有振荡器。

    我只能调用 I2CMasterBusy()和 I2CMasterLineStateGE()进程来确定行的状态。 有时、SDA 打开、有时当问题发生时、SDA 关闭。

    此致。

                          FWX。

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

    Francois 您好、

    如果没有示波器捕获、我们很难在此处提供更多反馈... 您何时可以访问其中一个?

    如果是硬件问题、使用一组信息调试这种情况可能不可能。

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

    您好、Ralph、

    完全同意-远程诊断-减去关键测量-在"大困难和挑战"下操作。

    当地学校、大学甚至小型科技企业可能允许"有计划地使用范围"。

    缺少"应付帽"-根据我的客户描述的"调查结果"-海报板的"高分辨率"照片-(可能)可以提供进一步的评论。

    此类照片(必须)包括:

    • (两个) MCU 和"故障从器件"的清晰、无障碍视图
    • 准确测量 MCU 和从设备之间的"间隔距离"
    • 照片应清楚地显示 MCU 和从器件之间的布线-尤其是 SCL 线的布线
    • 从器件的清晰标识-理想情况下具有"链接"

    不清楚海报"已接受"是否 提供了"几乎相同的器件"(具有匹配的 PCB "封装")-并且(可能)证明更能抵抗 "锁定和/或破坏"。