终于搞清了:SPI、UART、I2C通信的区别与应用_uart,i2c,spi的区别以及优缺点-程序员宅基地

技术标签: 笔记  单片机  

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

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

串行 VS 并行

电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。 数据位可以通过并行或串行的形式进行传输。 在并行通信中,数据位在导线上同时传输。下图显示了二进制(01000011)中字母“C”的并行传输:

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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、UART、I2C通信的区别与应用

SPI协议特点实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。工作原理

时钟信号

每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。 设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。 例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。

片选信号

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

MOSI和MISO

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

优点

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

缺点

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

终于搞清了:SPI、UART、I2C通信的区别与应用

UART代表通用异步接收器/发送器也称为串口通讯,它不像SPI和I2C这样的通信协议,而是微控制器中的物理电路或独立的IC。UART的主要目的是发送和接收串行数据,其最好的优点是它仅使用两条线在设备之间传输数据。UART的原理很容易理解,但是如果您还没有阅读SPI 通讯协议,那可能是一个不错的起点。

UART通信

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

终于搞清了:SPI、UART、I2C通信的区别与应用

UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。

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

终于搞清了:SPI、UART、I2C通信的区别与应用

工作原理

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

起始位:

UART数据传输线通常在不传输数据时保持在高电压电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。数据帧:数据帧内包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。 校验位:奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。停止位:为了向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少持续两位时间。

传输步骤发送UART从数据总线并行接收数据:

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

优点

  • 仅使用两根电线
  • 无需时钟信号
  • 具有奇偶校验位以允许进行错误检查
  • 只要双方都设置好数据包的结构
  • 有据可查并得到广泛使用的方法

缺点

  • 数据帧的大小最大为9位
  • 不支持多个从属系统或多个主系统
  • 每个UART的波特率必须在彼此的10%之内

I2C通信

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

地址帧:每个从属设备唯一的7位或10位序列,用于主从设备之间的地址识别。读/写位:一位,如果主机是向从机发送数据则为低电平,请求数据则为高电平。ACK/NACK:消息中的每个帧后均带有一个ACK/NACK位。如果成功接收到地址帧或数据帧,接收设备会返回一个ACK位用于表示确认。

寻址

由于I2C没有像SPI那样的片选线,因此它需要使用另一种方式来确认某一个从设备,而这个方式就是 —— 寻址 。主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。

读/写位

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

数据帧

当主机检测到从机的ACK位后,就可以发送第一个数据帧了。数据帧始终为8位,每个数据帧后紧跟一个ACK / NACK位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。传输步骤1. 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

单个主机VS多个从机

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

终于搞清了:SPI、UART、I2C通信的区别与应用

多个主机VS多个从机

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

终于搞清了:SPI、UART、I2C通信的区别与应用

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

优点仅使用两根电线支持多个主机和多个从机每个UART的波特率必须在彼此的10%之内硬件比UART更简单众所周知且被广泛使用的协议缺点数据传输速率比SPI慢数据帧的大小限制为8位

原文链接 :今日头条

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/daocaokafei/article/details/121717247

智能推荐

斯坦福博士一己之力让Attention提速9倍!FlashAttention燃爆显存,Transformer上下文长度史诗级提升_为什么flashattention会火-程序员宅基地

文章浏览阅读280次。如今,随着长文档查询、编写故事等新用例的需要,大语言模型的上下文以前比过去变长了许多——GPT-4的上下文长度是32k,MosaicML的MPT上下文长度是65k,Anthropic的Claude上下文长度是100k。当这个数字很大(比如 ≥80)时,这种调度是有效的,因为在这种情况下,可以有效地使用GPU上几乎所有的计算资源。在长序列的情况下(通常意味着更小批或更少的头),为了更好地利用GPU上的多处理器,研究人员在序列长度的维度上另外进行了并行化,使得该机制获得了显著加速。_为什么flashattention会火

tensorflow下实现DenseNet对数据集cifar-10的图像分类_densnet可以做图片10 分类吗-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏54次。DenseNet论文地址:https://arxiv.org/pdf/1608.06993.pdfResNet传送门:ResNet-cifar10SegNet传送门:semantic segmentation SegNetInception v3传送门:inception v3 这篇文章为2017CVPR的论文,DenseNet描述了一个全新的卷积层与卷积层的连接方式。与in..._densnet可以做图片10 分类吗

【测试杂谈】测试用例的巧妙与自我修养-程序员宅基地

文章浏览阅读1k次,点赞30次,收藏18次。定义:指测试用例执行过程中覆盖的分支(如if语句、switch语句等)占总分支数的比例。计算公式:语句覆盖率 = (执行的代码语句数 / 总代码语句数) × 100%。计算公式:路径覆盖率 = (被执行的路径数 / 总的可执行路径数) × 100%计算公式:分支覆盖率 = (执行的分支数 / 总分支数) × 100%。定义:指测试用例执行过程中覆盖的代码语句占总代码语句的比例。定义:指测试用例执行过程中覆盖的代码路径占总代码路径的比例。

数据结构复习(8)——查找_asl不成功=n+1-程序员宅基地

文章浏览阅读227次。顺序查找无序(1). ASL成功=(n+1)/2;(2). ASL失败=n+1。有序(1). ASL成功=(n+1)/2;(2). ASL失败=n/2+n/(n+1)。(失败结点有n+1个)折半查找=二分查找(有序)代码演示:ASL成功= log2的(n+1)+1;ASL失败=(h层失败结点的个数*h)/总结点个数。分块查找(块内无序块间有序)B树、B+树B与B+树的增删参考: https://segmentfault.com/a/1190000020416577_asl不成功=n+1

YY9706.102-2021 医疗设备EMC检测知识-程序员宅基地

文章浏览阅读485次,点赞7次,收藏8次。可以看到两条水平的线,高的那根是准峰值,低的是平均值,只要你在150KHz~30MHz范围内的准峰值和平均值都没有超过限值要求及测试合格。为了大家更好的了解测试结果分析,采用其他非医疗设备测试的数据说明,像下图所示,我们只需关注测试中的Margin这一项。根据以上对ME设备进行分组和分类,例如血透机属于1组和A类设备。测试要求均在GB4824中有说明,对我们工程师来说,感兴趣的可以去仔细了解测试原理和相关说明。例如像血透机的传导发射要求限值就应该是像下图,只要满足此要求,就判定此设备正常。_yy9706.102-2021

AES加密/解密报错,Input length must be multiple of 16 when decrypting with padded cipher-程序员宅基地

文章浏览阅读4.9k次。背景:需要存储一个类似密钥的字符串,密文存储,并要求能逆向解密出来。问题描述:使用AES对该字符串进行加密后生成byte数组,使用new String()方法转为字符串后存储到数据库。从数据库中取出密文,使用getBytes()方法转换为byte数组,然后解密,此时报如下错误:javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher_input length must be multiple of 16 when decrypting with padded cipher

随便推点

JavaScript-程序员宅基地

文章浏览阅读829次,点赞13次,收藏29次。感觉JavaScript里面还有很多基础的细节没搞明白,开个坑专门存一下。

Mpeg-2的同步及时间恢复_mpeg2 ts流时钟恢复-程序员宅基地

文章浏览阅读553次。一、引言Mpeg-2用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中。在ES层,与同步有关的主要是视频缓冲验证VBV(Video Buffer Verifier),用以防止解码器的缓冲器出现上溢或者下溢;在PES层,主要是在PES头信息里出现的显示时间标签PTS(Presentation Time Stamp)和解码时间标签DTS(Decoding Time Stamp);在TS层中,TS头信息包含了节目时钟参考PCR(Program Clock Refe_mpeg2 ts流时钟恢复

python discuz搜索api_Discuz + Sphinx 全文搜索实现-程序员宅基地

文章浏览阅读207次。这篇文章主要介绍用sphinx(csft)做discuz论坛的全文搜索,操作系统为linux,如果需要windows下的可直接参考:http://www.coreseek.cn/sphinx + mmseg安装,这里的sphinx指的是csft,详见:http://www.coreseek.cn/安装 mmseg :# wget -c http://www.coreseek.cn/uploads/..._discuz sphinx

小B的询问 莫队分块-程序员宅基地

文章浏览阅读84次。小B的询问 莫队分块 题目描述小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。输入输出格式输入格式:第一行,三个整数N、M、K。第二行,N个整数,表示小B的序列。..._小b的询问

三角定位法java代码_GitHub - megagao/IndoorPos: 这是一个采用蓝牙4.0--iBeacon技术的室内定位服务端程序。...-程序员宅基地

文章浏览阅读1.3k次。IndoorPos这是一个采用iBeacon技术的室内定位服务端程序,里面包含了三种定位算法,三边定位算法、加权三边定位算法和三角形加权质心定位算法。程序采用Spring框架,简化了JDBC和RMI的样板式代码,并配置了Druid数据库连接池,同时,为了满足高并发的需求,采用了NIO框架Netty,更好地支持大量终端同时定位。程序已经Maven化。一、室内定位系统简介由于卫星信号到达地面时较弱、不..._蓝牙beacon 定位算法 java

手机端下载智慧中小学app,手机端下载niconico视频-程序员宅基地

文章浏览阅读560次,点赞22次,收藏14次。如果openssl不使用系统yum安装的,而是使用自己编译的比较新的版本可以使用--with-openssl=/usr/local/openssl这种方式指定,后面目录为openssl实际安装的目录,另外编译完还要将openssl的lib目录加入ld运行时目录中即可.2)安装readline到/root/Public,网址https://pypi.python.org/pypi/readline,点击download files,选择gz包。安装成功之后,安装目录就在/usr/python。