面试中比较常问的通信协议总结

本文仅代表我个人观点,算是个人总结吧,相信也会随着学习的不断深入对本文不断改进。

1、UART

1、同步和异步

首先还是看下两个概念的区别吧,比如打开cube的
在这里插入图片描述

他们的全称为:

  • UART 通用异步收发传输器
  • USART 通用同步/异步收/发器

可以看到USART是可以有同步功能的,这里的同步就是增加了时钟线,在stm32的cube的配置中就体现为这个智能卡了,这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。
在这里插入图片描述
下面是UART的配置,相比而言就是没有智能卡的部分,不过我们一般都是把串口当作异步串口来使用,所以这里不用特别在意
在这里插入图片描述

异步同步

  • 异步:发送方要等接收方发回响应才会继续通信,就是一种阻塞的通信方式
  • 同步:不用关接收方是否有反应,是一种非阻塞的通信方式

这样来看,IIC和SPI是同步通信(是由时钟来决定的,不停发送和连续接收的同步比特流),UART是异步通信的,不过虽然UART不需要回应,但是他在任意时刻都可以发送字符,所以他需要起始位和终止位,这样才能告诉别人什么时候开始,什么时候结束,便于接收方正确接收数据。

2、硬件层

这里一般是采用RS232的标准,RS232是比较老的标准了,它规定了信号的用途、通讯接口以及信号的电平标准,常用的接口一般是DB9接口,RS232和现在用的串口区别就在于一个电平标准,下面是野火stm32教程中的示意图。
在这里插入图片描述
他们的电平标准如下所示:
在这里插入图片描述
标准DB9的接口如下所示(注意看他这里的RX和TX的对调),现在一般只使用 RXD、 TXD 以及 GND 三条信号线,直接传输数据信号。
在这里插入图片描述

3、协议层

前面已经说过是协议传输的方式,需要有开始停止,传输的数据包一般为:

起始位-主体数据-校验停止数据

下面是一些重要的参数说明:

  • 波特率:因为没有时钟信号,因此要想正确的接收到数据,就需要约定好通信的波特率,可以理解为通信速率,波特率的含义为每秒的bit数,例如115200就是每秒传输115200个bit的数据。
  • 起始和停止信号:每个数据包从起始信号开始(逻辑0)开始到停止信号结束(逻辑1的0.5,1,1.5倍来表示
  • 有效数据:8位或者9位,传输的数据是9位,但是第9位是否有效需要决定下
  • 数据校验:这个也是可选内容,是为了防止外部干扰造成的误差进行的,具体的包括奇校验(odd),偶校验(even),0校验(space),1校验(mark)还有无校验(no parity)这几种方式

我们需要读取串口的数据的话需要读取数据寄存器,在stm32中为DR寄存器,这是个16位的寄存器,一般是低9位有效(就是前面提到的有效数据长度一般是8位或者9位,这里是否有效由控制寄存器CR1的M位来决定,为0时8位,为1时是9位)

同样的DR寄存器既然是数据寄存器,数据存在发送和接收两种情况,因此也有两个部分,分别是:

  • TDR:专用发送
  • RDR:专用接收

在实际的发送过程中,先把TDR的内容发送到移位寄存器,然后移位寄存器再一位位的发送数据。

然后在补充说明下前面提到的CR1寄存器,CR1寄存器是控制寄存器,控制的内容包括

  • 数据长度
  • 是否DMA
  • 发送器,接收器
  • 唤醒单元,中断控制(使用串口前需要向CR1寄存器TE为写1来使能UART)

发送的过程中,是低位在前,高位在后,具体发送过程为:先发送一个空闲帧(这里为一个数据帧长度的高电平),接下来开始向DR寄存器写入要发送的数据,写入最后一个数据后,等待UART状态寄存器的TC位置1,表示传输完成,如果这个过程CR1的TCIE置1,就会产生中断,下面补充几个非常重要的标志位:

  • TE:发送
  • TXE:发送寄存器为空
  • TC:发送完成
  • TXIE:发送完成中断使能

如果是接收器的话,大体和上述部分类似,就是一些名字换了而已。

2、IIC

下面来说下IIC协议,其实这方面我之前已经写过文章记录了,不过那个是偏应用的,这里本篇文章就算是偏理论吧!

1、特点

iic有两根线,SDA为数据输入输出线,SCL为时钟信号线,因为这里有时钟来同步信号,所以IIC是同步通信。

iic的一大特点在于他是多主多从的一种总线通信方式,一个iic总线上可以由多个主机,同样的也可以有多个从机,这是其他很多总线都不会有的,同时iic对数据要求很高,因为他每发送一个数据就要一个应答(要结束的时候发送非应答NACK)。

2、硬件层

硬件层上总线是的布局,但就是注意下接个上拉电阻,因为要保证空闲状态是上拉的状态。
在这里插入图片描述

3、协议层

协议层如下所示,下面写数据(每个data都要跟一个应答,最后是非应答
在这里插入图片描述
下面是读数据(每个data都要跟一个应答,最后是非应答
在这里插入图片描述
整体的话大概就是如下:(每个data都要跟一个应答,最后是非应答
在这里插入图片描述
起始信号和应答信号(SCL为高,SDA下降沿为起始,SCL为高,SDA上升沿为结束
在这里插入图片描述
应答信号
在这里插入图片描述
那么数据应该是怎么读取的呢,很简单就是一句话:SDA在SCL的每个时钟周期进行数据传输,每个时钟周期传输一位数据

时钟周期这里可以近似理解为方波,就是不断地上下变化的,这样才是一个周期嘛,然后不是整个时钟周期都在读取数据的,这里要注意就是只在SCL为高电平的时候读取数据,也可以理解为SCL为高电平时候,数据有效,这个时候读取SDA的电平状态,SDA为高电平就是1,反之就是0,而SDA为低电平的时候,这个时候SDA就可以进行电平转换了,比如这个时候转换了一下那么读取的就是10,如果没转换,就是11,这样一共进行八次,就完成一个字节的数据传输了!

3、SPI

下面来进行SPI的总结,这个我也有相关文章介绍,可以查看我之前的文章,还是一样的,比较偏应用,这里对理论进行解读

1、特点

SPI的特点是高速,全双工,同步通信,SPI和iic不一样,同一条总线上,最多只能有一个SPI主机,可以有多个从设备,但是绝对不能有多个主机,SPI的读写均由主设备发起,多从机的时候,主机对从机的选择由各个从机的片选信号来决定。

2、硬件层

硬件层上总线是的布局,这里注意下片选信号即可
在这里插入图片描述

3、协议层

下面有一张图描绘了SPI的通信协议,挺难看的。
在这里插入图片描述
说实话SPI一个挺容易的协议的,被这么一弄,整的挺复杂的,下面我手绘了一张图,相信能更容易看懂SPI协议
在这里插入图片描述
看通信不还是看数据,看时钟吗,这里和IIC一样的有时钟线,但是多了一个数据线,对啊,要不人家怎么是全双工总线呢,同步传输啊,那数据传输不还是在时钟周期上来捕获数据线上的数据吗,那就完事了。

SPI还有一点就是他多了两个东西,让这个过程变得复杂了一点点,真的就是复杂了一点点,这两个就是时钟相位还有极性

因为这两个东西,SPI可以有四种工作模式,下面对这两个东西(CPOL为时钟极性,CPHA为是时钟相位)的作用进行介绍:

  • CPOL=0:SCLK=1时数据有效
  • CPOL=1:SCLK=0时数据有效
  • CPHA=0:数据采样在第一边沿
  • CPHA=1:数据采样在第二边沿,发送在第一边沿

这里的有效啥意思呢:

  • 第一边沿上升沿,第二边沿下降沿为SCLK=1有效
  • 第一边沿下降沿,第二边沿上升沿为SCLK=0有效
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>