> 文章列表 > 蓝桥杯嵌入式第八课--EEPROM读写

蓝桥杯嵌入式第八课--EEPROM读写

蓝桥杯嵌入式第八课--EEPROM读写

前言

E2PROM的读写主要是考察IIC的使用,但是在比赛当中I2C的各种驱动文件都是直接给出的,因此我们需要做的工作就是根据EEPROM的读写时序配出读写的函数来。

EEPROM硬件连接图

蓝桥杯嵌入式第八课--EEPROM读写

我们可以看到IIC的数据线(已上拉)有两路去处,一路向上通往EEPROM(U2),一路向左通向编程电阻U3,为了确认IIC控制的是哪路设备,这里就有一个Device地址的问题:

蓝桥杯嵌入式第八课--EEPROM读写

从电路图可知,地址中的A2A1A0三位在硬件中都是接地的(0),因此可以得出读写的Device地址:

  • 写地址:1010_0000,即0xa0

  • 读地址:1010_0001,即0xa1

EEPROM读写时序

我们考试中可以打开芯片手册AT24C02,可以看到读写的时序图:

一、写字节

蓝桥杯嵌入式第八课--EEPROM读写
  1. 启动

  1. 发送0xa0

  1. 等待ACK

  1. 发送写地址

  1. 等待ACK

  1. 发送数据

  1. 等待ACK

  1. 结束

每个步骤分别对应着IIC的对应函数

二、读字节

蓝桥杯嵌入式第八课--EEPROM读写
  1. 启动

  1. 发送0xa0

  1. 等待ACK

  1. 发送读地址

  1. 等待ACK

  1. 启动

  1. 发送0xa1

  1. 等待ACK

  1. 读取数据

  1. 停止

可以看到,读数据时有一个重复启动总线的过程,值得我们注意一下。从上面的发送时序可以看出,除了启动和停止,还要读操作,其它的基本上是发送操作的后面接一个等待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的步骤主要分为两部分:

  1. 相关库函数移植

  1. 根据时序图编写读写操作代码

从开始到现在第八课,蓝桥杯大部分内容都已经包含在内,接下来本专栏的重点会集中在实战应用上,并且不断补充涉及的知识点。