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.
您好!
我正在连接的 TivaC 系列 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 PCB 布线长度和电缆长度(延长)-数据传输速度减慢-并极大地增加了出现这些"DA 挂起!"的次数 我们发现- 9厘米经证明容易出错- 16厘米以上经证明特别容易出错。 利用射频传输线路技术-包括扩大两条布线(尤其是 SCL 布线)、可显著改善距离并提高交换速度。 当 PCB 布线为:
我们采用的测试:
我们要感谢客户让我们能够"收集此数据"、并相信(许多人)将从这项努力中受益...
您好 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项调查结果: (注意:在所有情况下-仅聘用了"一名总线管理员"!)
同样、所有这些结果都源于"仅一个 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、
完全同意-远程诊断-减去关键测量-在"大困难和挑战"下操作。
当地学校、大学甚至小型科技企业可能允许"有计划地使用范围"。
缺少"应付帽"-根据我的客户描述的"调查结果"-海报板的"高分辨率"照片-(可能)可以提供进一步的评论。
此类照片(必须)包括:
不清楚海报"已接受"是否 提供了"几乎相同的器件"(具有匹配的 PCB "封装")-并且(可能)证明更能抵抗 "锁定和/或破坏"。