蓝桥杯单片机学习12——AT24C02&EEPROM存储芯片
AT24C02 EEPROM芯片详解、命名格式、引脚介绍、原理图、IIC通信原理、AT24C02的读写操作讲解及代码实现,基本控制流程及AT24C02测试案例的分析和代码实现
上期我们学习了PCF8591A/D&D/A转换芯片的相关内容,这么我们来介绍以下AT24C02
简介
AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,具有以下特点:
【1】:低电平和标准电平工作(2.7~5.5V)
【2】:内置256*8bit(共2k)存储空间
【3】:使用IIC接口通信,可进行双向数据传输
【4】:具有独立的数据写入保护引脚
【5】:内部存储格式为8字节一页,共32页,构成256字节空间
【6】:具有高稳定性,读写次数>1000000次,数据可保存100年不丢失
【7】:广泛应用于汽车、电子等行业
命名格式
AT24CX系列芯片,X表示芯片的存储空间,比如:AT24C02表示存储空间为2K(256byte),不同名称对应着不同的存储空间和分页方式 ,其具体对应关系如下:
名称 | 存储空间 | 分页方式 |
---|---|---|
AT24C01 | 1k | 8Byte为1页 |
AT24C02 | 2k | 8Byte为1页 |
AT24C04 | 4k | 16Byte为1页 |
AT24C08 | 8k | 16Byte为1页 |
AT24C16 | 16k | 16Byte为1页 |
引脚描述
蓝桥杯单片机使用的封装引脚如图,其中,不同引脚的功能如下表:
引脚 | 功能描述 |
---|---|
A0~A2 | 地址引脚,原理图上直接接地 |
SDA | IIC通信数据线 |
SCL | IIC通信时钟线 |
WP | 写保护引脚,为0时可读可写,为1时只读 |
NC | 没用,啥也不接 |
GND | 接地 |
VCC | 接电源 |
原理图
需要注意的是:
- A0~A2直接接地,在读写地址中都是0。
- WP是直接接地,允许读取和写入数据。
IIC通信原理
关于IIC通信原理相关的内容,包括IIC的的驱动代码,我在蓝桥杯单片机学习11——PCF8591A/D&D/A转换芯片中已经详细的介绍,这里不做过多的赘述。
读写地址
前面我们在学习IIC通信原理的时候提到过,做开始通信之前,需要进行寻址,以此来确定进行通信的设备,每一个通信设备都有一个确定的通信地址,AT24CX芯片的地址如图:
需要注意的是:
【1】:读写地址的第八位控制数据的写入和读出,为1表示读出,为0表示写入
【2】:对于存储空间在2k(256Byte)以内的芯片类型,数据存储的地址可以用0~0xff(一个字节)表示,所以第五位到第七位是A2 ~ A0,但对于存储空间在2k(256Byte)以上的芯片类型,数据存储的地址无法用一个字节表示,所以需要在读写地址的第五位到第七位之间适当的加入P2 ~ P0 来表示数据读写地址所在的页数(Page),再通过发送数据读写地址在该页数的偏移量就可以准确的表示数据写入和读出的地址。
存储地址
对于存储空间在2k(256Byte)以内的芯片类型,数据存储的地址可以用0~0xff(0 ~ 255)表示,
对于存储空间在2k(256Byte)以上的芯片类型,数据存储的地址表示方法更为复位,由于蓝桥杯单片机上没有使用到相对应的型号,因此这也不做过多的赘述。
基本控制方法
AT24C02的基本控制方法是基于IIC通信原理实现的,其基本操作包括单字节写入/读出,以及多字节的写入/读出,我们重点介绍单字节写入/读出,相信掌握了单字节的写入/读出,多字节的内容也就触类旁通了。
单字节写入
具体流程如下:
【1】:开始通信
【2】:开始寻址/写入写地址
【3】:等待应答
【4】:写入数据存储地址
【5】:等待应答
【6】:写入数据
【7】:等待应答
【8】:结束通信
具体代码如下:
#define AT24C02_WriteByte 0xA0 //AT24C02写地址
//AT24C02写字节函数,Addr为数据写入的地址,dat为需要写入的数据
void AT24C02_Write_Byte(unsigned char Addr,unsigned char dat)
{
IIC_Start(); //开始信号
IIC_SendByte(AT24C02_WriteByte); //开始寻址,选择为写数据
IIC_WaitAck(); //等待应答
IIC_SendByte(Addr); //写入数据存放的地址
IIC_WaitAck(); //等待应答
IIC_SendByte(dat); //发送数据
IIC_WaitAck(); //等待应答
IIC_Stop(); //结束通信
}
单字节读取
具体流程如下:
【1】:开始通信
【2】:开始寻址/写入写地址
【3】:等待应答
【4】:写入数据存储地址
【5】:等待应答
【6】:开始通信,改变通信方向
【7】:开始寻址/写入读地址
【8】:等待应答
【9】:接收数据
【10】:不应答,接收通信。
具体代码如下:
#define AT24C02_ReadByte 0xA1 //AT24C02读地址
//AT24C02读字节函数,返回值为读出的数据,Addr为数据读出的地址
unsigned char AT24C02_Read_Byte(unsigned char Addr)
{
unsigned char dat = 0; //定义变量,存放读出的数据
IIC_Start(); //开始通信
IIC_SendByte(AT24C02_WriteByte);//开始寻址,选择为写数据
IIC_WaitAck(); //等待应答
IIC_SendByte(Addr); //写入数据读出的地址
IIC_WaitAck(); //等待应答
IIC_Start(); //开始下一次通信,因为IIC通信每改变一次数据传输方向,必需重新开始通信
IIC_SendByte(AT24C02_ReadByte); //开始寻址,选择为读数据
IIC_WaitAck(); //等待应答
dat = IIC_RecByte(); //读出数据
IIC_SendAck(1); //发送不应答,(发1表示不应答)
IIC_Stop(); //结束通信
return dat; //返回读出的数据
}
测试案例
要求
使用蓝桥杯官方提供的IIC官方驱动代码,实现单片机和AT24C02之间的通信,并且能够使用AT24C02的EEPROM存储功能,实现数据的存入和取出,其具体要求如下:
- 使用AT02C02完成对全局变量dat的存入和取出,完成对dat 的断电保存
- 通过数码管将dat显示出来dat的取值范围为0~255
- 按下按键S4,dat的值增加,按下S5,dat的值减小。
代码实现
Main函数
#include "iic.h"
#include "LS138.h"
#define AT24C02_WriteByte 0xA0 //AT24C02写地址
#define AT24C02_ReadByte 0xA1 //AT24C02读地址
sbit Key1 = P3^3; //位定义部分
sbit Key2 = P3^2;
unsigned char dat = 0; //存放数码管显示的数字
unsigned int KEY1_Count = 0; //key1计数变量
unsigned int KEY2_Count = 0; //key2计数变量
//AT24C02写字节函数,Addr为数据写入的地址,dat为需要写入的数据
void AT24C02_Write_Byte(unsigned char Addr,unsigned char dat)
{
IIC_Start(); //开始信号
IIC_SendByte(AT24C02_WriteByte); //开始寻址,选择为写数据
IIC_WaitAck(); //等待应答
IIC_SendByte(Addr); //写入数据存放的地址
IIC_WaitAck(); //等待应答
IIC_SendByte(dat); //发送数据
IIC_WaitAck(); //等待应答
IIC_Stop(); //结束通信
}
//AT24C02读字节函数,返回值为读出的数据,Addr为数据读出的地址
unsigned char AT24C02_Read_Byte(unsigned char Addr)
{
unsigned char dat = 0; //定义变量,存放读出的数据
IIC_Start(); //开始通信
IIC_SendByte(AT24C02_WriteByte);//开始寻址,选择为写数据
IIC_WaitAck(); //等待应答
IIC_SendByte(Addr); //写入数据读出的地址
IIC_WaitAck(); //等待应答
IIC_Start(); //开始下一次通信,因为IIC通信每改变一次数据传输方向,必需重新开始通信
IIC_SendByte(AT24C02_ReadByte); //开始寻址,选择为读数据
IIC_WaitAck(); //等待应答
dat = IIC_RecByte(); //读出数据
IIC_SendAck(1); //发送不应答,(发1表示不应答)
IIC_Stop(); //结束通信
return dat; //返回读出的数据
}
//数码管显示函数,分别显示dat的百位、十位、个位
void SEG_Show(unsigned char dat)
{
SEG_Write(5,dat/100%10);
SEG_Write(6,dat/10%10);
SEG_Write(7,dat%10);
}
void main()
{
LS138_Init(); //初始化数码管
dat = AT24C02_Read_Byte(0x00); //读取dat的值,第一次下载程序,则dat默认值位0
while(1)
{
SEG_Show(dat); //通过数码管显示dat
if(Key1 == 0) //判断KEY1是否按下
{
KEY1_Count++;
if(KEY1_Count>=500) //消抖
{
dat++; //dat++
AT24C02_Write_Byte(0x00,dat); //写入dat的值
}
}
if(Key2 == 0) //判断KEY1是否按下
{
KEY2_Count++;
if(KEY2_Count>=500) //消抖
{
dat--; //dat++
AT24C02_Write_Byte(0x00,dat); //写入dat的值
}
}
}
}
程序中出现的所有函数,都已经在前面介绍过,在这里不做介绍
总结
由于AT24C02的操作流程和PCF8591大致相同,所有我在介绍的时候,也相对简洁,**重点是需要熟悉IIC通信的基本流程,再一个就是相关的读写地址,**就可以做到融会贯通,运用自如,
emmm,总结完毕。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)