12IIC-EEPROM实验
IIC-EEPROM实现
蓝桥杯的IIC是通过软件实现的,即用GPIO模拟IIC通信
实验:利用IIC通信与EEPROM模块交互,实现数据的断电存储与读取,主要任务是了解EEPROM模块原理
温馨提示:以下涉及到官方的手册,在比赛时都会提供,且cubemx无需配置,官方提供的资料包中有相应库,只需移植,无需担心
一、IIC简介
IIC:inter intergrated circuit集成电路总线
同步串行:同步指需要一根时钟线,串行指只需要一根数据线,一根数据线代表不能多设备同时进行数据传输
半双工通信:双方设备可收可发,但同一时间只能一方收一方发
由时钟线SCL和数据线SDA两条线组成,接上拉电阻,总线空闲状态处于高电平
为使不同电压输出的器间能够互连,SCL和SDA开漏输出
总线支持多设备连接,允许多主机存在,每个设备都有唯一一个地址
二、IIC接口时序
这是IIC的重要部分,但这里主要以程序实现为主,不详解,网上关于IIC部分很全面,自行学习
三、手册原理图
以上是蓝桥杯官方产品手册中的IIC总线下接入的设备,可以看到几点关键信息:
- 芯片的IIC接口为:PB6(SCL)、PB7(SDA)
- 接入设备有两个:M24C02-WMN6TP(EEPROM)、MCP4017T-104ELT
四、AT24C02简介
本次实验的操作对象,通过看模块手册了解具体操作步骤
1.重要信息
-
可以看到:自定时写入周期(最大5 ms),说人话就是写入时间间隔要大于5ms,否则会导致下一个数据写入失败,重要!!!
-
AT24C02是2Kb串行EEPROM,内部组织为256*8bit,也就是256Byte
2.设备地址描述
我们只需要关注第一行即可,这个就是设备地址的8bit数据
后四位我们需要自己指定,其中最低为读写标志位,即这一次的IIC通信是往设备写(0)还是读(1),在发送设备地址时就指定好
其中A0、A1、A2我们可自己指定,换言之,可实现8个器件公用一个接口,因为2^3=8
3.具体时序操作图
3.1.字节写入
写入操作是从高位到低位进行的
由图可知:
1、开启IIC总线(前提是先初始化IIC)
2、传入设备地址,注意,设备地址的最后一位读写位需要置为0,即接下来是写操作
3、等待应答
4、传入写入设备内具体地址:比方:设备地址是班级,设备内具体地址是具体桌位;即要写入这个设备的具体哪个地方
5、等待应答
6、传入要写的8位数据
7、等待应答
8、IIC停止
以上的所有步骤,均由官方提供的库实现,在下方代码中会提供,只需简单调用即可
3.2.字节读取
如果上面的图能看懂,这个图也是换汤不换药,但有一点非常重要!
在第二次开启IIC时,传入的设备地址最后一位变为了1(读操作),要非常注意!!
在该模块的手册中还有其他操作,但本次实验只用到了上面说到的几个,也能覆盖大部分场景,其他的自行学习
五、代码实现
1.库移植
在官方资料包中,找到E:\蓝桥杯嵌入式个人笔记\第十六届蓝桥杯大赛省赛资源数据包(嵌入式)(新)\DP2025_ES\DP2025_ES\BSP\GPIO_I2C_HAL
文件i2c_hal.c
和i2c_hal.h
,复制到工程中自己的定义的库目录下,并将.c文件添加到keil中的对应目录即可
2.代码部分
//位于对应工程的i2c_hal.c内,配置好直接在my_main2.c内调用即可
void eeprom_write(uint8_t add, uint8_t dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
uint8_t eeprom_read(uint8_t add)
{
uint8_t data;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(add);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return data;
}