1、概述
IIC总线是飞利浦公司发明的串行同步半双工通信总线。共有两根线,串行时钟线(SCL)和串行数据线(SDA),数据线可以实现数据的双向传输,IIC总线上的设备由主器件和从器件的区别,可以实现“一主多从”。每个从器件都有其唯一的器件地址,主器件与从器件之间的通信就是依赖唯一器件地址实现的。
2、通信协议
2.1 时序信号
空闲信号:时钟线与数据线都保持高电平。
起始信号:起始信号代表一个完整时序的开始,SCL时钟线保持高电平,SDA数据线经历了一个下降沿由高变低的跳变,生成一个起始信号。
结束信号:结束信号代表一个完整时序的结束,SCL时钟线保持高电平,SDA数据线经历了一个上升沿由低变高的跳变,生成一个结束信号。
应答信号:应答信号在8位数据后产生,表示数据接收情况,应答信号分为两种,分别是“应答信号”和“非应答信号”。
2.2 数据传输
SCL时钟线上的每一个脉冲信号,都会同时在SDA数据线上传输一个位的数据,IIC每次发送数据的字长为1个字节(8位),数据位由高(MSB)到低(LSB)传输。SDA数据线的状态表示需要传输的数据,高电平表示数字“1”,低电平表示数字“0”。SCL时钟线为高电平时,SDA数据线必须保持数据稳定(不允许数据更改),SCL时钟线为低电平时,SDA数据线可以进行电平改变(数据变化)。上升沿采集数据,下降沿准备数据。
2.3 控制字节
在起始信号之后,必须是器件的控制字节(也称为4+3+1)。控制器字节的作用是主器件找到需要通信的从器件,并且告诉从器件接下来需要执行的动作。控制字节是由7位地址+1位读写控制位组成。读写控制位如果为“0”,表示写操作,如果为“1”表示读操作。
3、软件模拟IIC时序
/*空闲信号*/
SCL_H; // 拉高SCL时钟线
SDA_H; // 拉高SDA数据线
/*起始信号*/
SCL_L; // 拉低SCL,防止改变数据线发送以外情况
SDA_H; // 拉高SDA数据线
SCL_H; // 拉高SCL时钟线
IIC_Dealy // 4.7us延时,SCL时钟线拉高后至少维持4.7us才能拉低SDA
SDA_L; // 拉低SDA数据线,出现下降沿表示起始信号
IIC_Dealy // 4.0us延时,SDA数据线产生起始信号后,需要维持4.0us
SCL_L; // 拉低SCL,防止改变数据线发送以外情况
/*结束信号*/
SCL_L; // 拉低SCL,防止改变数据线发送以外情况
SDA_L; // 拉低SDA数据线
SCL_H; // 拉高SCL时钟线
IIC_Dealy // 4.0us延时,SCL时钟线拉高后至少维持4.0us才能拉高SDA
SDA_H; // 拉高SDA数据线,出现上升沿表示结束信号
IIC_Dealy // 4.7us延时,结束信号和下一个起始信号之间至少间隔4.7u
/*发送应答信号*/
SCL_L; // 拉低SCL,防止改变数据线发送以外情况
IIC_Dealy // 4.7us延时,SCL时钟线的低电平必须保持4.7us宽度
SDA_L/H; // 拉低SDA数据线,产一个应答信号, 拉高SDA数据线,产一个非应答信号
SCL_H; // 拉高SCL时钟线,传输应答信号
IIC_Dealy // 4.0us延时,SCL时钟线的高电平必须保持4.0us宽度
SCL_L; // 拉低SCL,防止改变数据线发送以外情况
/*检测应答信号*/
SCL_L; // 拉低SCL,防止改变数据线发送以外情况
IIC_Dealy // 4.7us延时,SCL时钟线的低电平必须保持4.7us宽度
SCL_H; // 拉高SCL时钟线,传输应答信号
IIC_Dealy // 4.0us延时,SCL时钟线的高电平必须保持4.0us宽度
Read_SDA // 读取SDA数据线电平状态,高电平表示非应答,低电平表示应答
SCL_L; // 拉低SCL,防止改变数据线发送以外情况