请问cube hal库的I2C读写24c1024?

2019-07-14 14:57发布



请教下,使用 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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
yuxiangxyz
1楼-- · 2019-07-14 21:38
 精彩回答 2  元偷偷看……
7vyydyfwef
2楼-- · 2019-07-14 22:08
sfafa 发表于 1970-1-1 08:00

本帖最后由 hpdell 于 2015-12-4 15:38 编辑

就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 1  1111 1111 1111 1111
7vyydyfwef
3楼-- · 2019-07-14 22:14
lq544 发表于 1970-1-1 08:00

就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 1  1111 1111 1111 1111
TOPCB
4楼-- · 2019-07-15 03:16
1024是分2个区域,这个要仔细看手册。
1、地址范围是0-0xFFFF
2、在写入硬件地址是,可以选择区域地址。硬件手册详细说明了。
Oo一笑
5楼-- · 2019-07-15 04:21
来学习了
7vyydyfwef
6楼-- · 2019-07-15 09:57
 精彩回答 2  元偷偷看……

一周热门 更多>