本文将介绍我在I2C通信中遇到的一个故障案例。
如下图所示,通过I2C通信连接存储器ABC1与存储器ABC2,并在执行写操作后立即执行读操作。结果显示,ABC1通信正常,但ABC2通信未能成功。原因在于tBUF(开始新传输前总线必须保持空闲的时间)的最小值存在差异。
ABC1 tBUF = 1.2μs
ABC2 tBUF = 4.7μs
针对此情况,我们采取了在执行写操作后等待 5μs 再执行读操作的措施。
I2C总线规范 UM10204的 tBUF 时间
Standard-mode
Fast-mode
Fast-mode Plus
4.7μs
1.3μs
0.5μs
根本原因在于,未查阅规格书及数据手册,就错误地认为标准模式下ABC1为1.2μs,因此ABC2也应为1.2μs。
建议大家不要像我这样误以为I2C通信都相同,而应仔细确认数据手册的规格。此外,如果MCU和HAL支持时钟拉伸功能,建议使用该功能。
