概述
在讨论IIC的时候,无需一头扎进IIC协议中去分析文档,根据以下的步骤来分析,就能很明确地知道IIC的协议,以及如何设计IIC主机或者从机。
初识IIC
在实际的电路设计中,两个芯片(IC)需要互相通信,发生数据的交换。那么这两个芯片之间必须满足一些规则,这样,负责“听”的芯片就能“听懂”“说”的那个芯片“说了些什么”。与人类交流原理相通,“听者”首先需要知道“说者”是对哪个“听者”发出命令,并且需要需要“说者”以“听者”能听的懂的语言来沟通交流(通信方式)。同时,“说者”说话的频率不能太快,以保证“听者”能清楚地知道所要表达的意思(通信频率)。这些合在一起就构成了IIC的通讯协议。
图1
那么IIC到底是什么呢?定义如下:IIC即Inter-Integrated Circuit,是由飞利浦半导体在上世纪八十年代设计出来的一种串行总线,主要是用来连接整体电路。在IIC刚设计出来的时候,因为其简单,双向通信,二线制,同步设计等优点,迅速地成为芯片间互联的一个优势选择。在整个电路板上,可以使用一个IIC主控制器,其他的所有芯片,都挂在同一个IIC总线结构下。这样就可以完成整个系统中所有的芯片的数据传输。最大的优点是简化了信号传输的总线接口(2-wire)。同时,IIC的通信速度有两种,一种为普通模式下的100KHz,另一种为高速模式下的400KHz.
图2
在上图2中,区分了IIC设备的主设备(Master)和从设备(Slave),无论Master还是Slave都具有一个地址Address,这个地址即为设备的“标识符”。通过访问设备的“标识符”就能与设备进行通讯。在具体的设计中,需要明确哪个是主设备(Master),即信号的发起者,哪个是从设备(Slave),即信号的接收者。所描述的“信号的发起者”或者“信号的接收者”,可以看成是那个器件在发出SCL信号。对于SDA来说,它是一个双向的单bit信号,这就是IIC为什么是双向通信的原因了。
Master与Slave进行通信,既要向Slave中“写入”数据,也要从Slave中“读取”数据。而无论读入或者写出的数据,都是一位一位地从SDA线上传输的。
通信过程
由上面的介绍可以知道,对于设备来说,它有一个“标识符”,即设备地址,一般的设备地址是7bit的,留出来一个bit来做“读”或者“写”的标志。从设备接收到主机所发送的设备地址和读写标志后,首先判断设备地址是否为自己的地址,如果地址匹配成功,其次才开始响应读写标志位。当从设备响应完成后,设备进入Ready状态,准备接收主设备发送的后续数据。当主机发送完一个字节(8bit)的数据后,从机一般会返回一个响应(ACK)标志,用来通知主机,接收成功。
详细介绍
上面对通信过程进行介绍的时候,有几个问题没有解决:
- 数据通信何时开始 / 何时结束
- ACK信号怎样表示 / NACK信号怎样表示
- ACK / NACK信号什么时候存在
带着以上的问题再重新回看IIC通信。SDA和SCL总线,在空闲不进行通信的时候,是处于高电平状态,即SDA 和SCL都为逻辑1。我们都知道,数据在传输的过程中,都是由时钟的边沿将数据送入到器件中。即芯片在时钟边沿对数据进行采样的时候,必须要保证数据线稳定不变。在这里需要保证在SCL为高电平的时候,保持SDA稳定不变,这样才能将数据稳定地送入到芯片中。所以我们可以将IIC总结如下:
- SCL为高,SDA发生变化,即为发生了特殊状态(ACK, NACK, START, STOP)
- SCL为地,SDA发生变化,即为数据端发生跳变,这个是无影响的。
- IIC总线在数据传输时,时钟信号为高电平,数据线上的数据必须保持稳定,只有在SCL上的信号为低电平时,SDA线才允许变化
接下来,就详细地描述这些状态标志,这是IIC通信协议的核心。
START和STOP信号
SCL为高电平期间,SDA由高电平向低电平变化表示为起始信号;
SCL为高电平期间,SDA由低电平向高电平变化表示为终止信号。
图 3
起始信号和终止信号都是由主机发出的,在此时,从机仅处于空闲状态。当起始信号产生后,总线就处被占用的状态;在终止信号产生后,总线又回到了空闲状态(SCL = 1 SDA = 1).
接收器件分为两种,一种是内部集成了IIC控制器,另外一种是使用GPIO来模拟IIC控制器。无论哪种,主机在发送START后,会紧接着发送一个完整的数据字节,从机接收这个数据字节,但有可能从机在接收完成后,无法立即响应以接收下一个字节(从机可能在处理中断等),这时候从机会将SCL线拉底到低电平,从而使主机处于等待状态,直到从机准备好接收下一个字节,才释放SCL使其回到高电平。
ACK和NACK信号
每一个完整的传输都必须保证是一个字节的传输(8bit),在传输过程中是由MSB到LSB进行传输的,每一个字节传输完成后都必须跟随一位应答信号,即每一个完成的传输是9bit。
图 4
需要注意的是,并非每一次字节传输完成后都会有ACK信号,有以下三种情况例外:
- 当从机无法响应主机发送给从机的地址时(例如从机正忙,这个地址错误等)在第9个SCL周期内SDA没有被拉低,即没有ACK信号,这是主机会发送一个STOP标志来终止信号的传输或者重新发出一个RESTART信号请求新的传输。
- 如果从机接收器在传输过程中不能接收更多的数据时,它也不会发出ACK标志,这样主机在接收不到ACK标志的时候就会发出一个STOP信号来终止传输或者重新发出一个RESTART信号来请求新的传输。
- 主机接收器在接收到最后一个字节后,也不会发出ACK信号,于是从机释放SDA线,以允许主机发送STOP信号来结束传输。
以上可以总结为:对主机来说,它会不断地检测在SCL处于第9周期时SDA是否为低,只要发现为低,那么主机在接下来就会发出STOP信号。
总线数据传输过程
常见的几种数据传输
- 主机向从机发送数据,数据传输方向在整个传输过程中不变化
图 5
- 主机在发送完从机地址后,立即从从机读取数据
图 6
- 在传输过程中,当需要改变数据传输方向时,起始信号和从机地址都要重新发送一次
图 7
至此,IIC最基本的协议就先介绍到这里。