串口通信————UART、I2C、SPI详解(总结篇)

B站账号:小光学嵌入式


  • ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大二学生。
  • ⏩最近开始系统性补习STM32基础知识,规划有:串口通信,Github,Ucos等等。
  • ⏩今天总结一下串口通信,后面再在代码实现做讲解。

串行与并行

1.串行通信

位通过单根线一一发送,下图显示了二进制(01000011)中字母“C”的串行传输。
当时钟线为高电平时,接收数据位,高电平为1,低电平为0。
在这里插入图片描述

2.并行通信

数据位在导线中同时传输,下图显示了二进制(01000011)中字母“C”的并行传输:
的当时钟线为高电平时,8个数据位同时接受数据,高电平为1,低电平为0
在这里插入图片描述
所以UART、SPI、I2C都是串口通信,因为它们都是通过一根线作为数据线传输数据。

全双工与半双工

1.全双工:

简单来说,比如我们在打电话时,我们可以在同一时间说话,这就是全双工通信;

2.半双工

相对的,虽然半双工也可以互相的通信,但是在同一时间只能单方向传输数据;

UARTSPI都是全双工通信方式,因为他们的数据线都有两根,即可以在同一时间A发数据给B,B也可以在这个时间发数据给A。如I2C通信,因为他只有一根数据线,所以他不能在同一时间双向传输数据。

同步通信和异步通信

同步是阻塞模式,异步是非阻塞模式

1.同步通信

发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

2.异步通信

发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

所以SPI和I2C都是同步通信,因为他们都有时钟线,UART是异步通信方式,他只有两个数据线,发送完数据不会确认你是否接收到。

一.SPI通信

SPI可以无中断传输数据,可以连续地发送或接收任意数量的位。但是I2C和UART中,数据以数据包的形式发送,有限定位数。
在SPI设备中,设备分为主机控制设备(通常是微控制器)和从机(通常是传感器,显示器和存储芯片)设备,从机从主机那获取指令。
SPI信号线有四种:
MOSI-信号线:主机输出,从机输入;
MOSI-信号线:主机输入,从机输出;
SCLK-时钟信号;
SS/CS-片选信号;
SPI协议特点
实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。
时钟信号
每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。
设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。 例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。
片选信号
主机通过拉低从机的CS/SS来使能通信。主机可以与存在多个CS/SS引脚,允许主机与多个从机进行通信。

1.传输步骤

1.主机输出时钟信号
在这里插入图片描述

2.主机拉低SS/CS引脚,激活从机
在这里插入图片描述

3.主机通过MOSI将数据发送给从机
在这里插入图片描述

4.如果需要相应,则从机通过MISO将数据返回给从机
在这里插入图片描述

2.SPI优缺点

优点:无起始位和停止位,因此数据可以持续传输不会中断;数据传输速率快(比I2C快几乎两倍)。独立的MISO、MOSI可以同时发送和接收数据。
缺点:使用四根线(I2C使用两根线),没有信号接收成功的确认(I2C由此功能),没有任何形式的错误检查(UART中的奇偶校验位)。

二.UART通信

两个UART直接相互通信。发送UART将控制设备(如CPU)的并行数据转换位串行形式,以串行的形式将其发送到接收UART。只需要两条线即可在两个UART之间传输信息:
screen-capture
UART属于异步通信,没有时钟信号。它会在数据包中增加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。
当接收UART检测到起始位时,它将以特定的波特率的频率读取(数据传输速度的度量),以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送的接收UART之间的波特率只能相差约10%。

1.工作原理

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

2.传输步骤

1.发送UART从数据总线并行接收数据
screen-capture

2.发送UART将起始位、奇偶校验位和停止位添加到数据帧。
screen-capture

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

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

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

3.UART优缺点

优点:
1.仅使用两根线
2.异步通信,无需时钟信号
3.具有奇偶校验位以允许进行错误检查、
4.只要双方都设置好数据包的结构
缺点:
1.数据帧的大小最大为9位
2.不支持多个从属系统或多个系统
3.每个UART的波特率必须在彼此的10%之内

三.I2C通信

半双工通信,它结合了SPI和UART的优点,可以将多个从机连接到单个主机(如SPI),也可以多个主机控制一个或多个从机。
接线:
screen-capture

SDA–数据线
SCL–时钟线
串行通信协议,需要时钟同步信号并且由主机控制。

1.工作原理

I2C的数据传输是以多个msg的形式进行。每个msg包括:从机二进制地址帧、以及一个或者多个数据帧、开始条件和停止条件,读/写位和数据帧之间的ACK/NACK位:
*screen-capture
在这里插入图片描述

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

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

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

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

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

寻址
不同于SPI的片选线,它是寻址确认从机设备。
主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行匹配比较,如果匹配,他就向主机发送一个低电平ACK位。不匹配不执行操作,SDA保持高电平。

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

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

传输步骤
1.在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。
2.主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位
3.每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。
4.主机发送或接收数据帧;
5.传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧;
6.随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。
I2C优点
1.仅仅使用两根线
2.支持多个主机和从机
3.硬件比UART更简单
I2C缺点
1.数据传输比SPI慢
2.数据帧大小限制为8位

总结

在不同的时候可以选择使用不同的通信方式去完成一个项目,或者在使用一些传感器的时候,他就是特定的通信方式,所以这些通信方式都要去了解去学习和实现的。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>