hpdell 发表于 2015-12-4 11:46:14

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

本帖最后由 hpdell 于 2015-12-4 11:54 编辑

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

/**
* @briefMaster sends target device address followed by internal memory address for write request.
* @paramhi2c: pointer to a I2C_HandleTypeDef structure that contains
*         the configuration information for I2C module
* @paramDevAddress: Target device address
* @paramMemAddress: Internal memory address   此处的地址范围 是16, ?????????????
* @paramMemAddSize: Size of internal memory address
* @paramTimeout: 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;
}

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 的地址范围,二进制表示: 11111 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 的地址范围,二进制表示: 11111 1111 1111 1111

发表于 2015-12-4 15:46:30

1024是分2个区域,这个要仔细看手册。
1、地址范围是0-0xFFFF
2、在写入硬件地址是,可以选择区域地址。硬件手册详细说明了。

Paderboy 发表于 2015-12-4 16:07:10

来学习了

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 的最大地址范围是131072,如果从0开始那么就是 0-131071   
二进制如下 :




kelly-395249 发表于 2015-12-6 09:55:41

我没看1024的手册, 不过看了6楼的回答, 觉得有道理, 楼主有没有用过24C02 和24C04/08/16, 地址都是一个字节, 理论只能读256字节范围, 可以却能读写24C16, 24C16有 256*8=2048的字节数哦:lol

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 的地址需要一个字节
页: [1] 2
查看完整版本: 请教下,cube hal 库 的 I2C 读写 24c1024 ???