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的产生原因,按理来说时钟使能的顺序没多大问题,但就是用不了,还请懂的大佬指点一二。