功能
保存在RAM中的数据在掉电后就会丢失
保存在FLASH中的数据不能随意改变,无法记录变化的数值
故使用E2PROM来保存数据
一共256个字节的存储空间,地址从0x00~0xff,想把数据存储在哪个位置,此刻写的就是哪个地址
可重复擦写30w到100w次
数据可保存100年
读写操作时序
【1】写数据
第一步:首先是I2C的起始信号,接着跟上首字节,即EEPROM的地址和读写位的组合,读写方向上选择“写”操作。
第二步:发送要写入数据的EEPROM内部存储地址。
第三步:发送要存储的数据第一个字节、第二个字节… …。
1、写数据(单片机发送)过程中,每个字节结束后EEPROM都会回应一个“应答位0”,告诉我们写EEPROM成功,如果没有应答表示未成功。
2、写数据过程中,每成功写入一个字节,EEPROM地址自动加1,当加到最大值,会溢出。
//函数见I2C部分
//向E2PROM中写入一个字节,addr为字节地址
void E2WriteByte(unsigned char addr,unsigned char dat)
{
I2CStart();
I2CWrite(0x50<<1);//寻址后选择为写操作
I2CWrite(addr); //写入存储地址
I2CWrite(dat);
I2CStop();
}
【2】读数据
第一步:首先是I2C的起始信号,接着跟上首字节,即EEPROM的地址和读写位的组合,读写方向上选择“写”操作。
第二步:发送要读取的EEPROM内部存储地址。
第三步:重新发送I2C的起始信号和器件地址,并且在方向位选择“读”操作。
(在这三步中,每一个字节实际上都是在“写”,因此EEPROM都会回应一个“应答位0”。)
第四步:读取从器件发回的数据,每读一个字节,如果还想继续读下一个字节,就发送一个“应答位0”,如果不想继续读了,就发送一个“非应答位1”。
应答位: ACK 非应答位:NACK
//读取E2PROM中一个字节,addr为字节地址
unsigned cahr E2ReadByte(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CWrite(0x50<<1);
I2CWrite(addr);
I2CStart();
I2CWrite((0x50<<1)|0x01);
dat=I2CReadNAK();
I2CStop();
return dat;
}
多字节进行读写操作
//读取函数,buf为数据指针,addr为E2中的起始地址,len为读取长度
void E2Read(unsigned char *buf,unsigned char addr,unsigned char len)
{
do{
I2CStart();
if(I2CWrite(0x50<<1))
{
break;
}
I2CStop();
}while(1);//查询当前是否可以进行读写操作
I2CWrite(addr);
I2CStart();
I2CWrite((0x50<<1)|0x01);
while(len>1)//连续读取len-1个字节
{
*buf++=I2CReadACK();
len--;
}
*buf=I2CReadNAK();
I2CStop();
}
//写入函数,buf为源数据指针,addr为起始地址,len为写入长度
void E2Write(unsigned char *buf,unsigned char addr,unsigned char len)
{
while(len--)
{
do{
I2CStart();
if(I2CWrite(0x50<<1))
break;
I2CStop();
} while(1);
I2CWrite(addr++);
I2CWrite(*buf++);
I2CStop();
}
}
页写入功能
一次性写入一页,写完再发送停止位就不用写完一个字节就检测一次
连续向页内写入几个字节后,最后发送停止位
E2检测到停止位,将该页写入
如果数据跨页,则发送一个停止位等待E2空闲后,即上一页完全写入非易失区域后,进行下一页的写入
void E2Write(unsigned char *buf,unsigned char addr,unsigned char len)
{
while(len>0)
{
do{
I2CStart();
if(I2CWrite(0x50<<1))
break;
I2CStop();
} while(1);
I2CWrite(addr);
while(len>0)
{
I2CWrite(*buf++);
len--;
addr++;
if((addr&0x07)==0)//检查地址是否到达页边界,每页8字节,固检测第三位即可
break;
}
I2CStop();
}
}