一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
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更适合“字节设备”的多主设备应用,多见于一些传感器设备。