AT24C02是Microchip公司推出的2Kbit串行EEPROM存储芯片,采用I2C总线接口,在蓝桥杯单片机竞赛中属于高频考点。这颗仅有8个引脚的小芯片,内部组织为256x8位结构,支持百万次擦写操作和100年数据保存期限。
我当年第一次接触这颗芯片时,被它几个关键特性惊艳到了:
在蓝桥杯开发板上,AT24C02通常已预先连接好,但理解其硬件设计对故障排查至关重要:
c复制VCC ---- 3.3V/5V
GND ---- 接地
SCL ---- 单片机I2C时钟线(如P2.1)
SDA ---- 单片机I2C数据线(如P2.0)
A0-A2 -- 接地(地址配置)
WP ----- 接地(关闭写保护)
关键细节:上拉电阻取值4.7KΩ-10KΩ,过大会导致信号上升沿缓慢,过小则增加功耗。我曾因省略上拉电阻导致通信失败,这个坑新手必踩!
芯片的7位设备地址格式为:1010(A2)(A1)(A0)。当A0-A2全部接地时,写地址为0xA0,读地址为0xA1。若开发板上地址引脚接法不同,需相应调整代码。
以STC15系列单片机为例,典型IO模拟I2C时序如下:
c复制void I2C_Start() {
SDA = 1; // 特别注意:需先拉高SDA再拉高SCL
SCL = 1;
Delay5us();
SDA = 0;
Delay5us();
SCL = 0;
}
void I2C_WriteByte(uint8 dat) {
for(uint8 i=0; i<8; i++) {
SDA = (dat & 0x80) ? 1 : 0;
dat <<= 1;
SCL = 1;
Delay5us();
SCL = 0;
}
// 此处应添加ACK检查
}
血泪教训:时序中的延时5μs不是固定值,不同单片机时钟频率下需要调整。建议用逻辑分析仪抓取波形验证。
AT24C02支持16字节页写入,但有个易被忽略的特性——写入地址自动回卷。例如:
实测代码示例:
c复制void AT24C02_WritePage(uint8 addr, uint8 *buf) {
I2C_Start();
I2C_WriteByte(0xA0);
I2C_WriteByte(addr);
for(uint8 i=0; i<16; i++) {
I2C_WriteByte(buf[i]);
}
I2C_Stop();
Delay10ms(); // 必须等待写入完成
}
为防止数据异常,推荐采用以下校验策略:
CRC8计算优化代码:
c复制uint8 CRC8(uint8 *data, uint8 len) {
uint8 crc = 0x00;
while(len--) {
crc ^= *data++;
for(uint8 i=0; i<8; i++)
crc = (crc & 0x80) ? (crc<<1)^0x07 : crc<<1;
}
return crc;
}
利用芯片的字节写入特性,可设计掉电保存机制:
现象:读取数据与写入不一致
可能原因:
蓝桥杯常见考题形式:
以"电子密码锁"为例的典型实现:
c复制typedef struct {
uint8 pwd[6];
uint8 tryCount;
uint8 lockStatus;
} SystemConfig;
void SaveConfig() {
uint8 crc = CRC8((uint8*)&config, sizeof(config));
AT24C02_WriteBytes(0, (uint8*)&config, sizeof(config));
AT24C02_WriteByte(sizeof(config), crc);
}
void LoadConfig() {
AT24C02_ReadBytes(0, (uint8*)&config, sizeof(config));
uint8 crc = AT24C02_ReadByte(sizeof(config));
if(crc != CRC8((uint8*)&config, sizeof(config))) {
// 校验失败,恢复默认值
ResetConfig();
}
}
在最近一次带学生备赛时,我们发现AT24C02的页写入时序如果控制不当,会导致相邻地址数据被意外修改。后来通过以下方法彻底解决:
这个存储芯片虽然简单,但要想在竞赛中稳定发挥,建议至少完成以下测试用例:
最后分享一个硬件调试技巧:当怀疑I2C线路干扰时,可以用飞线直接连接单片机与AT24C02,跳过开发板上的排针和走线,往往能解决很多玄学问题。