IIC总线详解
作者:互联网
@
目录一.IIC简介
IIC(Inter-Integrated Circuit)集成电路总线,它是一种串行通信总线,又叫I2C,使用多主从架构,由飞利浦公司在1980年推出的。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,一般可达400kbps 以上,属于半双工同步传输型总线。
二.IIC物理层
IIC总线的硬件,是由一根数据线SDA,一根时钟线SCL构成。不同的器件,都是并联接在这两条线上,I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的
SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的
IIC总线通过上拉电阻接到电源VCC,电阻大小要根据设备实际测量。
总线空闲的时候,SDA和SCL都是高电平。
当其中一个设备拉低总线,整条线就全是低电平,器件与器件之间"与"关系。
三.IIC特点
通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(控制SCL的电平高低变换)谁就是主设备。
IIC主设备功能:主要产生时钟,产生起始信号和停止信号
IIC从设备功能:可编程的IIC地址检测,停止位检测
IIC的一个优点是它支持多主控(multimastering),其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
支持不同速率的通讯速度,标准速度(最高速度100kHZ),快速(最高400kHZ)
SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。
IIC是半双工,而不是全双工 ,同一时间只可以单向通信,IIC协议首先是发送从机硬件地址,然后发送命令,再发送数据/寄存器编号或者读取数据。IIC协议可以多字节连续读写数据。
各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。
四.IIC协议规则
1.总线时序图
在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。
2.初始(空闲)状态
因为IIC的 SCL 和SDA 都需要接上拉电阻,保证空闲状态的稳定性
所以IIC总线在空闲状态下SCL 和SDA都保持高电平
/**
* I2C初始化
*/
static void I2C_Init()
{
SCL_H(); //首先把时钟线拉高
delay_us(4);
SDA_H(); //在SCL为高的情况下把SDA拉高
delay_us(4);
}
3.开始信号
SCL保持高电平,SDA由高电平变为低电平后,延时(>4.7us),SCL变为低电平,比如发送设备唯一地址。
/**
* 产生IIC起始信号
* 1.先拉高SDA,在拉高SCL,空闲状态
* 2.拉低SDA SCL
*/
static void I2C_Start(void)
{
SDA_H();
SCL_H();
delay_us(5);
SDA_L();
delay_us(5);
SCL_L();
}
4.停止信号
停止信号:SCL保持高电平,SDA由低电平变为高电平。
/**
* 产生IIC停止信号
* 1.先拉低SDA,再拉低SCL
* 2.拉高SCL
* 3.拉高SDA
* 4.停止接收数据
*/
static void I2C_Stop(void)
{
SCL_L();
SDA_L(); //STOP:当SCL高时,数据由低变高
delay_us(4);
SCL_H();
SDA_H(); //发送I2C总线结束信号
delay_us(4);
}
5.应答信号
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。
应答信号:主机SCL拉高,读取从机SDA的电平,为低电平表示产生应答。
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
每发送一个字节(8个bit), 在一个字节传输的8个时钟后的第九个时钟期间,接收器接收数据后必须回一个ACK应答信号给发送器,这样才能进行数据传输。
应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答
/**
* 主机产生应答信号ACK
* 1.先拉低SCL,再拉低SDA
* 2.拉高SCL
* 3.拉低SCL
*/
static void I2C_Ack(void)
{
SCL_L(); //先拉低SCL,使得SDA数据可以发生改变
SDA_L(); //拉低SDA,产生应答信号
delay_us(2);
SCL_H();
delay_us(5);
SCL_L();
}
/**
* 主机不产生应答信号NACK
* 1.先拉低SCL,再拉高SDA
* 2.拉高SCL
* 3.拉低SCL
*/
static void I2C_NAck(void)
{
SCL_L(); //先拉低SCL,使得SDA数据可以发生改变
SDA_H(); //拉高SDA,不产生应答信号
delay_us(2);
SCL_H();
delay_us(5);
SCL_L();
}
5.通信格式
起始信号之后,可以连续传输多个字节。然后以停止信号结束这一帧数据的传输。
多数从设备的地址为7位或者10位,一般都用七位。
八位设备地址=7位从机地址+读/写地址,
地址是根据硬件配置的,只有地址匹配的设备,才会处理总线上的数据。
IIC的每一帧数据由9bit组成,
如果是发送数据,则包含 8bit数据+1bit ACK,
如果是设备地址数据,则8bit包含7bit设备地址 1bit方向。
五. 数据读写三种方式
1.单向发送数据
比如显示设备,一般情况下只需要写入数据,传输过程如下:
2.读取数据
3.先写寄存器地址,再读取该寄存器的数据
比如存储芯片,一般情况下要先制定存储地址,再读取数据。传输过程如下:
六 参考引用
标签:SCL,信号,应答,总线,详解,SDA,IIC 来源: https://www.cnblogs.com/Wei-Ting/p/16672999.html