这个BUG最早是在调教I2C驱动的OLED时发现的,当时网上查了半天,找到了一个解决方法,顺利完成了调试,结果这几天又调一个I2C设备。。。把这个BUG忘了,搞了一天也没结果。。。最后晚上的时候灵光一闪想了起来,立马就解决问题了,原帖找不到了,我就在这记录一下吧,省的又忘了。
BUG描述:STM32F1使用CubeMX生成工程后,I2C无论发送或接收都返回HAL_BUSY。
解决方案:修改i2c.c文件下的HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
修改方法如图
复现BUG: 软硬件环境:
CubeMX V5.6.1
STM32CubeF1 Firmware Package V1.8.0
Keil μVision V5.25.3.0
STM32F103VCT6最小系统板:I2C1、USART2
I2C设备:BMP280:设备地址:0xEC、设备ID在寄存器的地址:0xD0、设备ID:0x58
测试代码:
uint8_t data=0;
uint8_t temp=0;
while (1)
{
//仅读取设备ID并通过串口打印
temp=HAL_I2C_Mem_Read(&hi2c1,ADDR,0xd0,1,&data,1,HAL_MAX_DELAY);
printf("%d,%#X",temp,data);
data=0;
temp=0;
HAL_Delay(1000);
}
测试结果:
2,0
可以看到并没有读取出设备ID,且函数返回2,即HAL_BUSY。
产生问题的原因未知,逐步调试的结果:
在这个函数中开始循环。
跳出该循环后就到这里了
可问题是这个else对应的if已经进去过了。。。。。(见逐步调试的第一张图的第2567行,打断点后发现 I2C_WaitOnFlagUntilTimeout 函数返回的是HAL_ERROR,那么应该进的是第2581行才对,虽然最后结果没差。。。。)
总之,I2C的接收函数用不了,每次都返回HAL_BUSY,其他有关于I2C的函数都差不多,这里就不再做测试了。
修复该BUG后的测试结果:
0,0X58
可以看到,一切正常。
不知道这BUG的产生原因,按理来说时钟使能的顺序没多大问题,但就是用不了。。。。还请懂的大佬指点一二。
后记:把这个BUG分享给小伙伴后,小伙伴说没这BUG。。。奇怪,我这一直能复现的啊。。。