本文将带大家了解IIC协议,并带大家编写AT24C02的驱动代码。
通过原理图可以看到AT24C02有SCL和SDA两根线,这两根线分别是时钟线和数据线。
SCL和SDA对应的引脚分别是PB6和PB7,这两个器件都是挂接在同一个IIC总线下的。

这里我就不多说了,大家可以去看我之前写的文章。
IIC通信协议
这里我们可以看到i2c_hal.c和i2c_hal.h两个文件,将这两个文件都添加进我们自己的工程当中。

把.c文件放入Src中.h文件放入Inc中。

将.c文件添加进来即可

AT24C02是一个2K的芯片,所以我们只需要看画红线的部分确定器件地址。

高4位的地址已经确定了,我们只需要判读低4位地址即可得出AT24C02的地址。A0-A2分别对应了上面原理图的E1-E3这三个引脚都接地,所以只需得出最后一位就行了。最后一位是根据读写来区分的,当最后一位为R时就代表的是1,最后一位为W时就代表的是0。
所以最后一位为R时,器件地址为0x91,所以最后一位为W时,器件地址为0x90。
这里看到读时序图
1.主机先发送start信号开始
2.发送器件地址
3.等待回应
4.发送想要写入AT24C02内部的哪个地址(AT24C02的地址是0-255)
5.等待回应
6.写入数据
7.等待回应
8.发送停止信号
这里最后加一个延时函数是因为发送一个字节的数据后需要等待一段时间后才可继续发送。
void EEPROM_Write(uint8_t add, uint8_t data)
{I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CSendByte(data);I2CWaitAck();I2CStop();HAL_Delay(5);
}

这里需要先发送AT24C02的地址,因为只有找到了AT24C02才能够读取数据。
这个就留给大家自己分析了。
uint8_t EEPROM_Read(uint8_t add)
{uint8_t data = 0;I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(add);I2CWaitAck();I2CStart();I2CSendByte(0xa1);I2CWaitAck();data = I2CReceiveByte();I2CSendNotAck(); I2CStop(); return data;
}
这里要先初始化IIC后才能使用AT24C02。
读写函数操作很简单,大家自己去实验一下即可。
I2CInit();u8 data = 0;
EEPROM_Write(0x01, 0x40);
data = EEPROM_Read(0x01);
有不懂的请留言。