19-AT24C02的基本应用
AT24C02的基本应用
一.芯片简介
AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
二.芯片参数
1.特点
-
工作电压:1.8V~5.5V;
-
低功耗CMOS技术,工作电流1mA,待机电流1uA;
-
应用在内部结构:128x8(1K),256x8(2K),512x8(4K),1024x8(8K),2048x8(16K);
-
二线串行接口,支持标准IIC通信协议;
-
双向数据传输协议;
-
兼容 400KHz传输速率(1.8V,2.5V,2.7V,3.6V);
-
支持硬件写保护功能;
-
擦出次数可达10000次;
-
存储数据时间超过100年;
2.引脚定义
Figure 7.设备地址
A0-A2引脚为芯片地址,用于多器件工作模式;SDA、SCL分别为IIC通信的数据线和时钟线;WP为写保护引脚,当该引脚接 GND 时,允许正常的读/写操作。当该引脚接 VCC 时,芯片启动写保护功能;
3.参考电路
A0-A2接到GND上,地址固定为0;SCL、SDA引脚内部为开漏输出,所以需接上拉电阻;WP引脚接GND,表示芯片可读可写
三.通信接口
1.芯片读写地址
在进行I2C通信时,主机发送启动信号后,再发送寻址信号。器件的地址有7位和10位,以7为地址寻址为例,寻址信号由一个字节构成,高7位为地址位,最低位为方向位,用来表示主机与从器件的数据传输方向;方向位0代表主机接下来对从器件进行写操作;方向位为1,表明主机接下来对器件进行读操作。
如上图,AT24C02的高4位是固定的,为1010b,低3位则由A0/A1/A2信号线的电平决定。按照我们此处的连接, A0/A1/A2 均为 0,所以 EEPROM 的 7 位设备地址是: 1010 000b ,即 0xA0。
由于 I2C 通讯时常常是地址跟读写方向连在一起构成一个 8 位数,且当R/W 位为 0 时,表示写方向,所以加上 7 位地址,其值为“ 0xA0”,常称该值为 I2C 设备的“写地址”;当 R/W 位为 1 时,表示读方向,加上 7 位地址,其值为“ 0xA1”,常称该值为“读地址”。
A0/A1/A2输入脚用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0。当使用AT24C02 时最大可级联8个器件。如果只有一个AT24C02被总线寻址,这三个地址输入脚(A0、A1、A2 )可悬空(接地也可以)或连接到Vss,如果只有一个AT24C01被总线寻址这三个地址输入脚(A0、A1、A2 )必须连接到Vss。
2.IIC通信
由于PCF8591也是I2C通信,所以就不必讲,不懂的直接看上一节
直接上I2C通信得时序代码
sbit SCL = P2^0;
sbit SDA = P2^1;
void I2C_Delay(unsigned char i) {
do{
_nop_();
}while(i--);
}
void I2C_Start(void) {
SCL = 1;
SDA = 1;
I2C_Delay(5);
SDA = 0;
SCL = 0;
}
void I2C_Stop(void) {
SDA = 0;
SCL = 1;
I2C_Delay(5);
SDA = 1;
I2C_Delay(5);
}
void I2C_SendAck(bit Ack) {
SCL = 0;
SDA = Ack;
I2C_Delay(5);
SCL = 1;
I2C_Delay(5);
SCL = 0;
I2C_Delay(5);
SDA = 1;
}
bit I2C_WaitAck(void) {
bit Ackbit;
SCL = 1;
I2C_Delay(5);
Ackbit = SDA;
SCL = 0;
I2C_Delay(5);
return Ackbit;
}
void I2C_SendByte(unsigned char byt) {
unsigned char i;
for(i =0;i< 8;i++) {
SCL = 0;
I2C_Delay(5);
if(byt & 0x80) SDA = 1;
else SDA = 0;
I2C_Delay(5);
SCL = 1;
byt <<= 1;
}
SCL = 0;
}
unsigned char I2C_Rec_Byte(void) {
unsigned char i,dat;
for(i=0;i<8;i++) {
SCL = 1;
I2C_Delay(5);
dat <<= 1;
if(SDA) dat|= 1;
SCL = 0;
I2C_Delay(5);
}
return dat;
}
三.控制程序
实现了基本IIC通讯函数后,就可对AT24C02进行操作,主要是写入数据和读取数据两个函数。
芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为0x0000-0x00FF,共256个寻址单位。所以可任意在0x00FF地址写入我们需要保存的数据。
1.AT24C02写入数据
时序顺序为:发送开始信号,IIC启动->发送器件地址,其中读写标志位为写->发送器件内部存储地址->向器件中写入数据->发送停止信号,IIC停止;
void AT24C02_WriteByte(unsigned char wordAddress,Data) {
IIC_Start();
IIC_SendByte(0xA0);
IIC_WaitAck();
IIC_SendByte(wordAddress);
IIC_WaitAck();
IIC_SendByte(Data);
IIC_WaitAck();
IIC_Stop();
}
// 参考:Random Read
// 读字节
unsigned char AT24c02_ReadByte(unsigned char wordAddress) {
unsigned char Data;
// 开始
IIC_Start();
// 设备地址写
IIC_SendByte(0xA0);
// 应答
IIC_WaitAck();
// 字节地址
IIC_SendByte(wordAddress);
// 应答
IIC_WaitAck();
// 开始
IIC_Start();
// 设备地址加读
IIC_SendByte(0xA0 | 0x01);
// 应答
IIC_WaitAck();
// 读取数据
Data = IIC_RecByte();
// 非应答
IIC_SendAck(1);
// 停止
IIC_Stop();
return Data;
}
// 将EEPROM_String的数据写入,地址位address中,需要写的个数为num
void AT24C02_Page_Write(unsigned char *EEPROM_String,unsigned char address,unsigned char num) {
I2C_Start(); // 开始
// 地址加写
I2C_SendByte(0xA0);
// 应答
I2C_WaitAck();
// WORD ADDRESS
I2C_SendByte(address);
// 应答
I2C_WaitAck();
while(num--) {
I2C_SendByte(*EEPROM_String++);
// 应答
I2C_WaitAck();
I2C_Delay(200);
}
I2C_Stop();
}
// 参考:Sequential Read
void AT24C02_Page_Read(unsigned char * EEPROM_String,unsigned char address,unsigned char num) {
I2C_Start(); // 开始
// 地址加写
I2C_SendByte(0xA0);
// 应答
I2C_WaitAck();
// WORD ADDRESS
I2C_SendByte(address);
// 应答
I2C_WaitAck();
I2C_Start(); // 开始
// 地址加读
I2C_SendByte(0xA1);
// 应答
I2C_WaitAck();
while(num--) {
*EEPROM_String++ = I2C_Rec_Byte();
if(num) I2C_SendAck(0);
else I2C_SendAck(1);
}
I2C_Stop();
}
读取数据的时候为什么要发送几次地址?
在数据手册中有解释:
截图如下
解释一下:
RANDOM READ: A random read requires a “dummy” byte write sequence to load in the data
word address. Once the device address word and data word address are clocked in and
acknowledged by the EEPROM, the microcontroller must generate another start condition.
The microcontroller now initiates a current address read by sending a device address with the read/write select bit high. The EEPROM acknowledges the device address and serially clocks out the data word. The microcontroller does not respond with a zero but does generate a fol lowing stop condition (see Figure 11 on page 12).
随机读:随机读取需要一个“虚拟/哑”字节写入序列来加载数据字地址。
一旦设备地址字和数据字地址被写入和由EEPROM确认,微控制器必须产生另一个启动条件。
微控制器现在通过发送设备地址来启动当前地址读取读写选择位高。
EEPROM确认设备地址和串行时钟走出数据世界。
微控制器不响应零,但是确实产生以下停止条件