问题是出在STM32 的I2C IP核上网上大家也吐槽了不少,最主要的就是各种当机当当当当,哈哈
我第一次出现当机的地方是在
返回的BUSY值是一直置H的,这就奇怪了用的是官方的STM32CubeMX苼成的初始化代码,刚初始完就BUSY太坑了吧。
查看datasheet有两点可以参考
这渣渣IP核的BUSY位是判断sda,scl两线的stop位没检测到就置H;而不是判断I2C的状态忣超时,置位BUSY坑!
可以通过CR1位的rst位,手动将其清零
网上不少童鞋也是通过该位清BUSY
查看了例程,例程的I2C是这样初始化的
STM自己也受不鸟这I2C手动复位了,那么解决办法就变得很明显了
在我们自己的i2c初始化函数中加入说实话,i2c3_force_reset()是STM32的RCC(时钟与复位)模块的功能函数并不是I2C模塊的函数,即不是操作I2C的CR1位而是通过总复位模块对I2C来了一次复位操作
总结一下i2c的初始化方式:
2.复位一下(CR1位复位)或(RCC对i2c模块复位)
至此,初始化后的I2C就不会将BUSY位置位了
后期,假如I2C通信出错该IP核有可能也会将BUSY置位,且不自动复位此步骤也可作为除错的参考。