前言

  这里如果大家急需要学习比赛内容可以直接从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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐