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

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

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

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

目录

  • 串行 VS 并行
  • UART通信(串行、异步、两根线、一对一)
    • 工作原理
    • 传输步骤
    • 优劣
  • SPI通信(串行、同步、四根线、一对多)
    • 工作原理
    • 传输步骤
    • 优劣
  • 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位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

U-Boot 移植

目录NXP官方开发板uboot编译测试查找NXP官方的开发板默认配置文件_defconfig配置编译NXP官方开发板对应的uboot烧写验证与驱动测试(定位缺少的驱动)在NXP官方U-Boot 中添加自己的开发板添加开发板默认配置文件添加开发板对应的头文件(mx6ull_alientek_emmc.h)添加开发板对应的板…

打印某个进程下的所有线程--Linux环境

2019独角兽企业重金招聘Python工程师标准>>> 1、ps -mp <进程ID> -o THREAD 在当前用户下&#xff0c;列出pid包含的所有线程。 2、ps -mp <进程ID> -o THREAD,tid 在当前用户下&#xff0c;列出pid包含的所有线程信息及本地线程ID (tid)。 3、ps -…

JavaScript笔记(3)

•位操作符 所有的按位操作符的操作数都会被转成补码形式的有符号的32位整数。 运算符用法描述按位与&#xff08;AND&#xff09;a & b对于每一个比特位&#xff0c;只有两个操作数相应的比特位都是1时&#xff0c;结果才为1&#xff0c;否则为0。按位或&#xff08;OR&am…

Linux 内核顶层Makefile 详解

目录前602行分析make xxx_defconfig 过程Makefile.build 脚本分析make 过程built-in.o 文件编译生成过程make zImage 过程前几章我们重点讲解了如何移植uboot 到I.MX6U-ALPHA 开发板上&#xff0c;从本章开始我们就开始学习如何移植Linux 内核。同uboot 一样&#xff0c;在具体…

android第三次作业

界面&#xff1a; 主要代码&#xff1a; 1.定义一个工具类&#xff0c;在这个类中获取音频文件&#xff0c;并且对歌曲名、歌手和时间等进行格式规范&#xff1a; package com.example.administrator.music;import android.content.Context; import android.database.Cursor; i…

python try 异常处理 史上最全

在程序出现bug时一般不会将错误信息显示给用户&#xff0c;而是现实一个提示的页面&#xff0c;通俗来说就是不让用户看见大黄页&#xff01;&#xff01;&#xff01; 有时候我们写程序的时候&#xff0c;会出现一些错误或异常&#xff0c;导致程序终止. 为了处理异常&#xf…

Spring+Spring Security+JSTL实现的表单登陆的例子

2019独角兽企业重金招聘Python工程师标准>>> Spring Security允许开发人员轻松地将安全功能集成到J2EE Web应用程序中&#xff0c;它通过Servlet过滤器实现“用户自定义”安全检查。 在本教程中&#xff0c;我们将向您展示如何在Spring MVC中集成Spring Security 3…

数学教师计算机能力提升,深度融合信息技术,提升数学课堂魅力

原标题&#xff1a;深度融合信息技术&#xff0c;提升数学课堂魅力2018年小学数学教学与信息技术深度融合专题网络教研活动2018年10月31日&#xff0c;我校数学科组根据北片指导中心文件精神&#xff0c;进行了一次小学数学教学与信息技术深度融合专题网络教研活动。本次教研活…

Linux 内核启动流程

目录链接脚本vmlinux.ldsLinux 内核入口stext__mmap_switched 函数start_kernel 函数rest_init 函数init 进程看完Linux 内核的顶层Makefile 以后再来看Linux 内核的大致启动流程&#xff0c;Linux 内核的启动流程要比uboot 复杂的多&#xff0c;涉及到的内容也更多&#xff0c…

vs文件上传失败--超过最大字符限制

一、问题 在文件上传时&#xff0c;会遇到大文件上传失败。 》F12查看报错网络请求返回结果 》问题分析 由于vs上传文件默认的字符大小控制。 二、解决方法 》在web.config中修改或添加最大允许上传文件的大小 1 <system.web> 2 <httpRuntime targetFramework&q…

微计算机和微处理器的区别,CPU和微处理器的区别

CPU和微处理器是成功操作系统的基础。它们都执行不可或缺的计算机任务&#xff0c;例如算术&#xff0c;数据处理&#xff0c;逻辑和I / O操作&#xff0c;但是CPU与微处理器的区别并不是那么黑与白。尽管一些IT管理员可以互换使用CPU和微处理器&#xff0c;但现实是大多数CPU是…

向日葵在mac不能以服务器运行吗,mac远程桌面连接在哪?向日葵可以实现mac远程连接吗?...

目前大部分用户的电脑都是Windows系统的&#xff0c;也有部分用户用的Mac电脑&#xff0c;对于Mac电脑用户来说&#xff0c;许多操作与Windows都不同&#xff0c;比如他们就不知道mac远程桌面连接在哪?当遇到需要别人远程帮助时就无法调出&#xff0c;下面小编给大家讲解下它的…

根文件系统构建(BusyBox方式)

目录根文件系统简介BusyBox构建根文件系统BusyBox简介编译BusyBox构建根文件系统(生成bin、sbin、usr、linuxrc)向根文件系统添加lib库创建其他文件夹根文件系统初步测试完善根文件系统创建/etc/init.d/rcS文件创建/etc/fstab文件创建/etc/inittab文件根文件系统其他功能测试软…

kk 服务器信息,手机kk服务器设置

手机kk服务器设置 内容精选换一换已获取服务器管理员帐号与密码。打开CMD运行窗口&#xff0c;输入gpedit.msc&#xff0c;打开本地组策略编辑器。打开组策略在指定RD会话主机服务器的授权模式下拉列表中选择按用户。设置允许RD最大连接数位999999。设置结束已断开连接的会话为…

系统烧写方法(MfgTool烧写工具)

目录MfgTool 工具简介MfgTool 工作原理简介USB接线系统烧写原理烧写NXP 官方系统烧写自制的系统系统烧写网络开机自启动设置改造我们自己的烧写工具改造MfgTool烧写测试解决Linux 内核启动失败总结前面我们已经移植好了uboot 和linux kernle&#xff0c;制作好了根文件系统。但…

Android自带Monkey测试

Monkey是在模拟器上或设备上运行的一个小程序&#xff0c;它能够产生为随机的用户事件流&#xff0c;例如点击(click)&#xff0c;触摸(touch)&#xff0c;挥手&#xff08;gestures&#xff09;&#xff0c;还有一系列的系统级事件。可以使用Monkey来给正在开发的程序做随机的…

捣蛋鹅显示服务器已满,无题大鹅模拟奖杯攻略分享

捣蛋鹅成就怎么解锁&#xff1f;游戏章节不是很长&#xff0c;不同章节中都有不同的奖杯需要解锁&#xff0c;有些比较简单&#xff0c;有的需要一点点技巧&#xff0c;小编这里给大家带来了“PSN lyplyp_lll”总结的无题大鹅模拟奖杯攻略分享&#xff0c;一起来看下文中具体的…

线程的属性 —— 分离的状态(detached state)、栈地址(stack address)、栈大小(stack size)

参考&#xff1a;&#xff08;四十二&#xff09;线程——线程属性 作者&#xff1a;FadeFarAway 发布时间&#xff1a;2017-01-17 14:09:55 网址&#xff1a;https://blog.csdn.net/FadeFarAway/article/details/54576771 目录引入线程属性初始化一、线程的分离状态(detached …

【微信小游戏实战】零基础制作《欢乐停车场》二、关卡设计

1、游戏立项 微信小游戏中有一款《欢乐停车场Plus》的小游戏&#xff0c;大家可以搜索玩下。这是一款益智类的小游戏&#xff0c;游戏中有红、黄、绿、蓝、紫5辆豪车6个停车位&#xff0c;玩家通过可行走路线移动小车&#xff0c;最终让各颜色的小车停到对应的颜色车位&#xf…

线程同步(互斥锁、条件、读写锁、信号量)

参考&#xff1a;&#xff08;四十三&#xff09;线程——线程同步&#xff08;互斥锁、读写锁、条件变量、信号量&#xff09; 作者&#xff1a;FadeFarAway 发布时间&#xff1a;2017-01-17 21:25:28 网址&#xff1a;https://blog.csdn.net/FadeFarAway/article/details/545…