原创 学习笔记:AT24C02串行EEPROM的应用

2012-5-8 04:22 4734 20 20 分类: MCU/ 嵌入式

 

 AT24C02是Atmel公司生产的低功耗CMOS型EEPROM,内含2K bit,即256字节存储空间。它采用I2C总线方式进行数据读写,可工作于标准模式、快速模式和高速模式。硬件电路及其简单,数据读写也很方便。

注:本篇文章并不对I2C进行深入介绍,有关I2C总线的原理及操作见上一篇文章。

(1)引脚定义

1.gif

 

1、2、3引脚为地址输入脚,根据需要分别接地或电源。当I2C总线工作于多节点模式时确定器件地址。AT24C02的地址分为固定部分和可编址部分,高半字节固定为1010,低半字节前三位对应A2、A1、A0引脚,最低位为读/写选择位。“0”表示写操作,“1”表示读操作。在主机发送起始条件后需发送器件地址,以确定要进行操作的器件,被选中的器件发送应答信号。4、8引脚分别接地与电源。6、7号引脚为I2C总线的时钟线与数据线,需加10K上拉电阻以使I2C总线在空闲时保持高电平。7号引脚为写保护引脚,接地时可正常读写,接高时只允许对器件进行读操作,以防止因为误操作而损坏内部存储的数据。AT24C02的写周期约为10ms,也就是在写操作后10ms才能正常读出数据。

(2)AT24C02写操作

单字节写操作

写操作要求在发送器件地址及应答后,发送一字节子地址,即存储器内部地址,因AT24C02容量为256字节,所以子地址为0-255。在接收到子地址后EEPROM再发送一位应答。在接下来的时钟周期里主机发送8位数据,EEPROM应答后,主机发送停止信号。

操作时序:

2.gif

 

 

/****************************************************************

函数名称:EEPROM_Write_Byte

函数功能:向EEPROM发送字符串

入口参数:add  //器件地址  

 sub_add  //子地址,即EEPROM内部地址(0-255)

 dat   //要写入的一字节数据

出口参数:无

备 注:

*****************************************************************/

void EEPROM_Write_Byte(unsigned char add,unsigned char sub_add,unsigned char dat)

{

Start_I2c();

       

Send_Byte(add);           

Send_Byte(sub_add);               

Send_Byte(dat);           

 

Stop_I2c();                

}

:应答信号在EEPROM接受到数据后自动发出,无需软件发送

 

页写操作

 

AT24C02提供32个8字节的页空间。页写操作初始化与字节写相同,但在EEPROM接受到8位数据后单片机并不发送停止条件,而是继续发送7字节数据,在每接受一字节数据,EEPROM发送一位应答。在发送完8字节数据后,单片机需发送停止信号以终止操作。在进行页写操作时,存储器的子地址低三位会自动增一,但由于高位并不自增,在子地址加到页空间边界,即写入8字节后,下一字节会自动写入该页空间的第一字节,覆盖之前的数据,即“roll over”。

操作时序:
 

3.gif

 

 

/****************************************************************

函数名称:EEPROM_Write_Page

函数功能:向EEPROM写一页数据,即8字节

入口参数:add  //器件地址    

 sub_add   //子地址,EEPROM内部地址(0-255)

 *s  //需写入的8字节数组或字符串

出口参数:无

备 注:

*****************************************************************/

void EEPROM_Write_Page(unsigned char add,unsigned char sub_add,unsigned char *s)

{

unsigned char i;

Start_I2c();

Send_Byte(add);//器件地址最低位为0,表示写操作

Send_Byte(sub_add);

for(i=0;i<8;i++)//一次只能写入8字节数据

{

Send_Byte(*s);

s++;

}

Stop_I2c();

}

 

 

(3)AT24C02读操作 

   单字节读操作

读操作分为当前地址读操作、随机读操作、顺序读操作。这里以随机读操作为例。在单片机发送完器件地址及子地址后,产生另一个重复起始信号,并发送器件地址(此时的器件地址最低位为1,表示读操作),这时子地址指向的为之前定义的值,方便访问任意地址空间,单片机接收到数据后发送非应答信号,并产生停止条件。

操作时序:

1.gif


 

/****************************************************************

函数名称:EEPROM_Read_Byte

函数功能:从EEPROM读出字符串

入口参数:add  //器件地址  

 sub_add  //子地址,即EEPROM内部地址(0-255)

出口参数:c   //读取的一字节数据

备 注:

*****************************************************************/

unsigned char EEPROM_Read_Byte(unsigned char add,unsigned char sub_add)

{

unsigned char c;

Start_I2c();

          

Send_Byte(add);            

Send_Byte(sub_add);        

 

Start_I2c();

Send_Byte(add+1);

c=Rcv_Byte();

NoAck_I2c();

               

Stop_I2c();

return (c);                   

}

 

页读操作

初始部分与单字节操作相同,在单片机每接收到一字节发送一个应答位,在接收到第8字节时发送非应答信号,并产生停止条件。在读取超过8字节数据时,地址指针会在读完8字节后跳会页空间的第一字节。

 

/****************************************************************

函数名称:EEPROM_Read_Page

函数功能:从EEPROM读取一页数据,即8字节

入口参数:add  //器件地址    

 sub_add   //子地址,EEPROM内部地址(0-255)

 *s  //读出数据所存放的数组

出口参数:无

备 注:

*****************************************************************/

void EEPROM_Read_Page(unsigned char add,unsigned char sub_add,unsigned char *s)

{

unsigned char i;

Start_I2c();

Send_Byte(add);

Send_Byte(sub_add);

 

Start_I2c();

Send_Byte(add+1); //发送器件地址,最低位为1,表示读操作

for(i=0;i<7;i++)//一次只能读取8字节

{

*s=Rcv_Byte(); //将读取的数据存于数组

s++;

Ack_I2c();//主机发出应答信号

}

*s=Rcv_Byte(); 

s++;

NoAck_I2c();   //主机发出非应答信号

Stop_I2c();

}

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条