打印
[STM32H7]

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

[复制链接]
344|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
duo点|  楼主 | 2023-12-11 09:30 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我想使用硬件I2C实现如下操作:

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

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

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

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

使用特权

评论回复
沙发
probedog| | 2023-12-11 11:25 | 只看该作者
在STM32H7的硬件抽象库(HAL库)中,HAL_I2C_Mem_Write函数的Size参数不应该设为0。这个参数表示要写入I2C设备的字节数,如果你试图写入0字节,那么I2C设备可能不会做出任何反应,因为这通常意味着没有数据要发送。

如果你尝试使用HAL_I2C_Mem_Write函数写入数据,但Size参数设为0,那么你应该检查你的代码以确保你传递了正确的字节数。

对于读取操作,一般来说,HAL_I2C_Mem_Read函数的Size参数也不应该为0。但是,读取操作的Size参数可能由你要读取的寄存器大小决定。例如,如果你正在尝试读取一个8位的寄存器,那么Size参数应该设为1。

使用特权

评论回复
板凳
香水城| | 2023-12-11 11:41 | 只看该作者
如果你基于i2c接口内存芯片就行访问时,若使用MEM_write或mem_read 函数时,是用不到size为0的情形的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

384

主题

1457

帖子

1

粉丝