I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。
以下是STM32 I2C的一些特点和使用方式:
1)支持多主机模式:STM32 I2C总线支持多主机模式,可以进行多个设备之间的通信。
2)支持多种数据传输方式:STM32 I2C总线支持不同的数据传输方式,如使用7位或10位地址、读取或写入数据,以及使用不同的数据传输模式(如批处理、字节模式等)。
3)支持高速模式:STM32 I2C总线支持高达400kHz的高速模式,这使得它非常适合数据传输速度较快的应用。
4)易于使用:STM32 I2C总线通过硬件支持,使得I2C通信的配置和操作非常简单。通常使用I2C库函数实现数据传输。
5)支持嵌套式架构:STM32 I2C总线是为嵌入式应用程序设计的,适用于不同的嵌套式架构。
2,EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。EEPROM常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPOM 芯片最常用的通讯方式就是 I2C 协议。
在此,以经典的24C65举例。
原理图:
24C65读写手册:
写时序:(每次写一位)
读时序:(每次可以读取n位)
步骤:
(1)PB6,PB7设置为I2C;使能I2C
(2)使能串口1(USART1)
(3)使能时钟:外部晶振,配置时钟
程序:
#define ReadAddr 0xA1 //定义读地址
#define WriteAddr 0xA0 //定义写地址
uint8_t Wbuf[20] = "EEPROM TEST OK!";
uint8_t Rbuf[20] = {0};
void Eeprom_Write(uint16_t MemAddr, uint8_t *Wbuf, uint16_t len) //24C65写数据函数
{ //写内存的地址,写的内容数据,写的长度
while(len--)
{
while(HAL_I2C_Mem_Write(&hi2c1, WriteAddr, MemAddr, I2C_MEMADD_SIZE_16BIT, Wbuf, 1, 100) != HAL_OK); //判断写的操作是否正确
//句柄,写的地址,从设备地址,地址单元的大小,写的数据(参数),每次写1个数据,超时时间
MemAddr++; //内存地址往上加
Wbuf++; //写下一个内容
}
}
void Eeprom_Read(uint16_t MemAddr, uint8_t *Rbuf, uint16_t len) //24C65读数据函数
{ //读设备的哪一个地址,读的地址放Rbuf里面,读取长度
while(HAL_I2C_Mem_Read(&hi2c1, ReadAddr, MemAddr, I2C_MEMADD_SIZE_16BIT, Rbuf, len, 100) != HAL_OK);
//句柄,读的设备地址,上层接口传递的地址,地址单元的宽度,读取数据存放地方,读取长度,超时时间
}
int main()
{
printf("this is I2C_EEPROM test\n");
Eeprom_Write(0, Wbuf, sizeof(Wbuf));//0地址写数据,要写的数据,数据长度
HAL_Delay(500);
Eeprom_Read( 0, Rbuf, sizeof(Rbuf));//从0地址读,读到的数据存放Rbuf,读取长度
printf("READ: %s\n",Rbuf);
}
运行结果:
注意:在使用STM32 I2C时,需要对总线空闲状态进行检测,以确保读写操作的成功。STM32 I2C总线还支持DMA传输方式,可以更方便地传输大量数据。