嵌入式中常用串行通信
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规定数据空闲时,总线为高电平。
UART的帧格式为
- 起始位:一个低电平信号,使用由高电平(空闲)朝低电平(起始位)跳变的边沿触发来检测。
- 先低后高的数据位,通常为8bit,不同的UART控制器支持的bit数不同,一般可以通过寄存器配置使用几位数据位。
- 校验位(可有可无),它有4种校验模式
- 奇校验(ODD):每个字节传送整个过程中bit为1的个数是奇数个(使用校验位调调控)
- 偶校验(EVEN):每个字节传送整个过程中bit为1的个数是偶数个(使用校验位调调控)
- 固定校验位(STICK): 固定在校验位置位逻辑高(MARK)或者逻辑低(SPACE)。
- 无校验位(NONE):不发送校验位,直接停止。
- 停止位,保持高电平,持续1位或1.5位或2位均可。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。
串口流控(CTS/RTS)
串口流控介绍
在两个设备正常通信时,由于处理速度不同,就存在这样一个问题,有的快,有的慢,在某些情况下,就可能导致丢失数据的情况。举个例子,假如用于接收的UART buffer已经满了,单片机还没来得及处理buffer内的数据,此时再继续发来新的数据,数据就会丢失。因此,使用串口流控来避免这种情况。
如何使用
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备是否准备好接收数据,低电平有效,低电平说明本设备准备好接收数据。
CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明可以向对方发送数据。
在两设备通信时,RTS和CTS的连接如下:
1 | /* |
SPI
简介
SPI :Serial Peripheral Interface (串行外设接口) 一种同步全双工串行通信协议。它的通信速度比I2C和UART都要快。SPI通信内只有一个主机,可支持多个从机。连接图如下
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可以紧跟着直接发送下一个字节,没有应答操作。