一、AT24C04C芯片简介
AT24C04C是Atmel推出的4Kbit(512×8位)串行EEPROM存储器,采用I2C接口通信。
二、驱动代码解析
2.1 设备地址计算
static uint16_t Get_DeviceAddr(uint16_t memAddr) {
return AT24C04_I2C_ADDr | ((memAddr >> 7) & 0x02);
}
地址计算要点:
- 基础地址:0xA0(写操作)或0xA1(读操作)
- 通过memAddr的第8位(即地址值256分界)选择存储块
- 地址范围:
- 0x00-0xFF:使用块0(0xA0/0xA1)
- 0x100-0x1FF:使用块1(0xA2/0xA3)
2.2 单字节写操作
uint8_t AT24C04_WriteByte(uint16_t addr, uint8_t* data) {
uint16_t devAddr = Get_DeviceAddr(addr);
HAL_StatusTypeDef status = HAL_I2C_Mem_Write(&hi2c2, devAddr,
addr & 0xFF, I2C_MEMADD_SIZE_8BIT,
data, 1, 100);
// 等待写入完成
while(HAL_I2C_IsDeviceReady(&hi2c2, devAddr, 10, 100) != HAL_OK);
return (status == HAL_OK) ? AT24C04_OK : AT24C04_ERROR;
}
关键参数说明:
I2C_MEMADD_SIZE_8BIT:使用8位地址模式- 100ms超时设置
- 硬件等待写入完成机制
2.3 页写入操作
uint8_t AT24C04_WritePage(uint16_t addr, uint8_t *data, uint16_t length) {
// 检查页边界
uint16_t pageOffset = addr % PAGE_SIZE;
if((pageOffset + length) > PAGE_SIZE)
return AT24C04_ERROR;
// 执行页写入
HAL_StatusTypeDef status = HAL_I2C_Mem_Write(&hi2c2, devAddr,
addr & 0xFF, I2C_MEMADD_SIZE_8BIT,
data, length, 100);
// 等待写入完成...
}
重要注意事项:
- 页大小为16字节
- 单次写入不可跨页
- 建议从页起始地址开始写入
2.4 数据读取操作
void AT24C04_ReadBuffer(uint16_t addr, uint8_t *buffer, uint16_t length) {
uint16_t devAddr = Get_DeviceAddr(addr) | 0x01; // 读地址
HAL_I2C_Mem_Read(&hi2c2, devAddr,
addr & 0xFF, I2C_MEMADD_SIZE_8BIT,
buffer, length, 100);
}
读取特点:
- 支持单字节和连续读取
- 无需等待延时
- 自动递增地址
三、使用示例
3.1 单字节测试
void AT24C04_Test(void) {
uint8_t writeData = 'B';
uint8_t readData = 0;
uint16_t addr = 0x0100;
// 执行读写验证...
if(AT24C04_ReadByte(addr, &readData) == AT24C04_OK) {
RS485_SendData(&readData, 1);
}
}
3.2 页写入测试
void AT24C04_Test2(void) {
uint8_t testData[] = "hello world!\r\n";
uint8_t readBack[16] = {0};
AT24C04_WritePage(0x10, testData, 16);
AT24C04_ReadBuffer(0x10, readBack, 16);
}
3010

被折叠的 条评论
为什么被折叠?



