一.串口通信的物理层与协议层
物理层规定了通讯系统的机械、电子特性(相当于规定了用嘴巴还是肢体交流)
协议层规定了通讯逻辑、数据打包解包标准(相当于规定了用中文还是英文交流)
1.物理层
串口通信的物理层有很多标准和变种,以RS232标准为例,规定了信号的用途、通讯接口、电平标准。
- 电平标准
串口通讯分为TTL标准和RS232标准
通讯标准 | 电平标准(发送端) |
---|---|
5V TTL | 逻辑1:2.4V ~ 5V ; 逻辑0:0V ~ 0.5V |
RS232 | 逻辑1:-15V ~ -3V ; 逻辑0:+3V ~ +15V |
因为控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS232电平的信号进行互相转换。
- 信号的用途
串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线为逻辑1时,则告知远端的调制解调器本机已准备好接收数据,0表示还没准备就绪。 - 通讯接口(RS232)
2.协议层
串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口协议层规定了数据包的内容,包括起始位、数据位、校验位、停止位等。
- 波特率:串口异步通讯中由于没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。上图中用虚线分开的每一格代表一个码元。
- 起始位、停止位:数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止位可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。
- 数据位:有效数据的长度常被约定为5、6、7或8位长。
- 校验位:校验位是可选的,奇校验要求数据位和校验位中1的个数为奇数;偶校验要求数据位和校验位中1的个数为偶数;0校验是校验位总为0;1校验是校验位总为1。
二.USART及UART简介
1.引脚功能
- TX:发送数据输出引脚
- RX:接收数据输入引脚
- SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚。
- nRTS:请求以发送(Request To Send),n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置成高电平。
- nCTS:清除以发送(Clear To Send),n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据;如果为高电平则在发送完当前数据帧后停止发送。
- SCLK:发送器时钟输出引脚,该引脚仅适用于同步传输。
注意: UART只有异步传输功能,所以没有SCLK、nCTS、nRTS引脚。
2.数据寄存器
- 数据字长: USART数据寄存器(USART_DR)只有低9位有效,并且第9位数据是否有效取决于USART控制寄存器1(USART_CR1)的M位设置,M位为0时表示8位数据字长,M位为1时表示9位数据字长。如果没有使能奇偶校验控制,一般使用8位数据位;如果使能了奇偶校验控制则一般设置为9位数据位。
- 发送接收寄存器: USART_DR包含已发送的数据或接收到的数据,USART_DR实际包含两个寄存器:用于发送的可写TDR、用于接收的可读RDR。进行发送操作时往USART_DR写数据会自动存储在TDR内;进行读取操作时向USART_DR读取数据会自动提取RDR数据。
- 传输过程: TDR和 RDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把 TDR内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到 RDR。
- USART支持DMA传输,可以实现高速数据传输。
3.控制寄存器
USART包括发送器(控制发送)、接收器(控制接收)、唤醒单元、中断控制等,使用USART之前需要将USART_CR1寄存器的UE位置1以使能USART,UE位用来开启供给串口的时钟。
- 发送器: 当 USART_CR1 寄存器的发送使能位 TE 置 1 时,启动数据发送,发送移位寄存器的数据会在 TX 引脚输出,低位在前,高位在后。停止位时间长短通过 USART 控制寄存器2(USART_CR2)的 STOP[1:0]位控制,可选 0.5 个、1 个、1.5 个和 2 个停止位。默认使用 1 个停止位。发送字符时序图如下:
当发送使能位 TE 置 1 之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往 USART_DR 寄存器写入要发送的数据。在写入最后一个数据后,需要等待 USART 状态寄存器(USART_SR)的 TC 位为 1,表示数据传输完成,如果USART_CR1 寄存器的 TXIE 位置 1,将产生中断。
名称 | 描述 |
---|---|
TE | 发送使能 |
TXE | 发送寄存器为空,发送单个字节的时候使用 |
TC | 发送完成,发送多个字节数据的时候使用 |
TXIE | 发送完成中断使能 |
- 接收器: 如果将 USART_CR1 寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 线开始搜索起始位。在确定到起始位后就根据 RX 线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到 RDR 内,并把 USART_SR 寄存器的 RXNE 位置1,同时如USART_CR2 寄存器的 RXNEIE 置 1 的话可以产生中断。
名称 | 描述 |
---|---|
RE | 接收使能 |
RXNE | 读数据寄存器非空 |
RXNEIE | 接收完成中断使能 |
4.波特率计算
波特率:数据信号对载波的调制速率,用单位时间载波调制状态改变次数来表示,单位为波特。
比特率:单位时间内传输的比特数,单位bit/s(bps)。
对于USART波特率、比特率相等,就不做区分,波特率越大,传输速率越快。
USARTDIV是存放在波特率寄存器(USART_BRR)的一个无符号整数,其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分,DIV_Fraction[3:0]位定义USARTDIV的小数部分。
5.校验控制
- 使能奇偶校验控制后,字符帧的格式会变成:起始位+数据位+校验位+停止位。
- 接收数据时如果出现奇偶校验位验证失败,USART_SR寄存器的PE位会置1,并可以产生奇偶校验中断。
6.中断控制
USART有多个中断请求事件,如下表:
中断事件 | 事件标志 | 使能控制位 |
---|---|---|
发送数据寄存器为空 | TXE | TXEIE |
CTS标志 | CTS | CTSIE |
发送完成 | TC | TCIE |
准备好读取接收到的数据 | RXNE | RXNEIE |
检测到上溢错误 | ORE | RXNEIE |
检测到空闲线路 | IDLE | IDLEIE |
奇偶校验错误 | PE | PEIE |
断路标志 | LBD | LBDIE |
多缓冲通信中的噪声标志、上溢错误和帧错误 | NF/ORE/FE | EIE |