AT24C02是Atmel公司生产的低功耗CMOS型EEPROM,内含2K bit,即256字节存储空间。它采用I2C总线方式进行数据读写,可工作于标准模式、快速模式和高速模式。硬件电路及其简单,数据读写也很方便。
注:本篇文章并不对I2C进行深入介绍,有关I2C总线的原理及操作见上一篇文章。
(1)引脚定义
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应答后,主机发送停止信号。
操作时序:
/****************************************************************
函数名称: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”。
操作时序:
/****************************************************************
函数名称: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,表示读操作),这时子地址指向的为之前定义的值,方便访问任意地址空间,单片机接收到数据后发送非应答信号,并产生停止条件。
操作时序:
/****************************************************************
函数名称: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条评论)
登录后参与讨论