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

请教下,cube hal 库 的 I2C 读写 24c1024 ???

[复制链接]
hpdell 提问时间:2015-12-4 11:46 /
本帖最后由 hpdell 于 2015-12-4 11:54 编辑

请教下,使用 hal 的库函数进行 I2C器件的 AT24C1024 器件的读写,这个读写地址 需要24位,而 hal 库最大支持 16位,那么是不是需要人为的进行修改 这个读写地址 才行  ???

/**
  * @brief  Master sends target device address followed by internal memory address for write request.
  * @param  hi2c: pointer to a I2C_HandleTypeDef structure that contains
  *         the configuration information for I2C module
  * @param  DevAddress: Target device address
  * @param  MemAddress: Internal memory address   此处的地址范围 是16, ?????????????
  * @param  MemAddSize: Size of internal memory address
  * @param  Timeout: Timeout duration
  * @retval HAL status
  */
static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout)
{
  /* Generate Start */
  hi2c->Instance->CR1 |= I2C_CR1_START;

  /* Wait until SB flag is set */
  if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_SB, RESET, Timeout) != HAL_OK)
  {
    return HAL_TIMEOUT;
  }

  /* Send slave address */
  hi2c->Instance->DR = I2C_7BIT_ADD_WRITE(DevAddress);

  /* Wait until ADDR flag is set */
  if(I2C_WaitOnMasterAddressFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, Timeout) != HAL_OK)
  {
    if(hi2c->ErrorCode == HAL_I2C_ERROR_AF)
    {
      return HAL_ERROR;
    }
    else
    {
      return HAL_TIMEOUT;
    }
  }

  /* Clear ADDR flag */
  __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

  /* Wait until TXE flag is set */
  if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
  {
    return HAL_TIMEOUT;
  }

  /* If Memory address size is 8Bit */
  if(MemAddSize == I2C_MEMADD_SIZE_8BIT)
  {
    /* Send Memory Address */
    hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
  }
  /* If Memory address size is 16Bit */
  else
  {
    /* Send MSB of Memory Address */
    hi2c->Instance->DR = I2C_MEM_ADD_MSB(MemAddress);

    /* Wait until TXE flag is set */
    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TXE, RESET, Timeout) != HAL_OK)
    {
      return HAL_TIMEOUT;
    }

    /* Send LSB of Memory Address */
    hi2c->Instance->DR = I2C_MEM_ADD_LSB(MemAddress);
  }

  return HAL_OK;
}

收藏 评论13 发布时间:2015-12-4 11:46

举报

13个回答
wamcncn 回答时间:2015-12-4 12:34:45
16位 24位地址怎么说
chifen 回答时间:2015-12-4 14:02:38
可能你理解错了, 16位地址可以 读取到64K内容
hpdell 回答时间:2015-12-4 15:36:44
本帖最后由 hpdell 于 2015-12-4 15:38 编辑
wambob 发表于 2015-12-4 12:34
16位 24位地址怎么说

就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 1  1111 1111 1111 1111
hpdell 回答时间:2015-12-4 15:39:08
chifen 发表于 2015-12-4 14:02
可能你理解错了, 16位地址可以 读取到64K内容

就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 1  1111 1111 1111 1111
废鱼 回答时间:2015-12-4 15:46:30
1024是分2个区域,这个要仔细看手册。
1、地址范围是0-0xFFFF
2、在写入硬件地址是,可以选择区域地址。硬件手册详细说明了。
Paderboy 回答时间:2015-12-4 16:07:10
来学习了
STMCU-Logo.png
hpdell 回答时间:2015-12-4 20:13:48
本帖最后由 hpdell 于 2015-12-4 20:16 编辑
安 发表于 2015-12-4 15:46
1024是分2个区域,这个要仔细看手册。
1、地址范围是0-0xFFFF
2、在写入硬件地址是,可以选择区域地址。硬 ...

24c1024 每页是256字节,一共有512 页


24c1024.png

24c1024 的最大地址范围是131072,如果从0开始那么就是 0-131071   
二进制如下 :


24c1024-2.png

123456Kelly 回答时间:2015-12-6 09:55:41
我没看1024的手册, 不过看了6楼的回答, 觉得有道理, 楼主有没有用过24C02 和24C04/08/16, 地址都是一个字节, 理论只能读256字节范围, 可以却能读写24C16, 24C16有 256*8=2048的字节数哦
hpdell 回答时间:2015-12-6 11:31:11
kelly-395249 发表于 2015-12-6 09:55
我没看1024的手册, 不过看了6楼的回答, 觉得有道理, 楼主有没有用过24C02 和24C04/08/16, 地址都是一个 ...

哈哈哈,不管是页还是扇区,最终都会转化为地址,到时只是把这个地址转换为也或者扇区吧了,我在官方的底层函数的基础上已经改了,现在效果很好,现在读写完全没有问题了, 24c1024 的地址需要3个字节 24c04-24c512 的地址需要2个字节, 24c01-24c02 的地址需要一个字节
zhangdaijin 回答时间:2015-12-7 08:43:54
                    路过一下
废鱼 回答时间:2015-12-7 15:25:22
楼主注意看一下设备地址介绍。最后以为是读写地址,倒数第二位是区域地址。1024由2个区域组成,每个区域是0-0xFFFF。
looven 回答时间:2018-6-14 15:55:47
本帖最后由 looven 于 2018-6-14 16:03 编辑

AT24Cxx系列的存储器确实不错。
butterflyspring 回答时间:2018-6-14 16:04:42
分清除是是device address还是byte address(数据),你说的24为,很可能只是物理地址byte address
start bit+device address+byte address.

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版