有关于IIC硬件部分,我这里就不多做介绍了。
首先我们要知道什么是IIC协议?
简单的说IIC就一种主从架构的串行通信总线协议,其实这句话如果你能理解到位的话,那么对IIC的理解也就差不多了。既然是一种通讯协议那么必然有他的一些规则和特性在里面,下面我们就先来谈一谈他们的特性和规则。
首先是IIC的特性,这里我一一举例并结合我的理解加以说明。
1.最直观的我们知道IIC有两条总线线路,分别是:一条串行数据线 (SDA )一条串行时钟线(SCL)。关于数据线大家也很明白就是用来传输数据的,且这条数据线是双向传输的,而SCL时钟线是由主机(一般指MCU)主动发起的方波信号,请注意下主动一词!主动表示了数据的发送和接收都是由主机来控制,也就是说从机是不能主动通过SDA总线返回数据的,它总是被主机访问,这点我相信开发过IIC协议的人应该能理解。这是IIC总线的重要特性之一。
2.IIC总线上的器件都有唯一的器件地址。器件地址也称为从机地址,这个地址规定为7bit长度的地址,也有的是10bit的地址。图下图所示,后面的第 8bit 是数据的读写为,具体表示为:0 表示写,1 表示读。
这里有个问题为什么要是唯一的地址?因为在IIC总线中是支持一主多从的,如果有器件地址是一样的,那么相同地址的从器件就都会响应请求,如此一来SDA线的数据就会发生混乱和冲突。那么我们如何知道或者设定一个器件的IIC地址呢?
接着往下看,IIC上的每个器件都有一个地址寄存器来确定自己的地址,绝大多数的器件是通过硬件来确定地址的。具体的意思就是每个器件(这里的器件可以是温湿度传感器,时钟芯片等)在出厂的时候就已经设置好了他的IIC器件地址,所以我们在一些器件的datasheet中可以看到他的IIC地址已经是确定的了,用户不可更改。还有的是确定了器件的前几位,剩下几位由用户自行来决定,如下图的A0,A1,A2就是设置地址的外部引脚,可以通过将引脚置高或置低来确定器件的最后几位的地址,。
3.如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏。IIC可以实现多主机通讯,但实际上我也没使用过。
下面开始说说IIC的规则:
开始和结束的条件:
前面说过SDA 和 SCL 都是双向线路,通过电流源或者上拉电阻连接到一个正向电压(通常是VDD)当总线空闲时,两条线都是高电平。开始和终止条件如上图,所有的传输都由一个 START(S)开始,有一个 STOP(P)终止.START 条件是当 SCL 高时 SDA 从高到低;STOP 条件是 SCL 高时 SDA 从低到高。这里我想再次强调下,开始条件和终止条件一直都是由主机产生的。在开始条件后总线就处于忙状态了,而在停止条件隔上一个固定时间后总线就会处于空闲状态。但如果没有终止条件产生,而是一个重复产生的开始条件,那总线依旧是忙的状态。
数据的有效性:
数据的有效性其实就是数据的采样。通过上图我们可以看出,SCL是一个一个类似方波的信号,当SCL开始从低电平变为高电平时代表数据要开始采样了,在SCL高电平稳定时这个时候如果SDA是高电平代表数据就是1,是低电平代表数据就是0,以此类推完成8个bit的传送。所以我们经常说在时钟为高电平期间 SDA 线上的数据为什么要保持稳定的原因。当SCL从高电平变化到为低电平期间就把1bit的数据传输了出去,这时SCL为低电平,数据线SDA才可以改变高低电平状态准备下一个要传输的数据,所以每个数据位的传输都需要一个时钟的产生。
ACK和NACK
在我们传送完一个字节过后,规定从机要给主机一个ACK信号,这个信号告诉主机已经成功接收数据并准备好接收下一个数据,如下图所示:在SCL为高电平时,接受设备将SDA拉为低电平(即主机采到bit为0)表示传输正确,产生应答,否则为非应答。
如果从机产生了非应答,那么就不再接受数据了,所以一般在产生NACK的后面是紧跟STOP信号的。