Advertisement

关于I²C和SPI总线协议

阅读量:

I²C和SPI是两种广泛使用的数字通信协议,主要用于嵌入式系统中的近距离低速芯片间通信。I²C是多主设备的总线协议,使用两条信号线(SDA和SCL)和一个地线,支持多设备仲裁,但地址空间有限,需使用10位地址方案。SPI是四线总线协议,支持单主设备通信,但无物理仲裁逻辑,需通过外部协议实现多设备通信。I²C在数据吞吐量和优雅性上更具优势,但SPI在扩展性和高速模式实现上更灵活。两协议各有优劣,I²C适合多主设备应用,SPI适合单主设备数据流传输。

《关于I²C和SPI总线协议》

出乎意料地超越了asio的性能,我想归功于其简洁的设计和高效的代码。

来源:刘建文 | 学术半·IT歌·文 作者:刘建文 关键词:8051 数字电子 数据通信

永久链接地址:http://arttech.us/y-2011/introduction-to-i²c-and-spi- protocols.html

Postmeta选项配置:i²c和SPI协议的深入介绍

Postmeta选项配置:i²c和SPI协议的深入介绍

后端设置选项页面

令人意外地比 asio 性能更卓越,我认为这归功于其简单的设计和简洁的代码。

源自《Introduction to I²C and SPI protocols》 刘建文略译

I²C vs SPI

目前,在低端数字通信应用领域,I²C和SPI协议广泛应用于各种设备中。其主要原因在于这两种通信协议专为近距离低速芯片间的通信设计。为了满足不同芯片设计的需求,Philips制定了I²C标准,而Motorola则制定了SPI标准。

I²C始于1982年,其初衷是为电视内置入式系统中的CPU及周边芯片提供一种更为简便的互联方法。电视系统是 earliest embedded systems之一,而最初的嵌入式系统架构多采用 memory-mapped I/O 方式。内存映射的实现需要将数据线和地址线直接连接到微控制器,这种方式在连接多个外设时需要大量的连接线和额外的地址解码芯片,不仅操作复杂,而且成本较高。

为了减少微控制器的引脚数量以及额外的逻辑芯片数量,从而简化了印刷电路板的设计并降低了制造成本,荷兰的菲利普斯实验室于1971年开发了“Inter-Integrated Circuit”(IIC),即I²C协议。该协议只需两根线连接所有外围芯片。最初的速度设定为100kbps。经过多次修订,主要在1995年提升至400kbps,1998年进一步优化至3.4Mbps。

SPI总线最初于1979年推出,由Motorola将其整合到其第一款基于68000微处理器的微控制器芯片中。作为微控制器的四线外部总线(与内部总线相对),SPI总线在设计上与I²C不同,它没有明确的标准,更多是基于事实的约定。对于通信操作的实现,SPI仅提供抽象描述,而芯片厂商与驱动开发者则通过数据手册和应用说明来沟通实现细节。

SPI

对于熟悉数字电路设计的工程师来说,使用SPI协议连接两台数字设备非常直观。SPI即为一种四个引脚的四线协议(如图):

SCLK为串行时钟,取自主控输出;
Master Output/Slave Input,取自主控;
Master Input/Slave Output,取自从端;
Slave Select pin,主控输出,低电平有效。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-01.jpg)

SPI是一种单主设备( single-master )通信协议,这意味着总线中只有一个中心设备能够发起通信。当SPI主设备试图读取或写入到[从设备]时,它首先将[从设备]对应的SS线拉低,随后发送工作脉冲至时钟线上。在相应的脉冲时间点上, SPI主设备通过发送信号至MOSI端口来实现“写”操作的同时,也能对MISO进行采样以实现“读”操作,如下图所示。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-02.jpg)

SPI支持四种操作模式,即模式0、模式1、模式2和模式3。这些模式的主要区别在于它们分别定义了时钟脉冲上升沿和下降沿时的输出信号切换(toggles)行为,以及输入信号采样的边沿。此外,每个模式的时钟脉冲稳定电平值也有所区别,即在时钟信号无效时,时钟电平是高电平还是低电平。每种模式由两个参数来描述,即时钟极(clock polarity)CPOL和时钟期(clock phase)CPHA。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-03.jpg)

主从设备必须确保使用相同的SCLK、CPOL和CPHASE参数以正常运行。当存在多个从设备时,若它们采用了不同的工作参数,主设备则需在读写不同从设备之间重新配置这些参数。

本节将介绍SPI总线协议的主要内容。SPI并未规定最大传输速率,也无地址编码机制;SPI未规定通信应答机制,也未规定流控制规则。值得注意的是,SPI主设备甚至并不清楚指定的从设备是否存在。这些通信控制功能必须在此基础上自行实现。例如,要使用SPI连接一块命令-响应控制型解码器芯片,则必须在此基础上实现更高级的通信协议。

SPI不考虑物理接口的电气特性,如信号的标准电压。最初,SPI应用多采用间断性时钟脉冲和按字节传输数据的方式,如今则有多种变种实现了连续性时钟脉冲和任意数据帧长度。

I²C

与SPI的单主设备不同,I²C总线是多主设备的总线,I²C总线没有物理的芯片选择信号线,也没有仲裁逻辑电路,仅使用两条信号线——“serial data” (SDA) 和“serial clock” (SCL)。本节仅限于介绍I²C总线的基本组成,其详细协议规定将在后续章节中介绍。

每支IIC设备都具有一个独一无二的七位数设备地址。每个数据帧的长度为8位。每个数据帧中的特定数据位用于控制通信的开始、停止、方向(读写)功能和应答机制。

I²C数据传输速率遵循标准模式(100 kbps)、快速模式(400 kbps)和高速模式(3.4 Mbps),同时一些变种支持了低速模式(10 kbps)和快速+模式(1 Mbps)。

从物理实现的角度来看,I²C总线由两根传输线和一根地线构成。这两根传输线均支持双向通信功能,具体电路图如图所示。按照I²C协议标准,发起通信的设备被定义为主设备,且在每次通信中,主设备将剩余的从设备依次作为通信伙伴。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-04.jpg)

I²C通信流程大致如下:首先,主设备向所有从属设备发送一个START命令,类似于发出一个 universal 的呼叫指令。各从属设备接收到该命令后,进入监听状态,准备接收数据。随后,主设备发送一个包含7位设备地址和一个读写操作的数据帧。各从属设备接收到数据后,会确认接收到的数据地址是否为目标设备地址。如果地址不匹配,设备将进入等待状态以等待STOP信号的到来;如果地址匹配,设备将发送ACKNOWLEDGE应答信号以确认操作成功。

当主设备响应应答后,便开始主动发起数据传输。每个数据帧占据8位,随后的一位为应答信号。当主设备发送数据时,从设备获得应答;反之,当主设备接收数据时,也会向设备发送应答。数据传输完成之后,主设备发送一个STOP信号,向其他设备发出释放总线的指令,其他设备随后返回初始状态。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-05.jpg)

基于I²C总线的物理结构,总线上的START和STOP信号必须唯一。此外,I²C总线标准规定SDA线的数据转换必须在SCL线的低电平期间进行。同时,在SCL线的高电平期间,SDA线的上电数据保持稳定。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-06.jpg)

在物理实现方面,SCL线和SDA线采用了漏极开路方式,通过上拉电阻和电压源的组合实现功能。当线路被接地时,其逻辑状态为0;当断开接地时,其逻辑状态为1。基于这些特性,IIC设备的操作逻辑仅包括将总线接地以输出逻辑0。

I²C总线设计仅使用了两条线,但极其巧妙地实现了任意数量设备间的无缝通信,堪称完美。假设两台设备同时向SCL线和SDA线发送数据,会发生什么情况?

基于I²C总线的架构设计,线路在设计架构时实现了电平冲突的完全消除。当一组设备发送逻辑0时,另一组发送逻辑1,此时线路仅检测到逻辑0的状态。由此可见,当电平冲突发生时,最先发送逻辑0的设备能够成功竞争并占据线路。

总线的物理结构允许主设备在进行写入操作的同时完成读取操作。这样,任何设备都可以检测到总线冲突的发生。当两台主设备争夺总线时,获胜方并不知道冲突已经发生,只有失败方能够察觉冲突——当它写入逻辑1却读到逻辑0时——从而失去争夺总线的能力。

10位设备地址

所有IIC设备均分配一个7位地址码,理论上仅能支持127种不同的IIC设备。然而,在实际应用中,IIC设备的种类远超这个限制,导致在同一总线上,出现多个IIC设备具有相同地址的概率较高。为了解决这一限制,许多设备使用了双重地址方案,即在7位地址基础上添加引脚地址(external configuration pins)。I²C标准预见了这一限制,并提出采用10位地址方案以解决之。

10位的地址方案对 I²C协议的影响有两点:

网络层协议中,地址帧长度由一个字节增加至两个字节。同时,第一个字节的前五位最高有效位被指定用于10位地址标识,其编码规则为'11110'。

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-07.jpg)

除了10位地址标识,标准还预留了一些地址码用作其它用途,如下表:

[

](http://arttech.us/wp-content/uploads/2011/07/Intro-to-SPI-and-IC-08.jpg)

时钟拉伸

在I²C通信体系中,主设备决定了时钟频率。由于主设备主动发送时钟脉冲信号,因此从设备无法同步主设备的时钟速度时,从设备需要一种机制来请求主设备降低时钟频率。这种机制被称为时钟拉伸,而基于I²C结构的特性,这种机制得以实现。当从设备需要降低数据传输速度时,它可以按下时钟总线,迫使主设备进入等待状态,直至从设备释放时钟总线,通信重新开始。

高速模式

从原理上讲,采用上拉电阻设置逻辑1会限制总线的最大传输速度。速度是影响总线应用的一个重要因素。这也解释了为何需要引入高速模式(3.4 Mbps)。在发起高速模式传输之前,主设备必须首先在低速模式(如快速模式)中发送特定的“High Speed Master”信号。为了缩短信号周期并提升总线速度,高速模式必须使用额外的I/O缓冲区。另外,总线仲裁在高速模式下被屏蔽。

I²C vs SPI: 哪位是赢家?

我们来对比一下I²C 和 SPI的一些关键点:

第一,总线式拓扑结构/信号路由方案/硬件资源消耗

I²C总线只需两根信号线,而标准SPI总线至少需要四根信号线。当涉及多个从设备时,信号线数量会显著增加。一些SPI的变种虽然仅需三根线(包括SCLK、SS和双向的MISO/MOSI),但这些变种仍需与每个从设备一对一地连接SS线。值得注意的是,若要实现多主设备的结构,总线系统将需要额外的逻辑电路和线路连接。尽管I²C总线面临地址空间限制的问题,但这一问题已得到新标准的解决,采用10位地址空间。尽管如此,I²C总线在构建系统总线时仍具明显优势。

第二,数据吞吐/传输速度

如果一个应用必须依赖于高速数据传输需求,那么选择SPI是最佳选择。因为SPI具有全双工通信的优势,而I²C不具备这种特点。SPI没有预设速度限制,通常实现的性能可以达到甚至超越10 Mbps。I²C最高支持的速度是快速+模式(1 Mbps)和高速模式(3.4 Mbps),但更高模式需要额外的I/O缓冲能力,并不是总是容易实现。

第三,优雅性

I²C 常被视为更优雅于SPI。公正地讲,我们更倾向于认为两者同样优雅和健壮。

I²C总线的优雅之处在于其特色,采用轻盈架构实现了多主设备仲裁和设备路由功能。然而,对工程师而言,理解总线结构并非易事,且其性能表现尚可。

SPI的优点在于其结构简单直观,实现起来非常方便,并且具有良好的扩展性。 SPI虽然结构简单,但无法满足优雅的需求,因为要实现一个功能完善的通信平台,必须在SPI之上开发特定的通信协议软件。 也就是说,要获得SPI独有的高速性能这一特性,工程师需要付出更多的努力。 另外,这种自定的工作是完全自由的,这也解释了为什么SPI没有官方标准。

从性能角度来看,I²C和SPI都为低速设备通信提供了良好的支持。相比之下,SPI更适合用于数据流应用,而I²C则更适合应用于'字节设备'的多主设备场景。

小结

在数字通信协议簇中,I²C和SPI常被视为相对较小的协议,与Ethernet、USB、SATA、PCI-Express等相比,这些协议能够以数百到数千兆字节每秒的速度传输数据。我们不能忽视的是各种总线所承载的功能是什么。大协议主要用于系统内外部设备之间的通信,而小协议则用于芯片内部的通信。目前并无证据表明大协议有必要取代小协议。I²C和SPI的流行反映了“满足需求即可”的哲学理念。值得强调的是,I²C和SPI的流行程度足以让任何一位嵌入式工程师将其视为必修技能。

刘建文原创,引用请注明出处。

全部评论 (0)

还没有任何评论哟~