E2PROM

功能

保存在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();
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值