区块链技术博客
www.b2bchain.cn

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

这篇文章主要介绍了记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法的讲解,通过具体代码讲解7059并且分析了记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法的讲解的详细步骤与相关技巧,需要的朋友可以参考下

本文实例讲述了记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7059.html。具体如下:

这个BUG最早是在调教I2C驱动的OLED时发现的,当时网上查了半天,找到了一个解决方法,顺利完成了调试,结果这几天又调一个I2C设备。。。把这个BUG忘了,搞了一天也没结果。。。最后晚上的时候灵光一闪想了起来,立马就解决问题了,原帖找不到了,我就在这记录一下吧,省的又忘了。

BUG描述:STM32F1使用CubeMX生成工程后,I2C无论发送或接收都返回HAL_BUSY。
解决方案:修改i2c.c文件下的HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
修改方法如图
记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法

复现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。
产生问题的原因未知,逐步调试的结果:
记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法在这个函数中开始循环。
记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法跳出该循环后就到这里了
记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法
可问题是这个else对应的if已经进去过了。。。。。(见逐步调试的第一张图的第2567行,打断点后发现 I2C_WaitOnFlagUntilTimeout 函数返回的是HAL_ERROR,那么应该进的是第2581行才对,虽然最后结果没差。。。。)
总之,I2C的接收函数用不了,每次都返回HAL_BUSY,其他有关于I2C的函数都差不多,这里就不再做测试了。

修复该BUG后的测试结果:

0,0X58

可以看到,一切正常。

不知道这BUG的产生原因,按理来说时钟使能的顺序没多大问题,但就是用不了。。。。还请懂的大佬指点一二。


后记:把这个BUG分享给小伙伴后,小伙伴说没这BUG。。。奇怪,我这一直能复现的啊。。。

本文地址https://www.b2bchain.cn/7059.html

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 记录一次STM32f1使用CubeMX生成工程后无法使用I2C的BUG,附解决方法的讲解
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们