我发现好多说i2c卡死的问题。
发现gd32,包括stm32都有一个问题,就是busy位的逻辑错误,属于硬件设计的问题,之前知道stm32有这bug,不幸的是gd32也有这毛病。
具体问题就是,按照i2c标准来说,一次完整的i2c总线操作必须由start位开始,stop位结束。如果大家都遵守这个规则,也就没问题了。但是实际应用中往往有外部设备不遵守这个规则,比如有的i2c主设备发出start位后,由于其它原因,导致传输中断,又没有发出stop信号,这种情况下就会导致gd32的i2c控制器的busy位一直为1.还有外部信号干扰,误出发产生了start信号,也会导致busy位出现。
gd32中,busy的产生条件就是捕捉到start信号就置位,即使设置的是i2c从设备,并且地址不匹配,它也会置位。
复位busy位可以通过调用i2c_software_reset_config(I2Cx, I2C_SRESET_SET)函数来复位。
但是在实际编写软件中,要怎么才能去实时监控这个busy什么时候是真正的超时呢。
各位大侠有没有解决办法。 |