请教下,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;
}
16位 24位地址怎么说 可能你理解错了, 16位地址可以 读取到64K内容 本帖最后由 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
chifen 发表于 2015-12-4 14:02
可能你理解错了, 16位地址可以 读取到64K内容
就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 11111 1111 1111 1111 1024是分2个区域,这个要仔细看手册。
1、地址范围是0-0xFFFF
2、在写入硬件地址是,可以选择区域地址。硬件手册详细说明了。 来学习了
本帖最后由 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
二进制如下 :
我没看1024的手册, 不过看了6楼的回答, 觉得有道理, 楼主有没有用过24C02 和24C04/08/16, 地址都是一个字节, 理论只能读256字节范围, 可以却能读写24C16, 24C16有 256*8=2048的字节数哦:lol kelly-395249 发表于 2015-12-6 09:55
我没看1024的手册, 不过看了6楼的回答, 觉得有道理, 楼主有没有用过24C02 和24C04/08/16, 地址都是一个 ...
哈哈哈,不管是页还是扇区,最终都会转化为地址,到时只是把这个地址转换为也或者扇区吧了,我在官方的底层函数的基础上已经改了,现在效果很好,现在读写完全没有问题了, 24c1024 的地址需要3个字节 24c04-24c512 的地址需要2个字节, 24c01-24c02 的地址需要一个字节
页:
[1]
2