本帖最后由 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; } |
就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 1 1111 1111 1111 1111
就是这个 uint16_t MemAddress ,这个最大支持 16位的地址(也就是两个字节),但是 24c1024 需要17位地址(这两个字节的地址不够用),到时就会造成读写错误
24c1024 的地址范围,二进制表示: 1 1111 1111 1111 1111
1、地址范围是0-0xFFFF
2、在写入硬件地址是,可以选择区域地址。硬件手册详细说明了。
24c1024 每页是256字节,一共有512 页
24c1024 的最大地址范围是131072,如果从0开始那么就是 0-131071
二进制如下 :
哈哈哈,不管是页还是扇区,最终都会转化为地址,到时只是把这个地址转换为也或者扇区吧了,我在官方的底层函数的基础上已经改了,现在效果很好,现在读写完全没有问题了, 24c1024 的地址需要3个字节 24c04-24c512 的地址需要2个字节, 24c01-24c02 的地址需要一个字节
AT24Cxx系列的存储器确实不错。
start bit+device address+byte address.