再议IIC协议与设计【1】--通信是如何定义

来源:互联网 发布:程序员加油站 编辑:程序博客网 时间:2024/05/22 06:47

概述

在讨论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线才允许变化

也只有这样,才能在2-wire上完成这么多的状态对通信进行控制。

接下来,就详细地描述这些状态标志,这是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最基本的协议就先介绍到这里。


原创粉丝点击