蓝桥继续水——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;
}