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

[复制链接]
1553|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的情形的。
79236657684e6d3a9f.png
Pulitzer 发表于 2024-8-11 07:22 | 显示全部楼层

通孔(THT)和表面贴装(SMT)
童雨竹 发表于 2024-8-11 09:18 | 显示全部楼层

首先是进行按比例和具体的施胶量进行混合操作
Wordsworth 发表于 2024-8-11 10:21 | 显示全部楼层

产生较强的阻尼效果
Clyde011 发表于 2024-8-11 11:24 | 显示全部楼层

然后使用铣削工具将孔与铜一起切成两半。
公羊子丹 发表于 2024-8-11 12:17 | 显示全部楼层

该电容可以存储高达8KV的电位
万图 发表于 2024-8-11 13:20 | 显示全部楼层

设置测试负载,测试负载应该符合电源的规格要求
Uriah 发表于 2024-8-11 14:23 | 显示全部楼层

类似于IC的安装方式。
帛灿灿 发表于 2024-8-11 16:19 | 显示全部楼层

具有一定的抗不平衡能力,对电路对称性要求不很严格;适应的功率范围较大,从几十瓦到千瓦都可以;开关管耐压要求较低;电路成本比全桥电路低等。
Bblythe 发表于 2024-8-11 17:22 | 显示全部楼层

切割板边以形成一系列半孔
周半梅 发表于 2024-8-11 19:18 | 显示全部楼层

从电路原理图上看,反激式与正激式很相象,表面上只是变压器同名端的区别,但电路的工作方式不同,D3、N3的作用也不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

546

主题

2387

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部