蓝桥杯篇---串行EEPROMAT24C02
- 其他
- 2025-09-09 22:18:01

文章目录 前言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(); // 等待 ACK I2C_SendByte(addr); // 发送内存地址 I2C_WaitAck(); // 等待 ACK I2C_SendByte(data); // 发送数据 I2C_WaitAck(); // 等待 ACK I2C_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(); // 等待 ACK I2C_SendByte(addr); // 发送内存地址 I2C_WaitAck(); // 等待 ACK for (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 int sbit 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的读写。
蓝桥杯篇---串行EEPROMAT24C02由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“蓝桥杯篇---串行EEPROMAT24C02”
下一篇
相机模数转换