快速对比UART、SPI、I2C通信的区别与应用

2023-11-08

参考:带你快速对比SPI、UART、I2C通信的区别与应用!
作者:一口Linux
网址:https://mp.weixin.qq.com/s/4_RSM2jk2W6nTboO1W8HCw

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

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

串行 VS 并行

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

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

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

UART通信(串行、异步、两根线、全双工、一对一)

在UART通信中,两个UART直接相互通信。 发送UART将控制设备(如CPU)的并行数据转换为串行形式,以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据,数据从发送UART的Tx引脚流到接收UART的Rx引脚:
在这里插入图片描述
UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。

当接收UART检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送和接收UART之间的波特率只能相差约10%。
在这里插入图片描述

工作原理

发送UART从数据总线获取并行数据后,它会添加一个起始位,一个奇偶校验位和一个停止位来组成数据包并从Tx引脚上逐位串行输出,接收UART在其Rx引脚上逐位读取数据包。
在这里插入图片描述
UART数据包含有1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位:
在这里插入图片描述
起始位:

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

数据帧:

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

校验位:

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

停止位:

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

传输步骤

1、发送UART从数据总线并行接收数据:
在这里插入图片描述
2、发送UART将起始位,奇偶校验位和停止位添加到数据帧:
在这里插入图片描述
3、整个数据包从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样:
在这里插入图片描述
4、接收UART丢弃数据帧中的起始位,奇偶校验位和停止位:
在这里插入图片描述
5、接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线:
在这里插入图片描述

优劣

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

优点

仅使用两根电线

无需时钟信号

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

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

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

缺点

数据帧的大小最大为9位

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

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

SPI通信(串行、同步、四根线、全双工、一对多)

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

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

一套SPI通讯共包含四种信号线:

  • MOSI (Master Output/Slave Input) – 信号线,主机输出,从机输入。
  • MISO (Master Input/Slave Output) – 信号线,主机输入,从机输出。
  • SCLK (Clock) – 时钟信号。
  • SS/CS (Slave Select/Chip Select) – 片选信号。

在这里插入图片描述
SPI协议特点

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

工作原理

时钟信号

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

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

片选信号

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

在这里插入图片描述
如果主机只有一个片选引脚可用,则可以通过以下方式连接这些从器件:
在这里插入图片描述
MOSI和MISO

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

传输步骤

1. 主机输出时钟信号
在这里插入图片描述
2. 主机拉低SS / CS引脚,激活从机
在这里插入图片描述
3. 主机通过MOSI将数据发送给从机
在这里插入图片描述
4. 如果需要响应,则从机通过MISO将数据返回给主机
在这里插入图片描述
使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。

优劣

优点

  • SPI通讯无起始位和停止位,因此数据可以连续流传输而不会中断;

  • 没有像I2C这样的复杂的从站寻址系统;

  • 独立的MISO和MOSI线路,可以同时发送和接收数据,数据传输速率比I2C更高(几乎快两倍,全双工)。

缺点

  • SPI使用四根线(I2C和UART使用两根线);

  • 没有信号接收成功的确认(I2C拥有此功能);

  • 没有任何形式的错误检查(如UART中的奇偶校验位等)。
    在这里插入图片描述

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

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

I2C通信(串行、同步、两根线、半双工、多对多)

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

  • SDA (Serial Data) – 数据线。

  • SCL (Serial Clock) – 时钟线。

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

工作原理

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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

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

寻址

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

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

读/写位

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

数据帧

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

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

传输步骤

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

  2. 主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位:
    在这里插入图片描述

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

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

在这里插入图片描述

  1. 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:
    在这里插入图片描述

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

单个主机VS多个从机

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

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

优劣

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

优点

仅使用两根电线

支持多个主机和多个从机

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

硬件比UART更简单

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

缺点

数据传输速率比SPI慢

数据帧的大小限制为8位

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速对比UART、SPI、I2C通信的区别与应用 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • 串口通讯第一次发送数据多了一字节

    先初始化IO再初始化串口 导致第一次发送时 多出一个字节数据 优化方案 先初始化串口再初始化IO 即可正常通讯
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 从没有中断引脚并且在测量准备好之前需要一些时间的传感器读取数据的最佳方法

    我正在尝试将压力传感器 MS5803 14BA 与我的板 NUCLEO STM32L073RZ 连接 根据 第 3 页 压力传感器需要几毫秒才能准备好读取测量值 对于我的项目 我对需要大约 10 毫秒来转换原始数据的最高分辨率感兴趣 不幸的
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板

随机推荐

  • Google Chrome “网站连接不安全”NET::ERR_CERT_AUTHORITY_INVALID

    Chrome 浏览器打开任何网站显示 网站连接不安全 报错 NET ERR CERT AUTHORITY INVALID 具体操作方法如下 1 运行输入cmd 右击以管理员身份运行命令提示符 2 输入 netsh winsock reset
  • Android Studio远程连接模拟器调试

    目录 需求 ADB端口说明 远程连接步骤 启动模拟器 ADB连接 端口映射 远程连接 需求 Android Studio 高版本已经可以使用 Pair Devices Using Wi fi 功能连接同一局域网下的真机设备了 低版本也可以使
  • 时序预测

    时序预测 MATLAB实现GWO LSTM灰狼算法优化长短期记忆神经网络时间序列预测 目录 时序预测 MATLAB实现GWO LSTM灰狼算法优化长短期记忆神经网络时间序列预测 预测效果 基本介绍 模型描述 程序设计 参考资料 预测效果 基
  • 从0搭建Vue3组件库(五): 如何使用Vite打包组件库

    本篇文章将介绍如何使用 vite 打包我们的组件库 同时告诉大家如何使用插件让打包后的文件自动生成声明文件 d ts 打包配置 vite 专门提供了库模式的打包方式 配置其实非常简单 首先全局安装 vite 以及 vitejs plugin
  • Java API操作HDFS文件,利用Junit单元测试

    操作HDFS文件 约有以下两种方法 1 shell 这个相信大家基本都会 2 Java API 的操作 这次主要记录下Java API操作HDFS文件的相关测试 环境 IDEA JDK10 0 1 虚拟机centos 版本 hadoop2
  • XML 和 JSON 学习笔记(基础)

    XML Why XML 的出现背景 在实际开发中 不同语言 如Java JavaScript等 的应用程序之间数据传递的格式不同 导致它们进行数据交换时很困难 XML就应运而生了 XML 是一种通用的数据交换格式 可以十分方便地实现格式交换
  • 亚稳态的消除及解决方法

    亚稳态产生 我们就要对亚稳态进行消除 常用对亚稳态消除有三种方式 1 对异步信号进行同步处理 2 采用FIFO对跨时钟域数据通信进行缓冲设计 3 对复位电路采用异步复位 同步释放方式处理 1 对异步信号进行同步处理 input sig ns
  • ConnectionString 属性尚未初始化

    ConnectionString 属性尚未初始化 的另类解决办法现在稍微熟悉Asp net的朋友都习惯把数据库连接配置写到web config中 这样的优点主要是能随时更改数据库配置 比如帐号密码 而不用再编译 web config中的数据
  • 古典概型——概率论与数理统计(宋浩)

    事件的概率 1 2 1概率的初等描述 概率的定义 事件发生的可能性的大小 P A 性质 P 1 P 0 规范性 0 lt P A lt 1 非负性 有限可加 A1 A2 A3 An互不相容 P A1 A2 A3 A4 P A1 P A2 P
  • GO面试必须得会的137个面试题

    go的调度 go struct能不能比较 因为是强类型语言 所以不同类型的结构不能作比较 但是同一类型的实例值是可以比较的 实例不可以比较 因为是指针类型 go defer for defer 先进后出 后进先出 func b for i
  • WIN10驱动程序的卸载与更新

    方法一 在设备管理器中找到对应驱动 右键选择 卸载 记得勾选删除此设备的驱动程序软件 然后点击确定 这一步删除了旧得问题驱动 重装得时候就可以根据需要自己选择如何安装驱动了 方法二 以官网下载无线网卡驱动为例 https downloadc
  • VS2012 error C2668: “sqrt”: 对重载函数的调用不明确-已解决

    源程序如下 include
  • Kubernetes RBAC 为指定用户授权访问不同命名空间权限

    在开启了 TLS 的集群中 每当与集群交互的时候少不了的是身份认证 使用 kubeconfig 即证书 和 token 两种认证方式是最简单也最通用的认证方式 以kubectl为例介绍kubeconfig的配置 kubectl只是个go编写
  • pytorch 多GPU训练

    代码库地址 mnist 目录 普通单机单卡训练流程 DDP分布式训练 horovod方式 普通单机单卡训练流程 以mnist为例 主要包括数据加载 模型构建 优化器和迭代训练等部分 import argparse import torch
  • Csharp:字符串操作

    public class StringControl
  • C++中的map

    1 简介 2 pair类型 2 1 pair类型的定义和初始化 2 2 pair对象的一些操作 3 map基本操作 3 1 头文件 3 2 创建map对象 3 3 map元素访问 3 3 1 使用下标 访问 3 3 2 使用 at 方法访问
  • matlab——三元二次函数求最值

    fmincon函数 今天晚上帮姐姐求一个方程的最值 果断用matlab啊 刚开始想得挺简单的 就是for循环 后来一想计算量太大 百度了一下都是用fmincon这个函数 可是算出来的是最小值 然后又找求最大值的函数 可是找了半天没找到 最后
  • 右键菜单添加命令行,右键菜单增加editplus

    我们在运行中输入cmd命令 默认的输入路径是 C Documents and Settings Administrator 而我们所用工具的安装路径常常不在这个路径下 这样会为一些命令的输入造成麻烦 下面通过修改注册表解决这个麻烦 运行 r
  • 机器学习——KNN算法

    机器学习 KNN算法 文章目录 机器学习 KNN算法 前言 一 KNN原理基础 二 sklearn的基本建模流程 三 KNN算法调优 选取最优的K值 四 KNN中距离的相关讨论 1 KNN使用的是什么距离 2 距离类模型的归一化需求 五 K
  • 快速对比UART、SPI、I2C通信的区别与应用

    参考 带你快速对比SPI UART I2C通信的区别与应用 作者 一口Linux 网址 https mp weixin qq com s 4 RSM2jk2W6nTboO1W8HCw 电子设备之间的通信就像人类之间的交流 双方都需要说相同的