蓝桥杯iic之AT24C02(教你如何依据数据手册写代码)

目的:存储数据

做一件事,首先了解他的目的,我们使用AT24C03是为了存储数据在eeprom中,达到断电仍可保存的目的。
于是我们就需要弄清如何将数据写入 以及 如何读出写入的数据。
我将以最简单的方式教你依据数据手册 写出 存储数据的程序。

原理

写入

在这里插入图片描述
从上图可以发现,却认为的SDA为低电平~,我们有官方给的驱动里可以找到这么一个函数

void IIC_SendAck(bit ackbit)
{
    
    
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

IIC_SendAck(0)可以作为发送应答~
控制字节的高四位 1010 = 9
低4位由A0,A1,A2, 0 组成,其中A0,A1,A2电平 表示选择哪一个AT24C02,注意
在这里插入图片描述

在这里插入图片描述起始位: start
控制字节: 一般来说 为0x90
确认位: 上面我们提及的发送应答,将SDA置0;
地址字节:存储数据的地址,AT24xx00的器件,只使用地址字节的低四位,所以存储地址为0~255
数据字节: 我们想存储的数据
P: 停止位
请注意确认位的正确书写,不能少写也不能多写,只有应答了,单片机才清楚你已经执行上一步,他才会准备下一步要做什么。否则程序将停滞不前或者跑飞


void W_at24c02(u8 address,u8 dat)
{
    
    
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_SendAck(0);
	IIC_SendByte(address);
	IIC_SendAck(0);
	IIC_SendByte(dat);
	IIC_SendAck(0);
	IIC_Stop();
}

读出

在这里插入图片描述
由芯片手册,我们看出随机读取操作才能正确的将我们当前存储地址的数据 读取出来,而当前读取操作会 读取到我们写入地址再+1 的地址,里面没有存储我们的数据。

并且,随机读取,需要先发送字节地址(此时为写操作),字节地址发送完毕后,主器件收到确认信号就产生起始条件。
下面是代码流程:
在这里插入图片描述
s起始位: start
控制字节: 0x90(此时为写如)
确认位: 上面我们提及的发送应答,将SDA置0;
地址字节:之前我们写入过数据的地址
确认位: 将SDA置0;
s起始位: start
控制字节: 0x91(此时为读操作)
数据字节: 读取 之前发送的地址字节 里的数据
这里没有确认位
P: 停止位

u8 R_at24c02(u8 address)
{
    
    
	u8 temp;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_SendAck(0);
	IIC_SendByte(address);
	IIC_SendAck(0);
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_SendAck(0);
	temp = IIC_RecByte();
	IIC_Stop();
	return temp;
}

猜你喜欢

转载自blog.csdn.net/qq_45720531/article/details/114378255