STM32硬件I2C驱动AT24C04C EEPROM

一、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);
}

地址计算要点:

  1. 基础地址:0xA0(写操作)或0xA1(读操作)
  2. 通过memAddr的第8位(即地址值256分界)选择存储块
  3. 地址范围:
    • 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);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值