OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5370|回复: 4

HAL库下I2C总线使用中遇到的问题

[复制链接]

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
发表于 2020-12-7 11:36:00 | 显示全部楼层 |阅读模式
一直有STM32的I2C硬件使用存在BUG的说法,很多人推荐软件模拟I2C总线。但本人今天试着用HAL的I2C函数读写24C256发现的情况如下:
在400kHZ时钟下用HAL库函数HAL_I2C_Mem_Read及HAL_I2C_Mem_Read_IT读取事先写入存储器10个字节的数据,每次都是成功的。用一个定时器对读函数运行时间计时,结果测得用阻色方式的HAL_I2C_Mem_Read耗时324uS,而用中断方式的HAL_I2C_Mem_Read_IT耗时3uS,但是他们的数据都读对了,照理说读器件的时间应该是一样的才对啊,HAL_I2C_Mem_Read_IT应该是提前返回了,但缓冲区的数据居然是正确的就弄不清怎么回事了。还有个HAL_I2C_Mem_Read_DMA函数也进行了试验,但函数死锁没有正常返回。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
 楼主| 发表于 2020-12-7 22:06:22 | 显示全部楼层
更正一下,上午说的HAL_I2C_Mem_Read_DMA运行死锁是因为设置不当造成的。
回复 支持 反对

使用道具 举报

21

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2017-4-1
在线时间
73 小时
 楼主| 发表于 2020-12-8 18:42:31 | 显示全部楼层
经过两天的试验,基本弄明白了一些。
HAL_I2C_Mem_Read()函数是阻塞方式读取数据,一直等到读完全部数据才返回;
HAL_I2C_Mem_Read_IT()函数执行时间大约2uS就返回了,但此时I2C操作并未完成;
HAL_I2C_Mem_Read_DMA函数执行时间大约104uS就返回了,但此时I2C操作并未完成。
对于后两个函数的好处就是可以让CPU执行其他任务,节省等待时间,但此时读取数据是不正确的。当I2C读操作完成时,程序会执行回调函数HAL_I2C_MemRxCpltCallback(),只要在该函数内置一个标志或者发送其他同步信号,就可以正确访问被读取的数据了。
写数据的情况也是类似,只不过回调函数为HAL_I2C_MemTxCpltCallback()。
总的来说,虽然以前对STM32的I2C功能有不好的评价,但下STM32CubeMX的支持下,读写EEPROM还是感到很方便,可靠情也很不错。
回复 支持 反对

使用道具 举报

13

主题

171

帖子

0

精华

高级会员

Rank: 4

积分
809
金钱
809
注册时间
2018-12-19
在线时间
166 小时
发表于 2020-12-8 23:11:25 | 显示全部楼层
说ST8或32的I2C有问题的都是自己程序有问题,我从没遇到过问题。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2021-10-10
在线时间
1 小时
发表于 2021-10-12 11:13:26 | 显示全部楼层
我用的F103,硬件IIC,调用HAL库里面的几个读写函数都有点问题,返回值都是HAL_BUSY,示波器点SCL和SDA都是常高,僵住了。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 19:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表