When others fear I greed, the greedy when I fear.
别人贪婪我恐惧,别人恐惧我贪婪。
沃伦 - 巴菲特
I2C
与 SPI
的天才对决
上擂台赛之前,我们先来了解一下双方的背景和实力:
- 《【嵌入式基础小知识】简单聊聊 IIC 总线》https://eureka1024.blog.csdn.net/article/details/123855090
- 《SPI总线协议概述》:https://blog.csdn.net/bleauchat/article/details/84821031
下面进入正题,正式开始 PK
。
-
身世?
都有曾经的大宗门背景(真是应了那江湖传言:“一流的公司定标准”),I2C
诞生于PHILIPS
公司(现归属于NXP
),SPI
则由Motorola
公司设计。 -
外貌(物理层实现)?
(当然主机与从机都是要共同接地线的,下面仅讨论信号线)
I2C
为二线制:SCL
、SDA
。
在物理实现上,SCL
线和SDA
线都是漏极开路(open-drain
),这个一般需要软件将GPIO
接口配置成这个模式,通过上拉电阻外加一个电压源。当把线路接地时,线路为逻辑0,当释放线路,线路空闲时,线路为逻辑1。基于这些特性,IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。SPI
为四线制:SCLK
、MOSI
、MISO
、SS
(片选信号线)。
加上SS
(片选信号线)的SPI
会显著拥有更快的传输速度。但从这个点来说,如果总线上的从设备很多,I2C
总线是更节省硬件成本的,同时电路也更简单。
SPI
总线不需要增加额外的电路连接,直接信号线对接好就行了。 -
能否同时收发?
I2C
只有一根数据线,所以只能处于半双工模式,不能同时收发数据。
SPI
有两根数据线,支持全双工模式,可以同时收发数据。 -
协议的标准程度?
I2C
标准化程度非常高,协议几乎标准化定义了传输协议的所有细节。这么说吧,如果你有一个I2C
的从机设备,你只需要知道从机的地址,就能够与其通信,当然如果你要获取或者控制设备,你还是需要知道从机设备的寄存器的功能和使用。在嵌入式开发领域,很多开发者放弃芯片自带的硬件I2C
,而是选择使用GPIO
模拟的方式实现,这是因为使用软件模拟的方式几乎可以实现一个通用的I2C
代码模块,很方便的在各种芯片里面移植使用,I2C
的标准化程度之高可见一斑。相较于
I2C
,SPI
的标准化程度稍逊一筹。与IIC不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述。下面是描述的是SPI
的四种模式,可见如果你要使用SPI
协议的从设备,你还得好好看看对应设备的规格书,注意一下一些实现上的细节。SPI有四种操作模式:模式0、模式1、模式2和模式3。它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(即时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA。主从设备必须使用相同的工作参数——SCLK\CPOL和CPHA,才能正常工作。如果有多个从设备,并且它们使用了不同的工作参数,那么主设备必须在读写不同从设备间重新配置这些参数。
-
是否有地址的概念?
I2C
存在地址的概念,这里的地址针对从机设备而言,主机设备通过发送从机地址来实现与目标设备的通信,所以双方需要应答机制来保证通信的有效执行。
SPI
则不存在地址的概念,所以需要SS
(片选信号线)来选中具体的从机设备,有这物理机制的加成,SPI
线则不需要地址,也不会有应答(所以SPI
主设备甚至并不知道指定的从设备是否存在)。 -
天下武功,唯快不破,那谁更快呢?
对于I2C
而言,最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps,1998的3.4Mbps,所以I2C
最高的速度也就快速+模式(1Mbps)和高速模式(3.4Mbps)。
而SPI
在这方面则完全没有限制自己,SPI不规定最大传输速率,SPI没有定义速度限制,一般的实现通常能达到甚至超过10Mbps。所以一般在比较高速的通信场合使用。IIC 和 SPI 不快不慢,但好在其结构简单,“够用就好”的也是其存在并被广泛应用的原因。
-
使用场合
和Ethernet、USB等传输速度达数百上千兆字节每秒的总线相比,两者非常适合近距离低速芯片间通信。。非要区分的话,SPI
适合数据流应用,就嵌入式而言,我们常常看到Flash
存储芯片、显示屏驱动芯片等数据量稍大的设备使用SPI
通信,而I2C
更适合“字节设备”的多主设备应用,多见于一些传感器设备。
参考资料
- 《【嵌入式基础小知识】简单聊聊 IIC 总线》https://eureka1024.blog.csdn.net/article/details/123855090
- 《SPI总线协议概述》:https://blog.csdn.net/bleauchat/article/details/84821031
- 《终于看懂了!通信协议 IIC 与 SPI 最全对比》:https://zhuanlan.zhihu.com/p/166103763
更多精彩内容,更多惊喜,请关注公众号《嵌入式小散修》。