0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通信协议SPI、UART、I2C的区别与应用

ARM与嵌入式 来源:ARM与嵌入式 2023-01-04 09:21 次阅读

电子设备之间的通信就像人类之间的交流,双方都需要说相同的语言。在电子产品中,这些语言称为通信协议。

之前有单独地分享了SPI、UARTI2C通信的文章,这篇对它们做一些对比。

串行 VS 并行

电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。

数据位可以通过并行或串行的形式进行传输。在并行通信中,数据位在导线上同时传输。下图显示了二进制(01000011)中字母“C”的并行传输:

4fcd3762-8ba1-11ed-bfe3-dac502259ad0.png

在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“C”的串行传输:

4ffee708-8ba1-11ed-bfe3-dac502259ad0.png

SPI通信

SPI是一种常见的设备通用通信协议。它有一个独特优势就是可以无中断传输数据,可以连续地发送或接收任意数量的位。而在I2C和UART中,数据以数据包的形式发送,有着限定位数。

在SPI设备中,设备分为主机与从机系统。主机是控制设备(通常是微控制器),而从机(通常是传感器,显示器或存储芯片)从主机那获取指令。

一套SPI通讯共包含四种信号线:MOSI(Master Output/Slave Input)– 信号线,主机输出,从机输入。MISO(Master Input/Slave Output)– 信号线,主机输入,从机输出。SCLK(Clock)– 时钟信号。SS/CS(Slave Select/Chip Select)– 片选信号。

502353e0-8ba1-11ed-bfe3-dac502259ad0.png

SPI协议特点

实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。

工作原理

时钟信号

每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。

设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。

片选信号

主机通过拉低从机的CS/SS来使能通信。在空闲/非传输状态下,片选线保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通讯。

507e81b6-8ba1-11ed-bfe3-dac502259ad0.png

如果主机只有一个片选引脚可用,则可以通过以下方式连接这些从器件:

509218ac-8ba1-11ed-bfe3-dac502259ad0.png

MOSI和MISO

主机通过MOSI以串行方式将数据发送给从机,从机也可以通过MISO将数据发送给主机,两者可以同时进行。所以理论上,SPI是一种全双工的通讯协议。

传输步骤

1.主机输出时钟信号

50ba8c4c-8ba1-11ed-bfe3-dac502259ad0.png

2. 主机拉低SS / CS引脚,激活从机

50e0509e-8ba1-11ed-bfe3-dac502259ad0.png

3. 主机通过MOSI将数据发送给从机

50f8aa90-8ba1-11ed-bfe3-dac502259ad0.png

4. 如果需要响应,则从机通过MISO将数据返回给主机

512044b0-8ba1-11ed-bfe3-dac502259ad0.png

使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。

优劣

优点

SPI通讯无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据。

缺点

SPI使用四根线(I2C和UART使用两根线),没有信号接收成功的确认(I2C拥有此功能),没有任何形式的错误检查(如UART中的奇偶校验位等)。

51586f52-8ba1-11ed-bfe3-dac502259ad0.png

UART代表通用异步接收器/发送器也称为串口通讯,它不像SPI和I2C这样的通信协议,而是微控制器中的物理电路或独立的IC


UART的主要目的是发送和接收串行数据,其最好的优点是它仅使用两条线在设备之间传输数据。UART的原理很容易理解,但是如果您还没有阅读SPI 通讯协议,那可能是一个不错的起点。

UART通信

在UART通信中,两个UART直接相互通信。发送UART将控制设备(如CPU)的并行数据转换为串行形式,以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据,数据从发送UART的Tx引脚流到接收UART的Rx引脚:

516eb834-8ba1-11ed-bfe3-dac502259ad0.png

UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。 当接收UART检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送和接收UART之间的波特率只能相差约10%。

5188c90e-8ba1-11ed-bfe3-dac502259ad0.png

工作原理

发送UART从数据总线获取并行数据后,它会添加一个起始位,一个奇偶校验位和一个停止位来组成数据包并从Tx引脚上逐位串行输出,接收UART在其Rx引脚上逐位读取数据包。

51a6cb5c-8ba1-11ed-bfe3-dac502259ad0.png

UART数据包含有1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位:

51d2c3f6-8ba1-11ed-bfe3-dac502259ad0.png

起始位:

UART数据传输线通常在不传输数据时保持在高电压电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。

数据帧:

数据帧内包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。

校验位:

奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。

停止位:

为了向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少持续两位时间。

传输步骤

发送UART从数据总线并行接收数据:

51e290ec-8ba1-11ed-bfe3-dac502259ad0.png

2.发送UART将起始位,奇偶校验位和停止位添加到数据帧:

5208d810-8ba1-11ed-bfe3-dac502259ad0.png

3.整个数据包从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样:

521a45aa-8ba1-11ed-bfe3-dac502259ad0.png

4.接收UART丢弃数据帧中的起始位,奇偶校验位和停止位:

52455fec-8ba1-11ed-bfe3-dac502259ad0.png

5.接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线:

525c8906-8ba1-11ed-bfe3-dac502259ad0.png

优劣

没有任何通信协议是完美的,但是UART非常擅长于其工作。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:

优点

仅使用两根电线

无需时钟信号

具有奇偶校验位以允许进行错误检查

只要双方都设置好数据包的结构

有据可查并得到广泛使用的方法

缺点

数据帧的大小最大为9位

不支持多个从属系统或多个主系统

每个UART的波特率必须在彼此的10%之内

I2C通信

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可传送信息。它结合了 SPI 和 UART 的优点,您可以将多个从机连接到单个主机(如SPI那样),也可以使用多个主机控制一个或多个从机。当您想让多个微控制器将数据记录到单个存储卡或将文本显示到单个LCD时,这将非常有用。

526fe5b4-8ba1-11ed-bfe3-dac502259ad0.png

SDA (Serial Data)– 数据线。

SCL (Serial Clock)– 时钟线。

I2C是串行通信协议,因此数据沿着SDA一点一点地传输。与SPI一样,I2C也需要时钟同步信号且时钟始终由主机控制。

5282fe1a-8ba1-11ed-bfe3-dac502259ad0.png

工作原理

I2C的数据传输是以多个msg的形式进行,每个msg都包含从机的二进制地址帧,以及一个或多个数据帧,还包括开始条件和停止条件,读/写位和数据帧之间的ACK / NACK位:

52a22e20-8ba1-11ed-bfe3-dac502259ad0.png

启动条件:当SCL是高电平时,SDA从高电平向低电平切换。

停止条件:当SCL是高电平时,SDA由低电平向高电平切换。

52c029b6-8ba1-11ed-bfe3-dac502259ad0.png

地址帧:每个从属设备唯一的7位或10位序列,用于主从设备之间的地址识别。

读/写位:一位,如果主机是向从机发送数据则为低电平,请求数据则为高电平。

ACK/NACK:消息中的每个帧后均带有一个ACK/NACK位。如果成功接收到地址帧或数据帧,接收设备会返回一个ACK位用于表示确认。

寻址

由于I2C没有像SPI那样的片选线,因此它需要使用另一种方式来确认某一个从设备,而这个方式就是 ——寻址。

主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。

读/写位

地址帧的末尾包含一个读/写位。如果主机要向从机发送数据,则为低电平。如果是主机向从机请求数据,则为高电平。

数据帧

当主机检测到从机的ACK位后,就可以发送第一个数据帧了。数据帧始终为8位,每个数据帧后紧跟一个ACK / NACK位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。

传输步骤

1. 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。

2. 主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位:

52d643d6-8ba1-11ed-bfe3-dac502259ad0.png

3. 每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。

52ed80be-8ba1-11ed-bfe3-dac502259ad0.png

4. 主机发送或接收数据帧:

530181cc-8ba1-11ed-bfe3-dac502259ad0.png

5. 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:

53242b00-8ba1-11ed-bfe3-dac502259ad0.png

6. 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。

单个主机VS多个从机

由于I2C使用寻址功能,可以通过一个主机控制多个从机。使用7位地址时,最多可以使用128(27)个唯一地址。使用10位地址并不常见,但可以提供1,024(210)个唯一地址。如果要将多个从机连接到单个主机时,请使用4.7K欧的上拉电阻将它们连接,例如将SDA和SCL线连接到Vcc:

5338883e-8ba1-11ed-bfe3-dac502259ad0.png

多个主机VS多个从机

I2C支持多个主机同时与多个从机相连,当两个主机试图通过SDA线路同时发送或接收数据时,就会出现问题。因此每个主机都需要在发送消息之前检测SDA线是低电平还是高电平。如果SDA线为低电平,则意味着另一个主机正在控制总线。如果SDA线高,则可以安全地发送数据。如果要将多个主机连接到多个从机,请使用4.7K欧的上拉电阻将SDA和SCL线连接到Vcc:

534bb760-8ba1-11ed-bfe3-dac502259ad0.png

优劣

与其他协议相比,I2C可能听起来很复杂。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:

优点

仅使用两根电线

支持多个主机和多个从机

每个UART的波特率必须在彼此的10%之内

硬件比UART更简单

众所周知且被广泛使用的协议

缺点

数据传输速率比SPI慢

数据帧的大小限制为8位

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信协议
    +关注

    关注

    28

    文章

    879

    浏览量

    40297
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91502
  • uart
    +关注

    关注

    22

    文章

    1235

    浏览量

    101354

原文标题:带你快速对比SPI、UART、I2C通信的区别与应用!

文章出处:【微信号:ARM与嵌入式,微信公众号:ARM与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CAN总线与其他串行通信协议比较

    CAN总线与其他串行通信协议相比,具有其独特的特点和优势。以下是对CAN总线与UARTI2CSPI等常见串行通信协议的比较: 一、基本特
    的头像 发表于 11-12 09:56 560次阅读

    DHT11用的是SPI还是I2C

    DHT11并不使用SPII2C通信协议,而是采用单总线(1-Wire)协议进行通信 。单总线协议
    的头像 发表于 09-04 09:11 1058次阅读

    I2CUART子系统设计

    电子发烧友网站提供《I2CUART子系统设计.pdf》资料免费下载
    发表于 08-28 10:27 2次下载
    <b class='flag-5'>I2C</b>转<b class='flag-5'>UART</b>子系统设计

    UARTI2C桥接器

    电子发烧友网站提供《UARTI2C桥接器.pdf》资料免费下载
    发表于 08-28 09:24 1次下载
    <b class='flag-5'>UART</b>转<b class='flag-5'>I2C</b>桥接器

    简单认识I2C通信协议

    I2C(Inter-Integrated Circuit)通信协议是由飞利浦公司(现为恩智浦半导体)开发的一种简单、双向二线制同步串行总线协议。自1982年发布以来,I2C
    的头像 发表于 07-25 18:06 1434次阅读

    如何使用Dave 3.1.10在XMC4400微控制器上实现I2c通信协议 软件?

    我一直在尝试使用 Dave 3.1.10 与 XMC4400 执行 I2c 通信协议,以实现传感器接口。 软件但我做不到。 Dave 3.1.10 的语法有所不同。 我无法使用 Dave
    发表于 06-03 07:21

    I2CSPIUART通信过程还可以这样理解

    到目前为止,I2CSPIUART等仍然是电子嵌入式设备中最常用的通信协议,本文,我们将剖析这三种协议,让大家清楚、直观的了解它们的功能、
    的头像 发表于 05-23 08:10 7121次阅读
    <b class='flag-5'>I2C</b>、<b class='flag-5'>SPI</b>、<b class='flag-5'>UART</b>的<b class='flag-5'>通信</b>过程还可以这样理解

    SPII2C通信协议:应用与区别

    本文深入解析了SPII2C这两种通信协议的特点、工作原理和应用场景。SPI适用于高速数据传输,常用于存储器芯片和显示器驱动等领域;I2C
    的头像 发表于 04-22 16:45 1805次阅读

    逼真动画展示I2CSPIUART通信过程

    到目前为止,I2CSPIUART等仍然是电子嵌入式设备中最常用的通信协议,本文,我们将剖析这三种协议,让大家清楚、直观的了解它们的功能、
    的头像 发表于 04-12 08:27 976次阅读
    逼真动画展示<b class='flag-5'>I2C</b>、<b class='flag-5'>SPI</b>、<b class='flag-5'>UART</b>的<b class='flag-5'>通信</b>过程

    总结usart、uarti2cspi区别及相关知识

    USART、UARTI2CSPI是四种不同的串行通信协议,它们各自具有独特的特点和应用领域
    的头像 发表于 04-10 09:47 1753次阅读
    总结usart、<b class='flag-5'>uart</b>、<b class='flag-5'>i2c</b>、<b class='flag-5'>spi</b><b class='flag-5'>区别</b>及相关知识

    用STM32F103普通IO模拟通信协议I2C,SPI,串口,怎么精准的控制通讯的速率?

    用STM32F103普通IO模拟通信协议I2C,SPI,串口等。 怎么精准的控制通讯的速率,我看到STLINK也是用的STM32的芯片,为何通讯速度能达到10M那么高? 怎么操作的,有例程指导一下吗?
    发表于 03-28 08:24

    UART串口通信协议是什么?

    UART (Universal Asynchronous Receiver/Transmitter) 是一种通信接口协议,用于实现串口通信。它是一种简单的、可靠的、广泛应用的串口
    的头像 发表于 03-19 17:26 1367次阅读

    什么是I2C接口?什么是I3C接口?I2CI3C区别

    I2C接口是一种串行通信协议,全称为Inter-Integrated Circuit,即集成电路间总线。它是一种双向、两线制(SCL和SDA)的串行通信接口,主要用于连接微控制器和其他外围设备,如传感器、存储器、显示器等。
    的头像 发表于 02-17 14:39 6240次阅读
    什么是<b class='flag-5'>I2C</b>接口?什么是<b class='flag-5'>I3C</b>接口?<b class='flag-5'>I2C</b>与<b class='flag-5'>I3C</b>的<b class='flag-5'>区别</b>

    蓝牙串口通讯总线——I2C/SPI/UART

    Sensor、Touch、蓝牙模块、WIFI模块等也都兼容这三种通信协议的1种以上。那么这三条通信总线有什么区别呢?工业物联网无线通信专业厂商为您一一细说——
    的头像 发表于 01-22 09:41 1616次阅读
    蓝牙串口通讯总线——<b class='flag-5'>I2C</b>/<b class='flag-5'>SPI</b>/<b class='flag-5'>UART</b>

    i2c接口和spi接口区别

    重要的区别I2C接口和SPI接口都属于串行通信接口标准,广泛应用在嵌入式系统和电子设备中。它们之间的主要区别在于
    的头像 发表于 12-25 15:02 3997次阅读