蓝桥杯嵌入式学习日记(六)——EEPROM(AT24C02)以及IIC协议【STM32】【HAL库】
这里如果大家急需要学习比赛内容可以直接从EEPROM数据帧开始学习,因为赛事方提供了I2C的文件,但如果并不着急还是建议了解下I2C总线。
目录
前言
这里如果大家急需要学习比赛内容可以直接从EEPROM数据帧开始学习,因为赛事方提供了I2C的文件,但如果并不着急还是建议了解下I2C总线。
IIC串行总线
I2C总线(Inter-Integrated Circuit,内部整合电路)是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。一根是数据线SDA,另一根是时钟线SCL。
I2C总线通过上拉电阻接正电源。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。每个连接在IIC上的设备都具有唯一的地址。
在AT24C02的数据手册可以了解到I2C总线。
一、数据的有效性
通过图示可以观察到I2C总线进行数据传送时,时钟信号(SCL)为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
二、起始信号以及终止信号
在信号线为高电平期间,数据线为下降沿时代表起始信号,数据线为上升沿则代表终止信号。
三、写入周期时序
注意:1.写入周期时间tWR是从写入序列的有效停止条件到内部清除/写入周期结束的时间。
四、EEPROM数据帧写入和读取(重点)
这里是本篇的重点,因为前面关于I2C的知识,只是希望大家了解,因为比赛方提供了I2C的历程文件,也就是说不需要自己再编写I2C的函数。
1、EEPROM原理图
引脚名 | 功能 |
---|---|
A0-A2 | 地址输入 |
SDA | 数据线 |
SCL | 时钟线 |
WP | 写保护(Write Protect) |
NC | 无连接(No Connect) |
这里我们看到在CT117E_M4上A0-A2也就是E1-E3全部接地也就是为0。
2、数据地址
地址为八位数据,前四位可以看到是固定的1010,A0-A2原本是自行更改的输入地址,但是在这块板子上默认全部拉低也就是全为0,数据的最后为读写位。
1 | 0 | 1 | 0 | A2 | A1 | A0 | R/W |
---|---|---|---|---|---|---|---|
MSB | 0 | 1 | 0 | 0 | 0 | 0 | LSB |
最后一位写为0,读为1。
所以我们要记住,写操作设备地址为1010 0000(0xa0),读操作设备地址为1010 0001(0xa1)。
3、数据写入
这里分为按字节写入和页写入,这里我们使用字节写入。
通过数据手册给出的示意图我们可以发现写入流程。
1、产生起始信号
2、发送从机设备地址
3、发送要写入数据的地址
4、发送要写入的数据
5、产生停止信号
具体代码则是
void EEPROM_Write(u8 add,u8 dat)
{
I2CStart () ;//起始信号
I2CSendByte (0xa0) ;//设备地址
I2CWaitAck () ;//等待响应
I2CSendByte (add) ;//数据地址
I2CWaitAck () ;
I2CSendByte (dat) ;//数据内容
I2CWaitAck () ;
I2CStop () ;//停止信号
HAL_Delay (5) ;//写入周期
}
这里使用的函数都为赛事方所提供的I2C文件中取用。
至于最后的5ms延时则为写入周期,最大为5ms,可以从数据手册中得出。
At this time the EEPROM enters an internally timed write cycle, tWR (Write Cycle Time, Max = 5 ms) , to the nonvolatile memory. All inputs are disabled during this write cycle and the EEPROM will not respond until the
write is complete (see Figure 8 on page 10).
3、数据读取
这里也分为随机读和顺序读,这里讲随机读。
这里的随机指的是可以读取任意地址的数据,与写操作有不同点是需要先进行写入数据地址,再发送起始信号进行读操作。具体看图示理解即可。
1、产生起始信号
2、发送从机设备地址
3、发送读取的数据地址
4、再产生一次起始信号
5、发送从机设备地址
6、进行读取数据
7、产生停止信号
附上代码
u8 EEPROM_Read(u8 add)
{
u8 dat ;
I2CStart () ;
I2CSendByte (0xa0) ;
I2CWaitAck () ;
I2CSendByte (add) ;
I2CWaitAck () ;
I2CStart () ;
I2CSendByte (0xa1) ;
I2CWaitAck () ;
dat = I2CReceiveByte () ;
I2CSendNotAck () ;
I2CStop () ;
return (dat) ;
}
由于读操作要远快于写操作,所以这里不需要等待。
4、示例
EEPROM的作用主要是可以掉电保存数据,这样有一个我们常见的例子,那便是记录开机次数,我们可以通过EEPROM来记录。
I2CInit() ;
start_times = EEPROM_Read(0x01) ;
EEPROM_Write(0x01,start_times+=1) ;
文中所用的工程我会贴在下面,如有需要可自行下载,如果有疑问或者有什么错误之处还望留言指正。
链接:https://pan.baidu.com/s/1dFyC5LXKrUd9xnNVGy5-MA?pwd=1111
提取码:1111
更多推荐
所有评论(0)