DW_apb_i2c 总线清除功能(Bus Clear Feature) 的详细解释,涵盖 SDA 和 SCL 线卡在低电平的恢复机制。
1. 功能背景
- 问题场景:
在I2C总线通信中,若某个设备故障导致 SDA(数据线) 或 SCL(时钟线) 被持续拉低(Stuck at LOW),总线将无法正常通信。 - 核心功能:
DW_apb_i2c 提供 总线清除(Bus Clear) 机制,尝试恢复总线,避免系统死锁。
2. SDA 线卡在低电平的恢复流程
(1) 触发条件
- SDA 被持续拉低:可能是从设备未释放总线(如未完成数据传输)或硬件故障。
(2) 恢复步骤
主设备发送最多9个SCL时钟脉冲
- 目的:
为从设备提供机会完成未完成的操作(如发送剩余数据位或释放总线)。 - 时钟数依据:
I2C协议中,一个完整字节传输包含 8位数据 + 1位ACK/NACK,共9个时钟周期。 - 操作细节:
- 主设备在每个时钟脉冲期间尝试将SDA拉高(发送逻辑1)。
- 若检测到SDA恢复高电平,立即终止时钟发送并进入下一步。
- 目的:
若SDA在9个时钟内恢复
- 主设备发送STOP信号:
释放总线所有权,结束异常状态。 - 总线恢复正常:
后续可重新发起通信。
- 主设备发送STOP信号:
若SDA未在9个时钟内恢复
- 需硬件复位:
通过外部硬件复位信号强制重置总线及相关设备。
- 需硬件复位:
(3) 流程图示意
1 | SDA卡低检测 |
3. SCL 线卡在低电平的恢复流程
(1) 触发条件
- SCL 被持续拉低:可能因电路故障(如设备短路)或时钟竞争导致。
(2) 恢复限制
- 无法通过软件恢复:
由于SCL是时钟线,主设备需控制SCL以生成恢复时钟,但若SCL被外部强制拉低,主设备无法覆盖。 - 唯一解决方案:
硬件复位总线或相关设备,强制释放SCL线。
(3) 流程图示意
1 | SCL卡低检测 |
4. 关键设计原理
(1) 为什么SDA可尝试恢复,而SCL不能?
- SDA恢复可行性:
- SDA是数据线,主设备可通过发送时钟脉冲,配合从设备完成操作或超时释放。
- I2C协议允许主设备在传输中插入额外时钟(类似时钟延展)。
- SCL恢复不可行性:
- SCL是时钟线,主设备需控制其高低电平以驱动通信。
- 若SCL被外部强制拉低,主设备无法生成时钟脉冲,失去控制权。
(2) 9个时钟脉冲的意义
- 覆盖最大未完成传输:
一个I2C字节(8位数据 + 1位ACK)最多需要9个时钟周期。 - 兼容协议完整性:
避免因发送过多时钟导致协议混乱(如误触发新传输)。
(3) 硬件复位的必要性
- 终极恢复手段:
当软件无法恢复时,强制重置硬件状态,清除总线锁定。 - 设计建议:
系统需提供可靠的硬件复位电路,确保在极端情况下恢复总线。
5. 实际应用注意事项
(1) 配置与使能
- 寄存器设置:
需确认DW_apb_i2c是否默认启用总线清除功能,或需配置相关寄存器(如中断使能、超时阈值)。 - 中断处理:
总线卡低事件可能触发中断,需在驱动程序中实现恢复流程。
(2) 调试与验证
- 模拟故障场景:
可强制拉低SDA/SCL,观察主设备是否按预期发送时钟或触发复位。 - 逻辑分析仪捕获:
验证9个时钟脉冲的生成及STOP信号的发送。
(3) 硬件设计
- 复位电路冗余:
确保硬件复位信号可覆盖I2C控制器及关联设备。 - 上拉电阻选择:
适当减小上拉电阻值可加快总线释放速度,但需平衡功耗。
6. 总结
- SDA恢复:软件驱动,发送最多9个时钟脉冲,尝试拉高SDA。
- SCL恢复:只能硬件复位,无软件干预手段。
- 核心价值:提升总线鲁棒性,防止单点故障导致系统瘫痪。
如需进一步分析具体配置或代码实现,可结合手册中的 “Programming Flow for SCL and SDA Bus Recovery”(第304页)进行深入研究。
本文作者:
ICXNM-ZLin
本文链接: https://talent-tudou.github.io/2025/02/17/外设/DW-apb-i2c之总线清除功能/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!
本文链接: https://talent-tudou.github.io/2025/02/17/外设/DW-apb-i2c之总线清除功能/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!