USART

简介

USART:Universal Synchronous Asynchronous Receiver Transmitter,通用同步异步收发器

UART:Universal Asynchronous Receiver Transmitte,通用异步收发器

USART算是UART的哥哥,比UART多一个同步通信特性。这两个都是串行通信协议。同步通信需要双方时钟频率一致,而异步通信无需时钟频率一致,通过设置固定的波特率+识别起始位和结束位来识别数据。其数字基带调制均使用NRZ(不归零)码。

UART和USART最大都只能和一个主机同时通信

波特率

UART通信的波特率用于描述UART每秒传输的比特的速度(因为UART采用二进制信道Baud=bps),其单位为bps(bit per sec),常用的波特率有9600,115200等。以9600为例,每一个bit持续的Ts就是

帧格式

UART规定数据空闲时,总线为高电平。

image-20240205002705006

UART的帧格式为

  1. 起始位:一个低电平信号,使用由高电平(空闲)朝低电平(起始位)跳变的边沿触发来检测。
  2. 先低后高的数据位,通常为8bit,不同的UART控制器支持的bit数不同,一般可以通过寄存器配置使用几位数据位。
  3. 校验位(可有可无),它有4种校验模式
    • 奇校验(ODD):每个字节传送整个过程中bit为1的个数是奇数个(使用校验位调调控)
    • 偶校验(EVEN):每个字节传送整个过程中bit为1的个数是偶数个(使用校验位调调控)
    • 固定校验位(STICK): 固定在校验位置位逻辑高(MARK)或者逻辑低(SPACE)。
    • 无校验位(NONE):不发送校验位,直接停止。
  4. 停止位,保持高电平,持续1位或1.5位或2位均可。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。

串口流控(CTS/RTS)

串口流控介绍

在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。举个例子,假如用于接收的UART buffer已经满了,单片机还没来得及处理buffer内的数据,此时再继续发来新的数据,数据就会丢失。因此,使用串口流控来避免这种情况。

如何使用

RTS (Require ToSend,发送请求)为输出信号,用于指示本设备是否准备好接收数据,低电平有效,低电平说明本设备准备好接收数据。

CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明可以向对方发送数据。

在两设备通信时,RTS和CTS的连接如下:

1
2
3
4
/*
设备1RTS -------- 设备2CTS
设备1CTS -------- 设备2RTS
*/

SPI

简介

SPI :Serial Peripheral Interface (串行外设接口) 一种同步全双工串行通信协议。它的通信速度比I2C和UART都要快。SPI通信内只有一个主机,可支持多个从机。连接图如下

image-20240208213112276

SS或CS选择信号线:

通过给SS信号线来选择和哪一个从机通信。通常,高电平无效,低电平有效,但是有例外,要参考从机的芯片手册。

SCK时钟信号线:

由主设备产生的同步时钟。通常,MOSI和MISO上的数据信号可以在上升或下降时钟沿被采集,详情需要参考特定的芯片手册。一般来说,会有一个CKP或CKOL(时钟极性)参数,来决定时钟闲时电平高低。还有一个CKE或CPHL(时钟相位)参数来决定是第一次跳变时采集数据还是第二次。这二者共同决定数据在时钟上沿还是下沿被采集。

MOSI:

Master Output,Slave Input,用于主机向从机发送信号

MISO

Master Input,Slave Output,用于从机向主机发送信号

时钟极性和相位的规定

时钟极性CPOL决定时钟在空闲时的电平高低。规定如下

  • CPOL= 0:空闲时SCLK为低电平
  • CPOL= 1:空闲时SCLK为高电平

CPHA表示采样时刻,也就是时钟相位。用于指明在第几次跳变时开始第一次采样。

  • CPHA= 0:第一个时钟沿

  • CPHA= 1:第二个时钟沿

帧格式

SPI通信在发送数据时不包含IIC中的地址码、应答信号或是UART中的起始位、停止位、校验位。它的数据是简单的纯数据位,没有应答,没有起始,没有结束SPI的数据位先发高位(MSB),再发低位(LSB)。高电平表示1,低电平表示0。在一个字节传输完成后,SPI可以紧跟着直接发送下一个字节,没有应答操作。

image-20240208234346844