|
发表于 2020-5-5 13:41:20
|
显示全部楼层
STM32的硬件I2C没有BUG.出问题主要是开发人员对I2C总线的软硬件设计有误区.相对于其他的SCI接口,I2C是个很另类的东西,其差异主要体现在两个地方:
1)I2C没有总线超时机制,一旦出现异常(设备软硬件自身问题或外部强干扰),它自己无法恢复.
2)I2C从设备的读写协议没有固定标准,不同的从机设备,协议各式各样.即使硬件I2C,其链路层的协议,也是由软件完成(START,STOP,ACK,NACK).
I2C的优点很多,缺点也特别明显,本质上不可靠,通信效率低下.如果设计的产品对可靠性要求高,尽量不用I2C.即使是模拟I2C也会出问题.如果要求速率高,用SPI,速率没要求,用SMB.
我曾经做了一个验证项目,STM32F429,一路硬件I2C,同时带EEPROM,5点触摸屏幕,陀螺仪,光感测距芯片.软件环境是FreeRtos+STemWin,I2C读写任务优先级很低.如果用原生态HAL库,10秒内总线必挂死.软件验证开发分成两个方向:1)用寄存器库重写I2C接口函数,牺牲读写效率和可移植性,让I2C总线不再挂死.2)直接用HAL库,允许挂死,加保护性代码以便恢复总线.对于普通的产品,上述任何一个措施都可以胜任.如果关键代码二者合并再配合上硬件设计,即使人为快速短路SCL和SDA造成严重故障(模拟外界强干扰),也可以恢复正常工作.
软件模拟I2C在产品设计上不可取,是自欺欺人的做法.比如人为的快速短路SCL和SDA,照样挂死总线.把I2C协议以及特定芯片的硬件I2C模块资料看明白,是解决问题的正路. |
|