蓝桥继续水——E2PROM的驱动读写(AT24C02的使用)

比赛的AT24C02内存最大有2Kbit,即256个Byte。使用的通讯协议是I2C协议。

 

由于比赛中用到连续按页写,按页读的情况比较少见。(数据没有特别多需要保存)

所以只在这里介绍以字节为单位的写(Byte Write)随意读(Random Read,当然我就是把它当一个字节的读)。

1设备地址码:

由硬件电路图知,0xa0,是我们需要的地址码。(暂不考虑最后1位是读/写命令的问题)

2.字节写

S(起始信号)→设备地址+0→A(接收从器件应答)→写入数据的地址→A(接收从器件应答)→写入的数据(8位)→A(接收从器件应答)→P(结束信号)

 函数如下:

void At24c02Write(unsigned char addr,unsigned char dat)        //这里写得比较粗糙哇,等待应答函数可以用来判断,但是我没有判断,只是贴合时序要求了。
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck(); 
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}

3.随意读

S(起始信号)→设备地址+0→A(接收从器件应答)→需要读取数据的地址n→A(接收从器件应答)→S→设备地址+1(要求读flash)→A(接收从器件应答)→读取字节→A非(主器件发送非应答信号1)→P(结束信号)

函数如下:

unsigned char At24c02Read(unsigned char addr)          //读取的字节需要返回。
{
unsigned char num;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();//???????
IIC_SendByte(addr);
IIC_WaitAck(); //????????

IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
num=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return num;
}

原文地址:https://www.cnblogs.com/page71/p/13968180.html