记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法

这个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。。。奇怪,我这一直能复现的啊。。。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值