打印
[STM32H7]

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

[复制链接]
740|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的情形的。

使用特权

评论回复
地板
Pulitzer| | 2024-8-11 07:22 | 只看该作者

通孔(THT)和表面贴装(SMT)

使用特权

评论回复
5
童雨竹| | 2024-8-11 09:18 | 只看该作者

首先是进行按比例和具体的施胶量进行混合操作

使用特权

评论回复
6
Wordsworth| | 2024-8-11 10:21 | 只看该作者

产生较强的阻尼效果

使用特权

评论回复
7
Clyde011| | 2024-8-11 11:24 | 只看该作者

然后使用铣削工具将孔与铜一起切成两半。

使用特权

评论回复
8
公羊子丹| | 2024-8-11 12:17 | 只看该作者

该电容可以存储高达8KV的电位

使用特权

评论回复
9
万图| | 2024-8-11 13:20 | 只看该作者

设置测试负载,测试负载应该符合电源的规格要求

使用特权

评论回复
10
Uriah| | 2024-8-11 14:23 | 只看该作者

类似于IC的安装方式。

使用特权

评论回复
11
帛灿灿| | 2024-8-11 16:19 | 只看该作者

具有一定的抗不平衡能力,对电路对称性要求不很严格;适应的功率范围较大,从几十瓦到千瓦都可以;开关管耐压要求较低;电路成本比全桥电路低等。

使用特权

评论回复
12
Bblythe| | 2024-8-11 17:22 | 只看该作者

切割板边以形成一系列半孔

使用特权

评论回复
13
周半梅| | 2024-8-11 19:18 | 只看该作者

从电路原理图上看,反激式与正激式很相象,表面上只是变压器同名端的区别,但电路的工作方式不同,D3、N3的作用也不同。

使用特权

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

本版积分规则

440

主题

1669

帖子

1

粉丝