早就听说STM32的硬件IIC不好用,我个人接触到的很多项目中也都是用模拟IIC来实现对应的操作,但是最近接触到的一个项目中的OLED是IIC接口,当然原本也是用的模拟IIC来实现的刷屏操作,因此效率真的是惨不忍睹。于是就萌生了改用硬件IIC的想法。
在改用硬件IIC的时候确实领略到了STM32硬件IIC的难啃,实际上最主要就是以下一个问题:
使用硬件STM32硬件IIC经常会遇到IIC驱动死掉的情况
注意这里是IIC驱动死掉,调用发送函数会返回失败,CPU是正常运行的。抓波形可以发现一开始有正常的IIC波形,但是马上就没有了。此时STM32的硬件IIC处于busy状态,导致其放弃了后续的IIC操作。我尝试下来只能通过对IIC外设复位来解决。
在调试好IIC外设后发现IIC的DMA也不是直接就能使用。主要问题在于最后的STOP信号丢失,抓波形发现主机最后没有发送STOP信号,该问题在我调用DMA发送函数发送成功后强制控制IIC的寄存器使其发送一个STOP信号后即可解决。
由于调试时间有限并没有研究太深入,欢迎大家来讨论。若有错误的地方也希望大家进行指正。
下面附上基于STM32F405的硬件IIC与DMA操作例程: