当前位置:文档之家› 通信接口介绍

通信接口介绍

一IIC通信现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和SPI (Serial Peripheral Interface)的身影。

原因是这两种通信协议非常适合近距离低速芯片间通信。

Philips (for IIC)和Motorola(for SPI)出于不同背景和市场需求制定了这两种标准通信协议。

IIC 开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互联方式。

电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互联微控制器和外围设备的。

要实现内存映射,设备必须并联入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。

为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了‘Inter-Integrated Circuit’,IIC 或IIC ,一种只使用二根线接连所有外围芯片的总线协议。

最初的标准定义总线速度为100kbps。

经历几次修订,主要是1995年的400kbps,1998的3.4Mbps。

有迹象表明,SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。

SPI总线是微控制器四线的外部总线(相对于内部总线)。

与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节。

IIC(INTER IC BUS)IIC的数据输入输出用的是一根线,但是由于IIC的数据线是双向的,所以隔离比较复杂,SPI则比较容易。

所以系统内部通信可用IIC,若要与外部通信则最好用SPI带隔离(可以提高抗干扰能力)。

但是IIC和SPI都不适合长距离传输。

IIC总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲裁机制,非常适合在器件之间进行近距离、非经常性的数据通信。

在它的协议体系中,传输数据时都会带上目的设备的设备地址,因此可以实现设备组网。

IIC通信:是两根线,发送的开始状态和结束状态都与SCL有关,SDA上先发送设备地址,后发送寄存器地址和数据。

硬件简单,软件协议稍微多点,比如开始状态,结束状态,数据变化状态对时序都有严格要求IIC 是多主设备的总线,IIC没有物理的芯片选择信号线,没有仲裁逻辑电路,只使用两条信号线——‘serial data’(SDA) 和‘serial clock’(SCL)。

IIC协议规定:1. 每一支IIC设备都有一个唯一的七位设备地址;2. 数据帧大小为8位的字节;3. 数据(帧)中的某些数据位用于控制通信的开始、停止、方向(读写)和应答机制。

IIC 数据传输速率有标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),另外一些变种实现了低速模式(10 kbps)和快速+模式(1 Mbps)。

物理实现上,IIC 总线由两根信号线和一根地线组成。

两根信号线都是双向传输的,参考下图。

IIC协议标准规定发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。

IIC 通信过程大概如下。

首先,主设备发一个START信号,这个信号就像对所有其它设备喊:请大家注意!然后其它设备开始监听总线以准备接收数据。

接着,主设备发送一个7位设备地址加一位的读写操作的数据帧。

当所设备接收数据后,比对地址自己是否目标设备。

如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,设备会发送一个应答信号——ACKNOWLEDGE作回应。

当主设备收到应答后便开始传送或接收数据。

数据帧大小为8位,尾随一位的应答信号。

主设备发送数据,从设备应答;相反主设备接数据,主设备应答。

当数据传送完毕,主设备发送一个STOP信号,向其它设备宣告释放总线,其它设备回到初始状态。

基于IIC总线的物理结构,总线上的START和STOP信号必定是唯一的。

另外,IIC总线标准规定SDA线的数据转换必须在SCL线的低电平期,在SCL线的高电平期,SDA线的上数据是稳定的。

在物理实现上,SCL线和SDA线都是漏极开路(open-drain),通过上拉电阻外加一个电压源,在总线没用工作的情况下,两根线默认为高电平。

当把线路接地时,线路为逻辑0,当释放线路,线路空闲时,线路为逻辑1。

基于这些特性,IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。

IIC总线设计只使用了两条线,但相当优雅地实现任意数目设备间无缝通信,堪称完美。

我们设想一下,如果有两支设备同时向SCL线和SDA线发送信息会出现什么情况。

基于IIC总线的设计,线路上不可能出现电平冲突现象。

如果一支设备发送逻辑0,其它发送逻辑1,那么线路看到的只有逻辑0。

也就是说,如果出现电平冲突,发送逻辑0的始终是“赢家”。

总线的物理结构亦允许主设备在往总线写数据的同时读取数据。

这样,任何设备都可以检测冲突的发生。

当两支主设备竞争总线的时候,“赢家”并不知道竞争的发生,只有“输家”发现了冲突——当“写一个逻辑1,却读到0时——而退出竞争。

10位设备地址: 任何IIC设备都有一个7位地址,理论上,现实中只能有127种不同的IIC设备。

实际上,已有IIC的设备种类远远多于这个限制,在一条总线上出现相同的地址的IIC设备的概率相当高。

为了突破这个限制,很多设备使用了双重地址——7位地址加引脚地址(external configuration pins)。

IIC 标准也预知了这种限制,提出10位的地址方案。

10位的地址方案对IIC协议的影响有两点:1.地址帧为两个字节长,原来的是一个字节;2. 第一个字节前五位最高有效位用作10位地址标识,约定是“11110”。

除了10位地址标识,标准还预留了一些地址码用作其它用途,如下表:时钟拉伸: 在IIC 通信中,主设备决定了时钟速度。

因为时钟脉冲信号是由主设备显式发出的。

但是,当从设备没办法跟上主设备的速度时,从设备需要一种机制来请求主设备慢一点。

这种机制称为时钟拉伸,而基于I²C结构的特殊性,这种机制得到实现。

当从设备需要降低传输的速度的时候,它可以按下时钟线,逼迫主设备进入等待状态,直到从设备释放时钟线,通信才继续。

高速模式: 原理上讲,使用上拉电阻来设置逻辑1会限制总线的最大传输速度。

而速度是限制总线应用的因素之一。

这也说明为什么要引入高速模式(3.4 Mbps)。

在发起一次高速模式传输前,主设备必须先在低速的模式下(例如快速模式)发出特定的“High Speed Master”信号。

为缩短信号的周期和提高总线速度,高速模式必须使用额外的I/O缓冲区。

另外,总线仲裁在高速模式下可屏蔽掉。

更多的信息请参与总线标准文档。

参考自:/uid-16100003-id-3059814.html关于IIC的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。

因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。

在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。

这表示该设备给出了一个ACK。

如果它不拉低SDA线,就表示不响应(NACK)。

另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。

总结下,IIC通讯中,SDA 和SCL 都是有主机控制的,从设备只是能够将SDA线拉低而已。

对于SCL线,从机是没有任何能力去控制的。

从机只能被动跟随SCL。

再说的清楚些:主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA线。

主机读取从机的数据的状态下:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。

//----------------------------------------补充@201108311142SDA和SCL已经通过上拉电阻被上拉,master可以控制(拉低或者释放)这两条线,而slaver 只能控制SDA线。

当master发送数据时,master会适时地将SDA和SCL拉低或释放(拉高)。

确切的时序应该是这样的:当mater要发送一个start时,mater会将SDA拉低,这就可以了,因为此时的SCL一定是High。

好了,一个start就这样发出去了。

而slaver也会发现这个start信号的发生,slaver 便会准备好接收接下来的数据了。

紧接着,master要发送一个Byte的数据了,一位一位的发出这8个bits。

这时master会先将SCL拉低,然后在SCL为低的状态下将一个bit准备好放到SDA上(比如要发送一个0,master就会通过拉低SDA来放好这个0),然后master会把SCL拉高(释放),此时slaver会立刻检测到SCL的变化,由此聪明的slaver 便知道master已经将要发送的那个bit准备好了,slaver便会在这个SCL的高电平期间尽快(maser不会等你很久的哦)去读取一下SDA,嗯读到了一个0,slaver就把这个0放到自己的移位寄存器中待后续处理。

master会在一个设定好的时间后把SCL再次拉低,然后在SCL为低电平期间把下一个bit放到SDA上,然后再把SCL拉高,然后slaver在SCL的高电平期间再去读SDA。

如此反复8次,一个Byte的传输便告结束。

当这8个bit 发完后,SCL是处于低电平的(被master拉低的),SDA是出于高电平的(master已经释放了SDA)。

当一个字节发送完毕后,master会释放SDA(拉高)并拉低SCL,此时slaver如果打算发出一个ACK的话,它必须在这个SCL被master拉低的短暂时间内去主动将SDA拉低并保持住 (此前我们说过,SDA此时已经被master释放,所以slaver才有机会去拉低这个SDA)。

master会在一个确定的时间后再次将SCL拉高,并在拉高的期间去读取SDA线的状态,如果读到低电平,则认为收到了来自slaver的响应(ACK),否则认为slaver没有响应(NACK)刚才发送的那一个Byte。

这个过程就是我们说的i2c通讯中的第9个时钟周期。

相关主题