最近微信群里好几天聊到I2C,既然说到了I2C,那就有必要说SPI,那就一起说了算了,大家有更好见解的,留言回复下,让更多的人知道你的观点。

整理与网络,侵删

I2C和SPI应该要打一架?

现今,在低端数字通信应用领域,我们随处可见I²C (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for I²C)和Motorola(for SPI) 出于不同背景和市场需求制定了这两种标准通信协议。

I²C 开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互联方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互联微控制器和外围设备的。要实现内存映射,设备必须并联入微控制器的数据线和地址线,这种方式在连接多个外设时需大量线路和额外地址解码芯片,很不方便并且成本高。

为了节省微控制器的引脚和和额外的逻辑芯片,使印刷电路板更简单,成本更低,位于荷兰的Philips实验室开发了 ‘Inter-Integrated Circuit’,IIC 或 I²C ,一种只使用二根线接连所有外围芯片的总线协议。最初的标准定义总线速度为100kbps。经历几次修订,主要是1995年的400kbps,1998的3.4Mbps。

有迹象表明,SPI总线首次推出是在1979年,Motorola公司将SPI总线集成在他们第一支改自68000微处理器的微控制器芯片上。SPI总线是微控制器四线的外部总线(相对于内部总线)。与I²C不同,SPI没有明文标准,只是一种事实标准,对通信操作的实现只作一般的抽象描述,芯片厂商与驱动开发者通过data sheets和application notes沟通实现上的细节。

SPI

对于有经验的数字电子工程师来说,用SPI互联两支数字设备是相当直观的。SPI是种四根信号线协议(如图):

  • SCLK: Serial Clock (output from master);
  • MOSI; SIMO: Master Output, Slave Input (output from master);
  • MISO; SOMI: Master Input, Slave Output (output from slave);
  • SS: Slave Select (active low, output from master).

SPI是[单主设备( single-master )]通信协议,这意味着总线中的只有一支中心设备能发起通信。当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”,如下图:

SPI有四种操作模式——模式0、模式1、模式2和模式3,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低)。每种模式由一对参数刻画,它们称为时钟极(clock polarity)CPOL与时钟期(clock phase)CPHA。

[主从设备]必须使用相同的工作参数——SCLK、CPOL 和 CPHA,才能正常工作。如果有多个[从设备],并且它们使用了不同的工作参数,那么[主设备]必须在读写不同[从设备]间重新配置这些参数。以上SPI总线协议的主要内容。SPI不规定最大传输速率,没有地址方案;SPI也没规定通信应答机制,没有规定流控制规则。事实上,SPI[主设备]甚至并不知道指定的[从设备]是否存在。这些通信控制都得通过SPI协议以外自行实现。例如,要用SPI连接一支[命令-响应控制型]解码芯片,则必须在SPI的基础上实现更高级的通信协议。SPI并不关心物理接口的电气特性,例如信号的标准电压。在最初,大多数SPI应用都是使用间断性时钟脉冲和以字节为单位传输数据的,但现在有很多变种实现了连续性时间脉冲和任意长度的数据帧。

I2C

与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协议标准规定发起通信的设备称为主设备,主设备发起一次通信后,其它设备均为从设备。

I²C 通信过程大概如下。首先,主设备发一个START信号,这个信号就像对所有其它设备喊:请大家注意!然后其它设备开始监听总线以准备接收数据。接着,主设备发送一个7位设备地址加一位的读写操作的数据帧。当所设备接收数据后,比对地址自己是否目标设备。如果比对不符,设备进入等待状态,等待STOP信号的来临;如果比对相符,设备会发送一个应答信号——ACKNOWLEDGE作回应。

当主设备收到应答后便开始传送或接收数据。数据帧大小为8位,尾随一位的应答信号。主设备发送数据,从设备应答;相反主设备接数据,主设备应答。当数据传送完毕,主设备发送一个STOP信号,向其它设备宣告释放总线,其它设备回到初始状态。

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

在物理实现上,SCL线和SDA线都是漏极开路(open-drain),通过上拉电阻外加一个电压源。当把线路接地时,线路为逻辑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”。

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

时钟拉伸

在 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线还是要和从设备一对一根。另外,如果SPI要实现多主设备结构,总线系统需额外的逻辑和线路。用I²C 构建系统总线唯一的问题是有限的7位地址空间,但这个问题新标准已经解决——使用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特有而IIC没有的特性——高速性能,工程师们需要付出更多的劳动。另外,这种自定的工作是完全自由的,这也说明为什么SPI没有官方标准。I²C和SPI都对低速设备通信提供了很好的支持,不过,SPI适合数据流应用,而I²C更适合“字节设备”的多主设备应用。

小结

在数字通信协议簇中,I²C和SPI常称为“小”协议,相对Ethernet, USB, SATA, PCI-Express等传输速度达数百上千兆字节每秒的总线。但是,我们不能忘记的是各种总线的用途是什么。“大”协议是用于系统外的整个系统之间通信的,“小”协议是用于系统内各芯片间的通信,没有迹象表明“大”协议有必要取代“小”协议。I²C和SPI的存在和流行体现了“够用就好”的哲学。回应文首,I²C和SPI如此的流行,它是任何一位嵌入式工程师必备的工具。

公众号回复「 I2C 」获取完整I2C资料

扫码或长按关注
回复「加群 」进入技术群聊

I2C和SPI注定要打一架相关推荐

  1. 详细介绍GPIO、I2C、SPI通讯原理以及物理层原理

    目录 一. GPIO 1. 什么是GPIO? 2. GPIO组成原理 3. GPIO工作原理 二. I2C 1. 什么是I2C? 2. I2C组成原理 3. I2C的特性 4. I2C的通讯模式 5. ...

  2. I2C和SPI异同及使用注意

    1 iic总线不是全双工,2根线SCL SDA.spi总线实现全双工,4根线SCK CS MOSI MISO 2 iic总线是多主机总线,通过SDA上的地址信息来锁定从设备.spi总线只有一个主设备, ...

  3. I2C与SPI通信总线协议

    仅以寄存器地址为8Bit的器件为例:(例如MPU6500.LSM6DS3) I2C通信协议 I2C 的要点是了解I2C通信帧的组成部分:START起始位.STOP停止位.ACK/NACK信号.从机器件 ...

  4. I2S,PCM,IOM-2,I2C,SPI,UART,GPIO

    概述 I2S,PCM,IOM-2都是数字音频接口,传数据的. I2C,SPI,UART,GPIO是控制接口,传控制信令的. I2S I2S(Inter-IC Sound Bus)是飞利浦公司为数字音频 ...

  5. Zephry I2C和SPI驱动器介绍和操作FM24V10闪存

    目录 前言 一.I2C Drive 1. 开启方法 2. 使用方法 3. 主要API介绍 3.1 i2c_configure 3.2 i2c_transfer 3.3 i2c_recover_bus ...

  6. STM32常见通信方式(TTL、RS232、RS485、I2C,SPI,CAN)总结

    STM32常见通信方式(TTL.RS232.RS485.I2C,SPI,CAN)总结 一.TTL电平:全双工(逻辑1: 2.4V–5V   逻辑0: 0V–0.5V) 1.硬件框图如下,TTL用于两个 ...

  7. MSM8953配置I2C及SPI

    此次完成的任务是要使能高通8953平台的i2c和spi,主要做的工作就是在设备树文件中添加节点信息.主要的工作在于对设备树文件的修改,主要修改了msm8953-pinctrl.dtsi和msm8953 ...

  8. Micropython——关于Pico中I2C和SPI的实际应用示例(OLED屏幕显示)

    博主之前的文章简要介绍了一下I2C总线和SPI总线的原理,这篇文章来详细介绍一下我们如何通过 I2C总线和SPI与OLED屏幕进行通信(驱动芯片SSD1306),以及我们在现实生活中的简单应用. 博主 ...

  9. 串行通信协议(I2C、SPI、UART、SCCB、CAN)

    推荐一部书,在这本书里面介绍了I2C.SPI.UART和CAN等通信协议,写的蛮不错的. 串行通信:设备与设备之间,传输数据按顺序依次1bit位接1bit位进行传输. 并行通信:设备与设备之间,通过多 ...

最新文章

  1. 2017还有29天,你的目标实现了吗?|内有彩蛋
  2. 阿里开源的那个牛X的问题排查工具——Arthas,推出IDEA插件了!
  3. 当我们说“分类”的时候,我们到底在说什么?
  4. 如何把Win11任务栏变窄
  5. 黑盒攻击很难?元学习提高黑盒对抗攻击成功率
  6. JVM01---简介
  7. 疑似三星Galaxy S11入网:搭载骁龙865处理器+支持25W快充
  8. java webpack web项目_零基础如何学习web前端,入门教程分享
  9. 多么漂亮的重载构造方法呀!爱上.net
  10. 基于Netty和Java的GUI界面实现在线聊天室软件
  11. AI理论知识整理(4)-期望与方差以及联合概率分布
  12. 大数据私房菜--Hadoop完全分布式安装
  13. 设置网页浏览器标签小图标
  14. python爬虫框架论文开题报告怎么写_论文开题报告撰写全攻略
  15. 苹果笔记本装Windows系统
  16. Codesys电子凸轮功能的设计与可视化仿真
  17. latex参考文献引用【bibtex】
  18. 国内的IT生意,敢问路在何方?
  19. 阿里云服务器的购买、基本配置、(xshell)远程连接、搭建环境、设置安全组、域名备案、申请ssl证书
  20. yolov5训练操作步骤

热门文章

  1. Chrome英文版离线安装包下载
  2. 前端翻译:Activating Browser Modes with Doctype
  3. Qt学习之路(11): MainWindow
  4. Flask werkzeug 源码解析
  5. mac eclipse tomcat mysql_mac下使用eclipse+tomcat+mysql开发 j2ee(一)
  6. Random Forest算法参数解释及调优
  7. JDK源码学习之Arraylist与LinkedList
  8. Android 开源优秀 Library 推荐
  9. linux替换某个文件夹下所有文件,Linux 批量查找并替换文件夹下所有文件的内容...
  10. Java IO 系统