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

请教下,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个回答
wambob 回答时间: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

kelly-395249 回答时间: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 的地址需要一个字节
12下一页

所属标签

相似问题

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