你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H7 I2C硬件HAL库HAL_I2C_Mem_Write的Size参数不能为0导致I2C无法读取

[复制链接]
Dark4444 提问时间:2023-12-10 18:42 / 已解决

我想使用硬件I2C实现如下操作:

写入设备地址(8位写地址)——写入寄存器地址(不产生STOP)——写入设备地址(8位从地址)——读取多个寄存器

使用F4系列单片机时,可以通过使用HAL_I2C_Mem_Write函数,并将其中的Size参数设置为零,然后调用读取函数实现。

但是H7的HAL库中HAL_I2C_Mem_Write的Size不能为0,即使修改HAL库,跳过Size检测部分,并且检测当Size为0时,在发出设备地址,寄存器地址后,重置I2C外设寄存器并退出函数,依然无法实现跟F4单片机同样的效果,通过逻辑分析仪查看,发现总线一直被占用,后续读取无法正常进行。

请问有没有别的方式实现我想要的效果。或者我只能使用寄存器直接操作。

收藏 评论6 发布时间:2023-12-10 18:42

举报

6个回答
butterflyspring 最优答案 回答时间:2023-12-11 09:41:21
有現成的读函数,能实现你说的功能。 你用的是写函数,当然size 不能为0了。至于硬件怎样动作,还要看参考手册


HAL_I2C_Mem_Readxxx





xmshao 回答时间:2023-12-11 11:10:27
不知你在访问什么器件,为什么要基于size为0来操作呢。我找了H743开发板,使用Imem_write函数和mem_read函数对24c芯片就行随机读写验证是没有问题的。基本做法就是先选择个24cxx片内某个地址写几个数据,然后再读出来。
xmshao 回答时间:2023-12-11 11:23:09

你的这个需求是很常规的。

不论I2C 读还是写,涉及到额外内存地址或寄存器地址指定时 都有个写过程。

无须基于size=0做操作。

上午我找H743开发板 利用H7系列I2C库函数对24系列芯片进行读写访问,没有什么不畅。

image.png

Dark4444 回答时间:2023-12-11 13:47:13

butterflyspring 发表于 2023-12-11 09:41
有現成的读函数,能实现你说的功能。 你用的是写函数,当然size 不能为0了。至于硬件怎样动作,还要看参考 ...

谢谢

Dark4444 回答时间:2023-12-11 13:47:51

xmshao 发表于 2023-12-11 11:23
你的这个需求是很常规的。</p>
<p>不论I2C 读还是写,涉及到额外内存地址或寄存器地址指定时 都有个写过程。

[md]因为F4可以所以就用的size=0操作了。谢谢你。

xmshao 回答时间:2023-12-11 16:09:57

Dark4444 发表于 2023-12-11 13:47
因为F4可以所以就用的size=0操作了。谢谢你。

嗯。

我也看到了。后面系列这个地方不接受size=0这个选项,直接报错退出。

其实也的确不需要。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版