蓝桥杯篇---串行EEPROM AT24C02
文章目录
- 前言
- 1. 写字节时序(Byte Write)
- 特点
- 时序步骤
- 1.起始条件(Start Condition)
- 2.发送设备地址(Device Address)
- 3.发送内存地址(Word Address)
- 4.发送数据(Data)
- 5.停止条件(Stop Condition)
- 时序图
- 代码示例
- 2. 写页面时序(Page Write)
- 特点
- 时序步骤
- 1.起始条件(Start Condition)
- 2.发送设备地址(Device Address)
- 3.发送内存地址(Word Address)
- 4.发送数据(Data)
- 5.停止条件(Stop Condition):
- 注意事项:
- 时序图:
- 代码示例:
- 3. 写字节时序 vs 写页面时序
- 4. AT24C02 简介
- 5. I2C 接口
- 6. AT24C02 操作
- 写操作
- 读操作
- 7. 示例代码
- 8. 代码说明
- 9. 注意事项
- 总结
前言
本文仅仅简单介绍了写字节时序、写页面时序以及串行EEPROM AT24C02的读写。
1. 写字节时序(Byte Write)
特点
写字节时序允许每次向 AT24C02 写入一个字节的数据。
时序步骤
1.起始条件(Start Condition)
主机拉低 SDA 线,同时 SCL 为高电平。
2.发送设备地址(Device Address)
主机发送 7 位设备地址(AT24C02 的地址为 1010xxx,其中 xxx 由 A2、A1、A0 引脚决定)。
第 8 位为写模式(0)。
AT24C02 回应一个 ACK(拉低 SDA)。
3.发送内存地址(Word Address)
主机发送8 位的内存地址(0x00 到 0xFF)。
**AT24C02 **回应一个 ACK。
4.发送数据(Data)
主机发送 8 位数据。
AT24C02 回应一个 ACK。
5.停止条件(Stop Condition)
主机拉高 SDA 线,同时 SCL 为高电平。
时序图
Start | Device Address (Write) | ACK | Word Address | ACK | Data | ACK | Stop
代码示例
void AT24C02_WriteByte(uchar addr, uchar data) {I2C_Start(); // 起始条件I2C_SendByte(AT24C02_ADDR); // 发送设备地址(写模式)I2C_WaitAck(); // 等待 ACKI2C_SendByte(addr); // 发送内存地址I2C_WaitAck(); // 等待 ACKI2C_SendByte(data); // 发送数据I2C_WaitAck(); // 等待 ACKI2C_Stop(); // 停止条件
}
2. 写页面时序(Page Write)
特点
写页面时序允许一次向 AT24C02 写入多个字节(最多 8 字节)。AT24C02 的页大小为 8 字节。
时序步骤
1.起始条件(Start Condition)
主机拉低 SDA 线,同时 SCL 为高电平。
2.发送设备地址(Device Address)
主机发送 7 位设备地址(AT24C02 的地址为 1010xxx)。
第 8 位为写模式(0)。
AT24C02 回应一个 ACK。
3.发送内存地址(Word Address)
主机发送 8 位的内存地址(0x00 到 0xFF)。
AT24C02 回应一个 ACK。
4.发送数据(Data)
主机连续发送多个字节数据(最多 8 字节)。
每发送一个字节,AT24C02 回应一个 ACK。
5.停止条件(Stop Condition):
主机拉高 SDA 线,同时 SCL 为高电平。
注意事项:
-
页边界:如果写入的数据跨越页边界(例如从地址 0x07 开始写入 8 字节),超出部分会回绕到页的开头(覆盖前面的数据)。
-
写入时间:每次写入后,AT24C02 需要一定时间(典型值为 5ms)来完成内部写操作。
时序图:
Start | Device Address (Write) | ACK | Word Address | ACK | Data1 | ACK | Data2 | ACK | … | DataN | ACK | Stop
代码示例:
void AT24C02_WritePage(uchar addr, uchar *data, uchar len) {uchar i;I2C_Start(); // 起始条件I2C_SendByte(AT24C02_ADDR); // 发送设备地址(写模式)I2C_WaitAck(); // 等待 ACKI2C_SendByte(addr); // 发送内存地址I2C_WaitAck(); // 等待 ACKfor (i = 0; i < len; i++) { // 发送多个字节数据I2C_SendByte(data[i]);I2C_WaitAck();}I2C_Stop(); // 停止条件
}
3. 写字节时序 vs 写页面时序
- 写字节时序:适合单字节写入操作,简单易用。
- 写页面时序:适合批量写入操作,效率更高,但需注意页边界问题。
在实际应用中,可以根据需求选择合适的写操作模式。如果需要写入大量数据,建议使用写页面时序以提高效率。
4. AT24C02 简介
AT24C02 是 Atmel 公司生产的 **2Kbit(256x8)**串行 EEPROM,采用 I2C 接口通信。它具有以下特点:
- 容量:256 字节
- 接口:I2C 总线
- 工作电压:1.8V 到 5.5V
- 写保护:支持硬件写保护
- 寿命:100 万次写循环
- 数据保存:100 年
5. I2C 接口
I2C 是一种两线制串行通信协议,包含:
- SCL:时钟线
- SDA:数据线
I2C 设备有唯一的地址,AT24C02 的地址为 1010xxx,其中 xxx 由 A2、A1、A0 引脚决定。若这些引脚接地,地址为 0xA0(写)和 0xA1(读)。
6. AT24C02 操作
写操作
- 发送起始条件
- 发送设备地址(写模式)
- 发送要写入的内存地址
- 发送数据
- 发送停止条件
读操作
- 发送起始条件
- 发送设备地址(写模式)
- 发送要读取的内存地址
- 发送起始条件
- 发送设备地址(读模式)
- 读取数据
- 发送停止条件
7. 示例代码
以下代码展示了如何在 IAP15F2K61S2 上使用 AT24C02。
#include <reg52.h>#define uchar unsigned char
#define uint unsigned intsbit SDA = P2^0; // I2C 数据线
sbit SCL = P2^1; // I2C 时钟线#define AT24C02_ADDR 0xA0 // AT24C02 设备地址void I2C_Delay() {uchar i;for (i = 0; i < 10; i++);
}void I2C_Start() {SDA = 1;SCL = 1;I2C_Delay();SDA = 0;I2C_Delay();SCL = 0;
}void I2C_Stop() {SDA = 0;SCL = 1;I2C_Delay();SDA = 1;I2C_Delay();
}void I2C_Ack() {SDA = 0;SCL = 1;I2C_Delay();SCL = 0;SDA = 1;
}void I2C_NoAck() {SDA = 1;SCL = 1;I2C_Delay();SCL = 0;
}bit I2C_WaitAck() {SDA = 1;SCL = 1;I2C_Delay();if (SDA) {SCL = 0;return 0;} else {SCL = 0;return 1;}
}void I2C_SendByte(uchar byte) {uchar i;for (i = 0; i < 8; i++) {SDA = (byte & 0x80) ? 1 : 0;SCL = 1;I2C_Delay();SCL = 0;byte <<= 1;}
}uchar I2C_ReadByte() {uchar i, byte = 0;for (i = 0; i < 8; i++) {SCL = 1;I2C_Delay();byte = (byte << 1) | SDA;SCL = 0;I2C_Delay();}return byte;
}void AT24C02_WriteByte(uchar addr, uchar data) {I2C_Start();I2C_SendByte(AT24C02_ADDR);I2C_WaitAck();I2C_SendByte(addr);I2C_WaitAck();I2C_SendByte(data);I2C_WaitAck();I2C_Stop();
}uchar AT24C02_ReadByte(uchar addr) {uchar data;I2C_Start();I2C_SendByte(AT24C02_ADDR);I2C_WaitAck();I2C_SendByte(addr);I2C_WaitAck();I2C_Start();I2C_SendByte(AT24C02_ADDR | 0x01);I2C_WaitAck();data = I2C_ReadByte();I2C_NoAck();I2C_Stop();return data;
}void main() {uchar data = 0x55;uchar read_data;AT24C02_WriteByte(0x00, data); // 写入数据read_data = AT24C02_ReadByte(0x00); // 读取数据while (1);
}
8. 代码说明
- I2C_Start() 和 I2C_Stop():起始和停止条件。
- I2C_SendByte() 和 I2C_ReadByte():发送和接收字节。
- AT24C02_WriteByte() 和 AT24C02_ReadByte():写入和读取 AT24C02 数据。
9. 注意事项
时序:确保 I2C 时序准确。
地址:确认 AT24C02 的设备地址正确。
延时:适当调整延时以满足时序要求。
通过以上代码,你可以在 IAP15F2K61S2 上实现对 AT24C02 的读写操作。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了写字节时序、写页面时序以及串行EEPROM AT24C02的读写。