I2C是一种串行通讯总线,由于只有串行数据线SDA和串行时钟线SCL两个总线而被广泛使用。
I2C软件模拟通信的本质是用芯片上任意两个引脚模拟I2C通信,也就是说通过控制任意两个引脚电平的高低变化来模拟I2C时序。写代码之前,需要非常熟悉I2C时序图。
准备基础知识:
如下I2C时序图,I2C总线在空闲状态下SCL和SDA都保持高电平。
I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA 由高向低时,开始传送数据。
结束信号:SCL为高电平时,SDA 由低向高时,结束传送数据。
应答信号:在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。
本项目所用芯片STM32F103RCT6,最小系统自带I2C存储器AT24C02,原理图如下:
由于I2C可以接多个主设备,多个从设备(外围设备),因此进行通讯是需要进行器件寻址,以此分辨是于哪个设备进行通讯,每个设备地址唯一。
EEPROM器件寻址:起始条件使能芯片读写操作后,EEPROM都要求有8位的器件地址信息。该器件地址信息的LSB为读/写操作选择位,高为读操作,低为写操作。若比较器件地址一致,EEPRON输出应答立答“0”。如果不一致,则返向待机状态。
AT24C系列E2PROM芯片地址的固定部分为1010。设备地址需要看芯片引脚的具体连接情况,本项目中1,2,3引脚均接地,则A2,A1,A0三位均为0,因此写地址为10100000,即0xA0;读地址为10100001,即0xA1。
要点:
模拟I2C是GPIO应设置为通用开漏输出或通用推挽输出,电平每跳变一次,需要加延时函数。
设备地址需要看芯片引脚的具体连接情况,数据地址的长度根据芯片不同而不同。
SCL时钟电平为低时,才可以改换SDA数据线的电平,SCL为高时SDA必须保持稳定。SDA数据在SCL时钟为低电平时准备好,在SCL上升沿的过程发送出去。