
基于 I2C 协议向 EEPROM 写入单字节数据的函数
功能是将数据 dat 写入到指定地址 addr 中。
void eeprom_write(uint8_t addr,uint8_t dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
HAL_Delay(20);
}
启动通信并发送设备地址
- I2CStart():发起 I2C 起始信号,开始通信。
- I2CSendByte(0xa0):发送 EEPROM 写设备地址(0xa0 高 7 位为设备地址,最低位 0 表示写操作)。
- I2CWaitAck():等待 EEPROM 应答,确认设备已响应。
发送目标地址与数据
- I2CSendByte(addr):发送要写入的目标存储单元地址。
- I2CWaitAck():等待应答,确认地址已被接收。
- I2CSendByte(dat):发送要写入的数据字节。
- I2CWaitAck():等待应答,确认数据已被接收。
结束通信与等待写入完成
- I2CStop():发送停止信号,结束本次 I2C 通信。
- HAL_Delay(20):延迟 20ms,等待 EEPROM 内部完成数据写入(EEPROM 写入需要时间,此延迟可避免后续操作冲突)。
基于 I2C 协议读取 EEPROM 设备数据的函数
功能是从指定地址 addr 读取一个字节的数据。
uint8_t eeprom_read(uint8_t addr)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
uint8_t dat=I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return dat;
}
第一阶段:写入目标地址
- I2CStart():发起 I2C 起始信号,启动通信。
- I2CSendByte(0xa0):发送 EEPROM 写设备地址(0xa0 是常见的 EEPROM 写地址,高 7 位为设备地址,最低位 0 表示写操作)。
- I2CWaitAck():等待从设备(EEPROM)的应答信号,确认设备已准备好。
- I2CSendByte(addr):发送要读取的目标存储单元地址。
- I2CWaitAck():再次等待应答,确认地址已被接收。
- I2CStop():发送停止信号,结束写地址阶段。
第二阶段:读取数据
- I2CStart():再次发起起始信号,开启新一轮通信。
- I2CSendByte(0xa1):发送 EEPROM 读设备地址(0xa1 最低位 1 表示读操作)。
- I2CWaitAck():等待设备应答。
- uint8_t dat=I2CReceiveByte():从总线上读取一个字节的数据并保存到变量 dat。
- I2CSendNotAck():发送非应答信号(NACK),告诉设备不需要再发送数据。
- I2CStop():发送停止信号,结束本次通信。
返回结果
- return dat:将读取到的数据返回给调用者。




