写这篇文章,主要是为了记录一下工作中用到的一些技术、协议等等,随时填充一些细节,方便后续需要,不用再到处找资料了。如有错误的地方,希望各位大佬予以指教!
一、IIC简介
IIC总线是一种半双工、同步的串行总线,主要用于近距离、低速的芯片之间通信。IIC是一种多主机多从机总线,但同一时刻有且只能有一个主机,只有主机有权发起和结束一次通信,从机只能被呼叫。
二、硬件连接
IIC有两条总线,一根为SDA用于发送和接收数据,一根为SCL用于通信双方时钟的同步,SDA、SCL都接上拉电阻,IIC空闲时两条总线都为高电平。其硬件结构简单,连接方式如图1所示。
三、通信过程
IIC总线上如果有多个主机同时启动总线时,IIC具有冲突检测和仲裁功能防止错误产生。通信过程如下:
主机开始发送起始信号启用总线
主机发送一个字节数据指明从机地址以及传输方向
被呼叫的从机发送应答信号
发送器发送一个字节数据
接收器发送应答信号
通信完成后主机发送停止信号并释放总线
1.起始信号和终止信号
SCL为高电平时,SDA由高变低表示起始信号
SCL为高电平时,SDA由低变高表示终止信号
只有主机才能发送起始信号和终止信号,产生起始信号后总线处于占用状态,其他主机不可以使用,终止信号产生后释放总线于空闲状态。
2.寻址方式
主机发送起始信号后必须发送一个字节数据,该数据高7位是从机地址,最低位为传输数据的方向,"0" 表示主机发送数据,"1" 表示从机发送数据,当一次通信的传输方向确定后,期间不可再改变。总线上所有从机接收到该字节后会与自己的地址作比较,如果相同则判断被主机呼叫,再通过最低位决定自己是发送器还是接收器。
3.数据传输与应答信号
IIC通信时每个字节必须为8位长度,发送数据时,与UART不同的是,IIC先发送最高位后发送最低位,当发送器传输完一个字节数据后,接收器要发送一位应答位(低电平)来回应发送器,当接收器不想接收数据时保持SDA为高电平,一帧共9位。
在数据传输时,需要注意的是:
SCL为低电平时,发送器发送数据,SDA在此期间电平可发生改变。
SCL为高电平时,接收器读取数据,SDA在此期间电平不可改变,需要保持稳定。
四、IIC经典时序
注:S为起始信号,P为终止信号,A表示应答,A非为非应答,深色表示主机发送数据
图6,主机首先发送一个起始信号,然后发送一个字节数据确定从机地址,0为主机发送数据,从机发送应答,当主机发送完数据或者从机不想再接收数据时不发送应答信号,主机发送终止信号。图7相反
第三种情况是当主机发送完数据后,想该从机再发送数据,但是之前说过当一次通信的传输方向确定后,期间不可再改变,这时需要主机再重新发送一次起始信号和一个字节的数据,确定从机地址和传输方向。
在这个时序中可以看到,除了起始信号和一个字节确定从机地址和传输方向是必须发送的,终止信号可以不发送。