奏奏奏 发表于 2019-7-19 07:41:08

STM32访问I2C地址超出16位怎么处理?

比如说目前EEPROM我只敢用到AT24C512这样的,地址最多是65535,因为HAL库中地址最大只能是16位(65535)
现在需求变了需要增加存储数据量,我打算用上AT24CM02,但是不知道怎么处理,所以来论坛求助。谢谢!

maxtch 发表于 2019-7-23 12:17:32

奏奏奏 发表于 2019-7-22 15:22
谢谢,应该是之前其他回答里贴图出来的说明描述吧。

是的。你甚至可以理解成一片 AT24CM02 相当于占用四个连续地址的四片 AT24C512。

songshiqun2010 发表于 2019-7-19 09:15:02

本帖最后由 songshiqun2010 于 2019-7-19 09:17 编辑

static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Timeout, uint32_t Tickstart)

楼主说的是这个 DevAddress 只有16位吗?
这个是设备地址 一般是7或10位。数据地址是在数据段根据器件容量填充的。

https://www.stmcu.org.cn/module/forum/thread-621092-1-1.html

用这个pack应该能解决问题。

奏奏奏 发表于 2019-7-19 09:25:14

songshiqun2010 发表于 2019-7-19 09:15
static HAL_StatusTypeDef I2C_MasterRequestWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32 ...

我用的是这个函数:

        while(HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, CAN_ID_ADDR_in_24LCxx, I2C_MEMADD_SIZE_16BIT,ReadBuffer,1, 0xFFFFFFFF)!=HAL_OK)
        {
                HAL_IWDG_Refresh_with_reset(&hiwdg);
        }       

其中这个 I2C_MEMADD_SIZE_16BIT 是16位,这个参数还有一个 是 8位的

songshiqun2010 发表于 2019-7-19 09:27:29

如图

songshiqun2010 发表于 2019-7-19 09:30:41

奏奏奏 发表于 2019-7-19 09:25
我用的是这个函数:

        while(HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, CAN_ID_ADDR_in_24LCxx, I2C_M ...

没用过这个api,看来在下是答非所问了。:shutup:

す疯Ⅱ恒す 发表于 2019-7-19 09:46:27

更新协议稍微改一下代码,扩展位数就得了。看器件规格书。

奏奏奏 发表于 2019-7-19 09:56:11

す疯Ⅱ恒す 发表于 2019-7-19 09:46
更新协议稍微改一下代码,扩展位数就得了。看器件规格书。

好的,至少方向明确了。我试一下。谢谢!

Dandjinh 发表于 2019-7-19 15:49:35

本帖最后由 Dandjinh 于 2019-7-19 15:50 编辑

手册上有说,数据地址还是16位,最高两位是在设备地址的bit1,bit2。


发表于 2019-7-19 16:25:32

更换E2设备后,请按照I2C协议进行更新。像楼上截图所述,E2设备的地址会用两个字节表示。有的设备是通过设备地址加片内地址进行地址处理。

奏奏奏 发表于 2019-7-19 16:25:59

Dandjinh 发表于 2019-7-19 15:49
手册上有说,数据地址还是16位,最高两位是在设备地址的bit1,bit2。

好的,谢谢!值得参考:)
页: [1] 2
查看完整版本: STM32访问I2C地址超出16位怎么处理?