[STM32F1] I2C多主模式下通信冲突,偶发总线卡死

[复制链接]
165|14
Bblythe 发表于 2025-10-9 07:29 | 显示全部楼层 |阅读模式
项目里两个MCU共享一条I2C线,作为多主使用。大多数时候OK,但偶尔两边同时发起通信,总线就挂死,SDA保持低电平,直到复位。怀疑是仲裁丢失后恢复逻辑没处理好。
Clyde011 发表于 2025-10-9 07:32 | 显示全部楼层
我以前在errata里看到类似问题的描述。
公羊子丹 发表于 2025-10-9 07:33 | 显示全部楼层
I2C多主确实挺难搞,建议改成主从架构更稳。
周半梅 发表于 2025-10-9 07:34 | 显示全部楼层
可能是你没处理仲裁丢失标志,导致状态机卡死。
帛灿灿 发表于 2025-10-9 07:35 | 显示全部楼层
我遇到过是因为用float计算占空比,误差累积导致的。
童雨竹 发表于 2025-10-9 07:36 | 显示全部楼层
可以尝试加个总线超时检测,自动复位I2C。
万图 发表于 2025-10-9 07:37 | 显示全部楼层
你用的开漏上拉电阻多大?太小也容易卡线。
Wordsworth 发表于 2025-10-9 07:38 | 显示全部楼层
我印象中F1系列I2C硬件有bug,多主不太稳定。
 楼主| Bblythe 发表于 2025-10-9 07:38 | 显示全部楼层
如果必须多主,用软I2C反而可控些。
Pulitzer 发表于 2025-10-9 07:39 | 显示全部楼层
加一个外部开漏缓冲器也有帮助。
Uriah 发表于 2025-10-9 07:41 | 显示全部楼层
可以抓波形看看是SCL还是SDA先被拉低的。
cr315 发表于 2025-10-9 11:03 | 显示全部楼层
仲裁失败后的总线占用导致的
elephant00 发表于 2025-10-9 11:04 | 显示全部楼层
STM32F1的I2C外设不支持硬件自动仲裁恢复
duo点 发表于 2025-10-9 12:04 | 显示全部楼层
输掉仲裁的设备未及时释放SDA,会导致SDA被持续拉低,形成总线死锁。
flycamelaaa 发表于 2025-10-9 13:05 | 显示全部楼层
多主模式下,主设备的SCL时钟可能不同步,导致从设备响应混乱
jcky001 发表于 2025-10-9 14:05 | 显示全部楼层
在每次I2C传输后检查I2C_FLAG_AF,若置位则立即停止传输并释放总线
jcky001 发表于 2025-10-9 15:06 | 显示全部楼层
优化总线设计,添加上拉电阻
onlycook 发表于 2025-10-9 15:07 | 显示全部楼层
降低I2C时钟频率
powerantone 发表于 2025-10-9 16:07 | 显示全部楼层
软件必须主动处理仲裁失败,通过检测I2C_FLAG_AF并释放总线
probedog 发表于 2025-10-9 17:08 | 显示全部楼层
硬件需强上拉和缓冲器提升总线抗干扰能力
您需要登录后才可以回帖 登录 | 注册

本版积分规则

166

主题

6125

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部