E2PROM的读写主要是考察IIC的使用,但是在比赛当中I2C的各种驱动文件都是直接给出的,因此我们需要做的工作就是根据EEPROM的读写时序配出读写的函数来。
我们可以看到IIC的数据线(已上拉)有两路去处,一路向上通往EEPROM(U2),一路向左通向编程电阻U3,为了确认IIC控制的是哪路设备,这里就有一个Device地址的问题:
从电路图可知,地址中的A2A1A0三位在硬件中都是接地的(0),因此可以得出读写的Device地址:
写地址:1010_0000,即0xa0
读地址:1010_0001,即0xa1
我们考试中可以打开芯片手册AT24C02,可以看到读写的时序图:
启动
发送0xa0
等待ACK
发送写地址
等待ACK
发送数据
等待ACK
结束
每个步骤分别对应着IIC的对应函数
启动
发送0xa0
等待ACK
发送读地址
等待ACK
启动
发送0xa1
等待ACK
读取数据
停止
可以看到,读数据时有一个重复启动总线的过程,值得我们注意一下。从上面的发送时序可以看出,除了启动和停止,还要读操作,其它的基本上是发送操作的后面接一个等待ACK ,这是一个特征。
uint8_t EEPROMread(uint8_t address) //读输入的参数就只有地址,数据类型是uchar
{uint8_t date=0;IIC_Start();IIC_SendByte(0xa0);IIC_WaitAck();IIC_SendByte(address);IIC_WaitAck();IIC_Start();IIC_SendByte(0xa1);IIC_WaitAck();date = IIC_RecByte();IIC_Stop();return date;
}
void EEPROMwrite(uint8_t address,uint8_t data)
{IIC_Start(); //IIC起始信号IIC_SendByte(0xa0); //发送器件写地址IIC_WaitAck(); //等待应答信号IIC_SendByte(addr); //发送数据的位置IIC_WaitAck(); //等待应答信号IIC_SendByte(value); //发送要写的数据IIC_WaitAck(); //等待应答信号IIC_Stop(); //发送停止信号
}
写这个程序的要点在于,地址与数据的类型都是uint8_t类型的。
使用EEPROM的步骤主要分为两部分:
相关库函数移植
根据时序图编写读写操作代码
从开始到现在第八课,蓝桥杯大部分内容都已经包含在内,接下来本专栏的重点会集中在实战应用上,并且不断补充涉及的知识点。