蓝桥杯模块AT24C02存储器Part_2

   九层妖塔 起于垒土
在这里插入图片描述



一、原理图

在这里插入图片描述


二、Notes

 ●256个字(words),每个字8位(bits)。
 ●内部存储器结构:256 x 8(2K)。
 ●存储器结构:AT24C02,2K串行EEPROM:内部存储器结构有32页(pages),每页8字节,2K需要一个8位数据字地址用于随机字寻址。
 ●32页×8字节=256字节,每个字(Byte)节8位(bit)。
 ●2KB的 EEPROM能进行8字节的页面写入。
 ●第一页的形象化结构,每个字节或者可以说是每个(8位)寄存器:
在这里插入图片描述


三、底层驱动

void IIC_Start(void);          //IIC总线启动条件
void IIC_Stop(void);           //IIC总线停止条件
void IIC_SendAck(bit ackbit);  //主机通过IIC发送应答
bit IIC_WaitAck(void);         //IIC等待从机应答    
void IIC_SendByte(unsigned char byt);  //通过I2C总线发送数据
unsigned char IIC_RecByte(void);       //从I2C总线上接收数据

四、通过IIC总线向EEPROM写数据

1、时序图

在这里插入图片描述

2、Template:

//--------------------------通过IIC总线向EEPROM写数据_写页面-------------//
//三个形参依次是,存储着写入EEPROM内数据的数组;开始写入数据子地址的首地址;写入字节的个数
void IIC_EEPROM_Write(uchar *EEPROM_Write_Buf,uchar addr,uchar num)  
{
	IIC_Start();         
	IIC_SendByte(0XA0);  //地址字节 1010 0000  向AT24C02写数据
	IIC_WaitAck();       //等待应答
	
	IIC_SendByte(addr);  //子地址的首地址,
	IIC_WaitAck();	
	
	while(num--)
	{
		IIC_SendByte(*EEPROM_Write_Buf++);  //循环一次写入一个字节;循环8次写入一页
		IIC_WaitAck();     //每写入一字节8位后,等待接收设备AT24C02产生应答 
		Delay6ms();       //EEPROM的写入周期
	}
	IIC_Stop();
}

3、Notes:

 ●通过IIC总线向EEPROM写数据_写页面
 ●三个形参依次是,
  ①存储着写入EEPROM内数据的数组。数组为uchar型,数组内每个元素都是8位,正好是每次字节写入的一个寄存器的8位内容;
  ②开始写入数据子地址的首地址。AT24C02共32页每页8个字节,共计256个字节即256个寄存器,每个寄存器对应一个地址,从0X000XFF
  进行页面写入时,只需要给出子地址的首地址,地址的低三位在收到每个数据字后都会自动加一,数据字地址的高位字节保持不变,以保持存储器页地址不变。
  若一次页面写入的字节数超过8个字节,数据字地址将重复滚动,以前的数据将被覆盖。只能手动更改页面地址。
  ③写入字节的个数;最多为8,即8个字节即一页。
 ●6ms的延时为等待EEPROM的写入周期结束。可理解为刚才写入的一个字节数据只是存放在EEPROM的缓冲区,在这个写入周期内EEPROM将缓冲区的数据写入非易失性存储器内。在此写入周期内,所有输入均被禁用,并且在写入操作完成之前EEPROM不会响应。

五、通过IIC总线读取EEPROM的数据

1、时序图

在这里插入图片描述

2、Template:

//--------------------------通过IIC总线读取EEPROM的数据_随机地址读取-------------//
void IIC_EEPROM_Read(uchar *EEPROM_Read_Buf,uchar addr,uchar num)   
{
	IIC_Start();         
	IIC_SendByte(0XA0);  //地址字节 1010 0000  向AT24C02写数据
	IIC_WaitAck();       //等待AT24C02应答
	
	IIC_SendByte(addr);  //子地址的首地址,
	IIC_WaitAck();	     //等待AT24C02应答
	
	IIC_Start();         
	IIC_SendByte(0XA1);  //地址字节 1010 0000  向AT24C02写数据
	IIC_WaitAck();      //等待AT24C02应答
	
	while(num--)
	{
		*EEPROM_Read_Buf++ = IIC_RecByte();
		if(num) IIC_SendAck(0);   //num不为0还未读取完,接收设备主机产生应答 
		else IIC_SendAck(1);      //num为0已读取完,接收设备主机产生非应答 
	}	
	IIC_Stop();	
}

3、Notes:

 ●读数据的操作中,先是主机向从机写入数据,包含从机的地址和从机内部寄存器的子地址;再重新启动总线,改变传送数据的方向,主机开始接收数据;
 ●后面要接受的N个数据则指向主控器件,所以应答信号应由主控器件发出,当N个数据接收完成之后,主控器件应发出一个非应答信号,告知受控器件数据接收完成,不用再发送;
 ●主控器件发出停止信号。

六、主函数

1、Template:

sbit SDA = P2^1;  //数据线 
sbit SCL = P2^0;  //时钟线

uchar EEPROM_Read_Buf[16]; //EEPROM页面读出缓冲数组——两页
uchar EEPROM_Write_Buf[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//EEPROM页面写入缓冲数组——两页

void IIC_EEPROM_Write(uchar *EEPROM_Write_Buf,uchar addr,uchar num);  //通过IIC总线向EEPROM写数据_写页面
void IIC_EEPROM_Read(uchar *EEPROM_Read_Buf,uchar addr,uchar num);   //通过IIC总线读取EEPROM的数据_随机地址读取
void main(void)
{
	All_Init();
	SEG_Timer1Init();		//1毫秒@12.000MHz定时器1初始化_数码管
	
	IIC_EEPROM_Write(EEPROM_Write_Buf,0X00,16);  Delay1ms();	
	IIC_EEPROM_Read(EEPROM_Read_Buf,0X00,1);     Delay1ms();	
	
	while(1)
	{	
		sprintf(SEG_Buf,"%04u",(uint)*EEPROM_Read_Buf);
		SEG_Tran(SEG_Buf,SEG_Code);  //动态数码管显示转换
		SEG_Timer1_Service();        //定时器1服务函数,数码管显示
	}
}

2、Notes:

 ●进行一次EEPROM的读或写操作后必须进行1ms的延时。 具体原因未知,在时序图中找不到依据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

#法外狂徒张三

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

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

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

打赏作者

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

抵扣说明:

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

余额充值