USART
通信协议
串行通信
- 按数据传输方向分类:
- 单工:只发不收,或只收不发,例 打印机,广播电视
- 半双工:IIC,单总线(1-wire)
- 全双工:SPI、USART
- 按通信方式分类:
- 同步通信:带时钟同步信号,比如 SPI,IIC,USART(单独配置时钟线)
- 异步通信:不带时钟同步信号,比如 UART,USART,单总线
并行通信
- CPU内部的并行处理、内存与CPU之间的数据传输等。
传输速率
- IIC总线的工作速度分为3种版本:
- S(标准模式):100Kbps,即 100/8 = 12.5KB/s
- F(快速模式):400Kbps,即400/8 = 50KB/s
- HS(高速模式):3.4Mbps,即3.4M/8 = 435KB/s
- 超高速模式:5Mbit/s,即5M/8 = 525KB/s
- SPI:
- 全双工同步传输,速度约有50Mbps,即约5.9MB/s
- UART:
- 无限制,速度取决于波特率,常用9600bps(1.2KB/s)和115200bps(14.4KB/s)
- RS232:
- RS232传输距离有限,最大传输距离标准值为15米,且只能点对点通讯,最大传输速率最大为20KB/s。
- RS485:
- RS485最大无线传输距离为1200米。最大传输速率为10Mbps(1250KB/s),在100Kb/S(12.5KB/s)的传输速率下,才可以达到最大的通信距离。
- CAN:
- 距离小于40M:速度有1Mbps,即约128KB/s
- 距离大于40M小于10KM,速度低于5Kbps
- SDIO:
- SD内存卡接口基础上的接口
- 10Mbps以上
- HSMI:
- HDMI2.0传输速率为18Gbps(2.25GB/s)
- HDMI1.3传输速率为10.2Gbps(1.275GB/s)
- LVDS:
- 标准传输速率为655Mbps,理论上最快传输速率达1.923Gbps
UART 和 USART
UART(通用异步收发器)、USART(通用同步异步收发器)。
对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。
两者连接方式相同,USART 增加了时钟控制线。
同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。
RS232、RS485、RS422
原生串口:
- 原生串口是TTL->TTL,只规定数据以什么格式发送,未规定电平电压
- GPS模块,串口转wifi模块,HC04蓝牙模块
- 不同的电平标准设备之间不能通信
RS协议:
-
Recommended Standard 是推荐标准
-
RS232、RS485 都是电气层协议,在串口的基础上规定电平标准
-
不同设备的电平电压不同,串口不能直接连接
-
项目中不直接使用原生串口通信,使用 有RS协议的串口 更安全高效
RS232:
- 电脑的USB串口是RS232电平,单片机芯片是TTL电平
- +3 ~ +15V 逻辑0,-3 ~ -15V逻辑1
- 节点数为 1 发 1 收
- 接口的信号电平值较高,易损坏接口电路的芯片
- 传输速率较低,在异步传输时,波特率为20Kbps。现在由于采用新的UART 芯片16C550 等,波特率达到115.2Kbps。
- 接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
- 传输距离有限,最大传输距离标准值为50 米,实际上也只能用在15米左右。
- 接线:TX1 -> RX2 RX1 - > TX2
RS485:
RS-485是一种工业控制环境中常用的通讯协议,它 具有抗干扰能力强、传输距离远的特点。RS-485通讯协议由RS-232协议改 进而来,协议层不变,只是改进了物理层,因而保留了串口通讯协议应用 简单的特点。
RS-485与RS-232的差异只体现在物理层上,它们的协议层是相同的,也是 使用串口数据包的形式传输数据。而由于RS-485具有强大的组网功能,人们在基础 协议之上还制定了MODBUS协议,被广泛应用在工业控制网络中。此处说的基础协 议是指前面串口章节中讲解的,仅封装了基本数据包格式的协议(基于数据位),而 MODBUS协议是使用基本数据包组合成通讯帧格式的高层应用协议(基于数据包或字 节)。
由于RS-485与RS-232的协议层没有区别,进行通讯时,我们同样是使用 STM32的USART外设作为通讯节点中的串口控制器,再外接一个RS-485收发器芯片 把USART外设的TTL电平信号转化成RS-485的差分信号即可。
- 类似CAN,双绞线,差分传输数据,增加抗干扰性,减少噪声辐射
- 核心:modbus 协议
- 逻辑1:两线电压差 +2 ~ +6V,逻辑0:电压差 -2 ~ -6V
- 传输速率与传输距离RS-485 的数据最高传输速率为10Mbps,最大的通信距离约为1219米,传输速率与传输距离成反比,在10Kb/S的传输速率下,才可以达到最大的通信距离。
- 可连接多台设备,主从机制,类似IIC,节点数为 1发32收
- TTL电平兼容,可方便与TTL电路连接。
- 采用两线制,数据接收和发送都需要使用这对差分信号线,发送和接收不能同时进行,只能半双工。
- 接线:A1 -> A2 B1 - > B2
RS422:
RXA/Y︰接其他RS422模块的TXA/A
RXB/Z︰接其他RS422模块的TXB/B
TXB/B:接其他RS422模块的RXB/Z
TXA/A:接其他RS422模块的RXA /Y
接线原则:(发“+” 接 收“+”;发“-” 接 收“-”)
- 典型的RS-422是四线接口,全双工,差分传输,一主多从 通信的数据传输协议。
- 实际上还有一根信号地线,共5根线。
- 它采用平衡传输采用单向/非可逆,有使能端或没有使能端的传输线。
- 硬件构成上RS-422相当于两组RS-485,即两个半双工的RS-485构成一个全双工的RS-422。
- 由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,传输线上最多可10个节点。
- 设备间不能通信,只能一主多从。
- RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。
- 最大传输距离1219米,最大速率位10Mb/s。传输速率与距离成反比,100kb/s 以下才能到最大距离。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。
波特率、比特率
比特率:
- 每秒传输的 二进制位数,单位为比特每秒 (bps)
波特率:
- 每秒传输码元的个数
- 也就是1秒能发送多少个脉冲信号
码元:
-
一个码元就是一个脉冲信号,一个脉冲信号有可能携带1bit数据,也有可能携带2bit数据、4bit数据。
-
发送一个脉冲信号,如果就可以携带4bit数据,发送速率更快。
-
那么怎么实现一个脉冲信号就能携带多个bit数据呢?就需要一定的技术了,比如设置模拟信号中信号的频率、相位、振幅啥的。
-
举个例子:把振幅分成四种,低(00)、中(01)、高(10)、很高(11),这样我发一个脉冲信号,它的振幅是低,那就说明发送的是00(也就是2bit),它的振幅是中(01),发送的就是01(也就是2bit),也就实现了一个脉冲信号,携带2bit的功能。
波特率计算:
-
串口 进行 1bit 传输,所以码元为1,码元状态为 2
-
假设码元状态为 N,则此码元所需要的比特位数如下:
-
已知波特率Rs、码元状态总数量N后,对应比特率Rb关系如下:
- 如果使用 9600的波特率,其串口的比特率为 :9600Bps×1bit = 9600bps
-
如果已知的是比特率Rb、码元状态总数量N,则对应波特率Rs关系如下:
-
加入多路复用技术后,比特率Rb和波特率Rs关系变为:
-
传输 1 bit 计数多少次
- 系统时钟(为串口提供时钟的频率)=50M,则时钟周期 = 1/(50*10^6)
- 一个时钟周期计数一次,则1s计数50*10^6次
- 则计数一次 需要 1/(50*10^6)s
- 若波特率为 115200 ,1s传输115200 bit
- 则 1bit 需要1/115200 s = 8.68us
- 则 传输 1bit 需要计数 (50 *10^6)/ 115200 = 434 次
-
常用串口 一个 数据包 有10bit,传输一个数据包需要 86.8us
USART 数据传输格式
一般为 96N81 ,即9600波特率,NO无校验,8位数据,1位停止位
- **空闲位:**当总线处于空闲时信号线的状态为高电平
- 起始位:由1个逻辑 0 的数据位表示,开始进行数据传输时发送方要先发出一个低电平来表示传输字符的开始(与空闲位相反)。
- 停止位:由 0.5、 1、 1.5 或 2 个高电平的数据位表示
- 有效数据:在起始位后紧接着的就是有效数据,有效数据的长度常被约定为 5、 6、 7 或 8 位,先发送低位。
- 校验位:可选,为的是数据的抗干扰性。
- 无校验(no parity)。
- 奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,反之为“0”。
- 偶校验(even parity):如果数据位中“1”的数目是偶数,则校验位为“0”,反之为“1”。
- mark parity:校验位始终为1。
- space parity:校验位始终为0。
- 在设计UART程序的时候,一般先生成一个波特率时钟,然后再基于这个时钟进行数据接发。
功能框图
1.引脚
- TX:发送数据
- RX:接收数据
- SCLK:时钟输出引脚,仅适用于同步通信。
- **SW_RX、IRDA_OUT、IRDA_IN:**红外编码模块。
2.数据寄存器
数据寄存器—USART_DR:
- 低9位有效,包含一个发送数据寄存器TDR和一个接收数据寄存器RDR。
- 当进行发送操作时,往 USART_DR 写入数据会自动存储在 TDR 内;
- 当进行读取操作时,向 USART_DR 读取数据会自动提取 RDR 数据。
- TDR 和 RDR 都是介于系统总线和移位寄存器之间。串行通信是一位一位传输的,发送时把 TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的 每一位顺序保存在接收移位寄存器内然后才转移到 RDR
DR寄存器九位有效,具体用几位,有CR1寄存器决定:
- USART_CR1:
- M:决定数据位字长,为0:8bit;为1:9bit
- PCE:使能校验位
- PS:选择校验模式
- PEIE:PE中断使能,禁止/允许PE产生中断
- UE:打开串口,串口使能,控制串口时钟
- TE:发送使能,允许向外发送
- RE:接收使能,允许接收
- TXEIE:使能TXE 位 中断,置1则TXE为空时中断
- TCIE:使能 TC 中断,发送完成产生中断
- RXNEIE:使能RXNE 中断,
- USART_CR2:
- STOP,决定停止位
- USART_SR :
- PE:出现校验错误,置位 1
- TXE:发送数据寄存器 为空
- TC:发送完成
- RXNE:接收数据寄存器 不为空
数据发送时:
- 从总线接收数据到发送数据寄存器(TDR),转移到发送移位寄存器,再由该寄存器将数据通过TX发送出去
- 期间TDR将数据转移到发送移位寄存器后,USART_SR中TXE位置1,数据由发送移位寄存器发送出去后,TC位置1
- TXE 为 1 时 则可以再写入数据
数据接收时:
- 从RX接受的数据一位一位存入接收移位寄存器,该寄存器满时,将数据移入RDR,如果RDR满,则 USART_SR寄存器中RXNE位为 1
- 如果RXNE位为 1,则 可以从RDR中读取数据
3.控制器
- USART 有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。
- 使用 USART 之前需要向 USART_CR1 寄存器的 UE 位置 1 使能 USART,UE 位用来开启供给给串口 的时钟。
- 发送或者接收数据字长可选 8 位或 9 位,由 USART_CR1 的 M 位控制。
4.波特率配置
USART_BRR:波特率寄存器
- 设置 USARTDIV 的数值,该数值由整数部分和小数部分组成
- 小数部分由4位二进制数 表示,则最小的精度为 1/16,用小数除以精度可以 得出 二进制数值
- USARTDIV:无符号的定点数
- Fck:串口的时钟,注区分APB2和APB1两条总线
- USART:USART1,时钟为72M
- 波特率:115200
- DIV_Fraction:寄存器中小数部分占4位,则刻度为 1/16 = 0.0625,按照刻度即可算出小数部分的值
初始化结构体
typedef struct {
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字长
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校验位
uint16_t USART_Mode; // USART 模式 收/发
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
USART同步模式
STM32的同步串口的本质就是SPI, 那么这就不是同步串口,因为这种方式下,时钟信号不持续(如图一,每发完一个数据,时钟信号就会停止,和SPI的性质一致)。 故用这样的方式来实现同步串口功能,从机是无法主动向主机(STM32)发送数据的,这是致命缺点
硬件流控制
数据在两个串口之间进行通讯的时候常常会出现丢失数据的现象,比如两台计算机或者是一台计算机和一个单片机之间进行通讯,当接收端的数据缓冲区已经满了,这个时候如果还有数据发送过来,因为接收端没有时间进行处理,那这样的数据就有可能会丢失。
在工业现场或者其他领域,经常会遇到这种问题,本质原因是速度不匹配、处理能力不匹配。比如单片机的主频只有20M或30M,ARM的处理能力可能是200M,PC机的处理能力是几个G,这种处理能力的不匹配造成了传输的时候数据容易丢失。
硬件流控就是来解决这个速度匹配的问题。它的基本含义非常简单,当接收端接收到的数据处理不过来时,就向发送端发送不再接收的信号,发送端接收到这个信号之后就会停止发送,直到收到可以继续发送的信号再继续发送。因此流控本身是可以控制数据传输的进度,进而防止数据丢失。
-
nRTS:请求以发送 (Request To Send),n 表示低电平有效。
- 如果使能 RTS 流控制,当 USART 接收器准备好接收新数据时就会将 nRTS 变成低电平
- 当接收寄存器已满时,nRTS 将被设置为 高电平。
- 表示USART 是否准备好接收新数据,低电平表示允许
-
nCTS:清除以发送 (Clear To Send),n 表示低电平有效。
- 如果使能 CTS 流控制,发送器在发送下 一帧数据之前会检测 nCTS 引脚
- 如果为低电平,表示可以发送数据,如果为高电平则在发送完 当前数据帧之后停止发送。
- 在发送的时候要实时监测 CTS 的电平状态,如果发现是高电平,就不会再发送新的数据,直到 CTS 检测发现已经没有高电平信号了。
-
控制接收/发送 每一字节数据