I2C(IIC)属于两线式串行总线,用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线, 属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。连接到I2C中总线上的设备既可以用作主设备,也可以用作从设备。
物理I2C接口有两根双向线:串行时钟线(SCL)和双向串行数据线(SDA),可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。SDA负责在设备间传输串行数据,SCL负责产生同步时钟脉冲。
一、基础介绍
调I2C时序,主要在调数据写入write_I2C和数据读取read_I2C的机制。I2C主要实现数据的传输,使主机和从机的相互响应。它有一种数据传送机制。总结起来为:起始信号,终止信号、应答信号,读字节,写字节,数据读取和数据写入。
I2C基本架构:
Start_I2C
Stop_I2C
readack 读取应答信号
sendack and sendnack 输出应答或非应答
sendbyte
readbyte
write_I2C
read_I2C
二、I2C通信协议详解
SDA和SCL变化情况:
所有数据传输均起始于一个start,终于一个stop.
Start_I2C定义:SCL为高时,SDA从高到低转换;
Stop_I2C定义:SCL为高时,SDA从低到高转换;
数据有效性:SCL为高时,SDA的数据必须稳定;
只有SCL变低时,SDA的状态才能跳变。
1、空闲状态
SCL和SDA接上拉电阻,默认高电平,表示总线是空闲状态
2、主从设备
主设备负责控制通信,通过对数据传输进行初始化/终止化,来发送数据并产生所需的同步时钟脉冲。
从设备则是等待来自主设备的命令,并响应命令的接收。且同步时钟信号只能由主设备产生。
3、起始信号和结束信号
:
(1) I2C的起始位
void I2C_sendStart() //开始位
{
SDA=1; /*发送起始条件的数据信号*/
SCL=1;
SDA=0; /*发送起始信号*/
Delay_us(1);
SCL=0;
}
(2)I2C的结束位
Void sendstop()
{
SCL=0;
SDA=0; /*发送结束条件的数据信号*/
SCL=1;
while(SCL!=1) {
};
Delay_us(1);
SDA=1; Delay_us(1);
}
4、数据有效性
I2C总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为控制命令(START或STOP,也就是前面的起始信号和停止信号)。
从机地址发送完后可能会发送一些指令,依从机而定,然后开始传输数据,由主机或者从机发送,每个数据为8位,数据的字节数没有限制。在开始信号之后,SDA和SCL先都处于低电平,当要传输数据时SDA先为高,之后SCL再跳变为高,才可进行数据的传输:
5、应答信号
当SDA是低电平为有效应答(ACK),表示对方接收成功;
当SDA是高电平为无效应答(NACK),表示对方没有接收成功。
接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。
(1)、接收数据需向发送方发送应答:
void IIC_ack(u8 ack)
{
// 数据线设置为输出
SCL = 0;
delay_us(