当前位置: 首页 > news >正文

蓝桥杯篇---串行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 为高电平

注意事项:

  1. 页边界:如果写入的数据跨越页边界(例如从地址 0x07 开始写入 8 字节),超出部分会回绕到页的开头(覆盖前面的数据)。

  2. 写入时间:每次写入后,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 写页面时序

  1. 写字节时序:适合单字节写入操作,简单易用。
  2. 写页面时序:适合批量写入操作,效率更高,但需注意页边界问题。

在实际应用中,可以根据需求选择合适的写操作模式。如果需要写入大量数据,建议使用写页面时序以提高效率。

4. AT24C02 简介

AT24C02 是 Atmel 公司生产的 **2Kbit(256x8)**串行 EEPROM,采用 I2C 接口通信。它具有以下特点:

  1. 容量:256 字节
  2. 接口:I2C 总线
  3. 工作电压:1.8V 到 5.5V
  4. 写保护:支持硬件写保护
  5. 寿命:100 万次写循环
  6. 数据保存:100 年

5. I2C 接口

I2C 是一种两线制串行通信协议,包含:

  1. SCL:时钟线
  2. SDA:数据线

I2C 设备有唯一的地址,AT24C02 的地址为 1010xxx,其中 xxx 由 A2、A1、A0 引脚决定。若这些引脚接地,地址为 0xA0(写)和 0xA1(读)。

6. AT24C02 操作

写操作

  1. 发送起始条件
  2. 发送设备地址(写模式)
  3. 发送要写入的内存地址
  4. 发送数据
  5. 发送停止条件

读操作

  1. 发送起始条件
  2. 发送设备地址(写模式)
  3. 发送要读取的内存地址
  4. 发送起始条件
  5. 发送设备地址(读模式)
  6. 读取数据
  7. 发送停止条件

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. 代码说明

  1. I2C_Start() 和 I2C_Stop():起始和停止条件。
  2. I2C_SendByte() 和 I2C_ReadByte():发送和接收字节。
  3. AT24C02_WriteByte() 和 AT24C02_ReadByte():写入和读取 AT24C02 数据。

9. 注意事项

时序:确保 I2C 时序准确。
地址:确认 AT24C02 的设备地址正确。
延时:适当调整延时以满足时序要求
通过以上代码,你可以在 IAP15F2K61S2 上实现对 AT24C02 的读写操作。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了写字节时序、写页面时序以及串行EEPROM AT24C02的读写。


http://www.mrgr.cn/news/90958.html

相关文章:

  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第七节】
  • CAS单点登录(第7版)2.规划
  • 大话风险-模型监测管理平台
  • 【VSCode】一键清理旧版本插件脚本(Mac或者Windows都可)
  • 前缀和、区间和的差别
  • QT 异步编程之多线程
  • MongoDB索引介绍
  • 使用 Vite + React 19 集成 Tailwind CSS 与 shadcn/ui 组件库完整指南
  • 蓝桥杯篇---8位 ADC/DAC转换芯片 PCF8591
  • 自动驾驶---如何打造一款属于自己的自动驾驶系统
  • 算法19(力扣244)反转字符串
  • aws(学习笔记第二十八课) aws eks使用练习(hands on)
  • RAMinit 程序编译运行考古记录
  • 【快速入门】Unity 常用组件(功能块)
  • 【异或数列——博弈论】
  • 【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解
  • Ubuntu 22.04 Desktop企业级基础配置操作指南
  • 天芒传奇Ⅱ·前传-天芒的使用
  • 基于HTML5 Canvas 和 JavaScript 实现的烟花动画效果
  • UI自动化测试的优缺点?