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

STM32 HAL库 I2C读写函数使用

[复制链接]
NCVRLST 提问时间:2020-11-19 10:15 /
问题如下:使用HAL库读写从设备寄存器

从设备地址由两部分组成:Slave ID (0x8E)   和Offset(0x86),均已是写地址,读地址加1即可;
从设备寄存器地址也是两部分组成:如 Slave ID (0x01)   和Offset(0xFF)
向从设备寄存器写入数据的过程为(分两步):
ST > Device address 0x8E/w > ACK > 0x00 > ACK > Slave ID 0x01 > ACK > STOP
ST > Device address 0x86/w > ACK > Offset 0xFF > ACK > Data 0x45 > ACK > STOP
使用两次HAL_I2C_Mem_Write函数是否即可?
uint8_t RegVal = 0x01;
uint8_t Data = 0x45;
HAL_I2C_Mem_Write(&hi2c1, 0x8E, 0x00, I2C_MEMADD_SIZE_8BIT, &RegVal, 1, 1000)
HAL_I2C_Mem_Write(&hi2c1, 0x86, 0x01, I2C_MEMADD_SIZE_8BIT, &Data, 1, 1000)
向从设备寄存器写读取据的过程为(分两步):
ST > Device address 0x8E/w > ACK > 0x00 > ACK > Slave ID 0x01 > ACK > STOP
ST > Device address 0x86/w > ACK > Offset 0xFF > ACK > RST > Device address 0x87/r > ACK > 0xAC >  NACK > STOP

使用一次HAL_I2C_Mem_Read函数和一次HAL_I2C_Mem_Write是否即可?
uint8_t RegVal_1 = 0x01;
uint8_t * RegVal_2;
HAL_I2C_Mem_Write(&hi2c1, 0x8E, 0x00, I2C_MEMADD_SIZE_8BIT, &RegVal_1, 1, 1000)
HAL_I2C_Mem_Read(&hi2c1, 0x87, 0xFF, I2C_MEMADD_SIZE_8BIT, RegVal_2, 1, 1000)

收藏 评论4 发布时间:2020-11-19 10:15

举报

4个回答
小小超 回答时间:2020-11-23 11:54:30
还是用模拟I2C吧,简单还省事。。。。
老牛洋车 回答时间:2020-11-23 12:00:03
使用硬件I2C总觉得有点象隔靴搔痒,软件模拟I2C更直观。
pig141 回答时间:2020-11-24 08:22:48
~~~~~~~~~~~~~~
butterflyspring 回答时间:2020-11-30 12:00:23
能不能用关键看函数的功能是否和设备需要的时序是否匹配。这个函数原本是为了在EEPROM上应用的,当然EEPROM的时序是比较通用的一种。
另外大家说的也有道理,软件模拟I2C可以相对逻辑简单,调试方便,不用详细了解库函数中的细节以及芯片底层驱动原理,只要对照设备的时序就行。缺点就是少了一点兼容性,速度稍慢,占用CPU时间长一点点,而且一般只能做主设备。
硬件I2C的好处是操作速度快,占用CPU时间不多,而且兼容性好,主从都可以。缺点就是用户要了解底层硬件工作原理,库函数的应用方式和范围。
Hal_i2c_mem 说明.PNG

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版