原理图:
时序图:
代码都是根据时序图来编写,具体原理略显复杂,本文章暂时只分享速通技巧,掌握模块化即可。原理可搜索其他人的教程。
STM32CubeMX配置:
【不需要配置】
Keil5配置:
根据官方给出的资源包,在如下路径中:(路径根据自己存放路径略有不同)
D:\STM32\嵌入式资源数据包_STM32G4_2023\嵌入式资源数据包_STM32G4_2023\竞赛平台\3-底层驱动代码参考\I2C_HAL
找到如下两个文件:
将这两个文件拷贝到自己的工程文件夹中,例如我在这个工程中自己编写的代码保存在名字为bsp的文件夹中。
打开软件。
在左侧自己的bsp组中右键添加已经存在的文件:
选择刚刚复制粘贴的.c文件:
打开i2c_hal.c文件,根据时序图,编写如下两个函数:
uint8_t eeprom_read(uint8_t addr)
{
uint8_t data=0;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStop();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
data=I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return data;
}
void eeprom_write (uint8_t addr , uint8_t dat)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(dat);
I2CWaitAck();
I2CStop();
}
uint8_t eeprom_read(uint8_t addr) 函数可以从指定地址 addr 中读取对应的数据,大小为8位。
void eeprom_write (uint8_t addr , uint8_t dat) 函数可以在指定地址 addr 中写入数据 dat,大小为8位。
注意:
1、存数据不能存小数,如果要存比如说一位小数,就可以将这个数据先 ×10 再进行存储,读取的时候进行 ÷10 即可。
2、存数据如果超过8位大小,就可以将数据进行高八位和低八位的分开,将高八位和低八位分别写入某地址中,然后读取的时候再进行高八位和低八位的整合。
3、连续写入两个数据的时候,需要进行延时,10ms左右即可。
在main.c引入头文件:i2c_hal.h即可使用。
初始化:
I2CInit();
读取:
num=eeprom_read(8);//从地址8读取
写入:
eeprom_write(8,++num);
//连续写入两个值 之间必须加延迟函数
HAL_Delay(10);
eeprom_write(9,num++);