IIC总线接口
IIC总线接口
IIC是两线式串行同步总线,通信时使用两根线:SDA(数据线) SCL(时钟线),空闲状态的时候,这两根线上都保持高电平,将来要开始传输数据了。
首先要发送一个起始信号,这个起始信号是主设备给从设备发的,什么叫起始信号的?就是时钟线处于高电平期间,数据线由高到低产生一个下降沿,这就是起始信号。
产生完起始信号以后,主设备要先往数据线上发一个七位的设备地址。发七位的设备地址就是告诉我这个总线上的所有设备,我现在要和哪一个从设备进行通信了。
再有,发完这个设备地址我要加一个读位或者写位,读的话是高电低的,写的话是低电平,告诉具体的设备,要从里边读数据,还是往这里边写数据。
发送设备地址是采用的是高位先出,先发送设备地址的高位。发送完设备地址以后,等待着从设备给数据线上发一个ack信号,也就是从设备已经收到指令了,已经知道要通信了,从设备要回主设备一个ack,如果主设备收到了ack以后,主设备就可以从里边读数据或者往里边写数据了。每次读数据也好,写数据也好,都要读或写一个字节的数据。然后同样每次读完以后,主设备如果是读,主设备要给从设备回一个ack,如果是往里写的话,写进去以后,从设备要给主设备回一个ack。然后一这个过程可以一直重复读,发送完最后一个字节,或者读取完最后一个字节,要响应一个notack的信号,然后最后发送一个stop型号。所谓stop信号就是在scl处于高电平期间,sda线上的电由低到高产生一个上升沿,这就是所谓的iic总线的通信时序。靠一根时钟线去保证数据的同步。通信双方就在通信之前就不用再协商协议了,就靠这一根时钟线上的时钟信号通信就ok了。通信的时候采用的是低送高取,scl处于低电频期间,你把数据给我放到数据线上,接收方在scl处于高电频期间把数据取走,这就是所谓的低送高取。
定义
IIC时由飞利浦公司开发的两线式串行同步总线,顾名思义通信时使用两根线,时钟线(SCL)和数据线(SDA)
在IIC控制器上的数据线和时钟线上可以挂载N多个设备,例如EEPRCOM、G-SENSOR、日历时钟、AD转换器,还可以挂接其他的MCU。挂接的设备也需要有时钟线和数据线,连接之后MCU就可以读取相应数据。
一个时钟周期传输一位,并支持总线仲裁
UART和IIC的对比
UART只有一个数据线,没有时钟线;IIC有数据线和时钟线
UART没有时钟线,所以通信之前需要协商好通信的时序(协议)
IIC由于有时钟线,可以自己调节读写的时序
IIC的时序
IIC的特点
- 硬件互联时只有两根线,硬件互联的成本低
- 一条IIC总线上可以挂载多个设备,设备有主从之分,每次通信的开始和结束都是由主设备决定
- 各个辅助信号
- 空闲状态:SDA和SCL都呈现高电平
- 起始位:SCL处于高电平期间,SDA由高变低,出现一个下降沿
- 停止位:SCL处于高电平期间,SDA由低变高,出现一个上升沿
- 数据位:低送高取,每次只能发8bit。SCL处于低电平期间,将数据放到SDA上;SCL处于高电平期间,将数据从SDA取走
- ACK(应答):第9个时钟周期,SCL处于高电平期间,接收方将SDA拉低
- NACK(not应答):第9个时钟周期,SCL处于高电平期间,接收方将SDA拉高
- 高位先出,低送高取
- 每一个IIC设备都有一个7bit的设备地址
- 主设备写数据给从设备
1 | 主设备发送start |







