通讯的基本概念
- 串行通讯和并行通讯
特性 | 串行通讯 | 并行通讯 |
---|---|---|
通讯距离 | 较远 | 较近 |
抗干扰能力 | 较强 | 较弱 |
传输速率 | 较慢 | 较高 |
成本 | 较低 | 较高 |
- 全双工、半双工及单工通讯
通讯方式 | 说明 |
---|---|
全双工 | 在同一时刻,两个设备之间可以同时收发数据 |
半双工 | 两个设备之间可以收发数据,但不能在同一时刻进行 |
单工 | 在任何时刻都只能进行一个方向的通讯,即一个固定为发送设备,另一个固定为接收设备 |
- 同步通讯与异步通讯
在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。
在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据。某些通讯中还需要双方约定数据的传输速率,以便更好地同步。
在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。
- 通讯速率
Bitrate—比特率:每秒钟传输的二进制位数,单位为比特每秒(bit/s) 。(I2C、SPI)(同步)
Baudrate—波特率:表示每秒钟传输的码元个数。(USART)(异步)
一般一个码元用一个二进制表示,如:
但是当码元有多个时,需要多位的二进制表示,如:
串口通讯协议简介
对于通讯协议,我们以分层的方式来理解,分为物理层和协议层。
物理层
规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。(硬件)
RS-232标准
- RS232标准串口主要用于工业设备直接通信
- 电平转换芯片一般有MAX3232,SP3232
- DB9接口(COM口) 标准的公头及母头接法
USB转串口
- USB转串口主要用于设备跟电脑通信
- 电平转换芯片一般有CH340、PL2303、CP2102、FT232
- 使用的时候电脑端需要安装电平转换芯片的驱动
原生的串口到串口
- 原生的串口通信主要是控制器跟串口的设备或者传感器通信,不需要经过电平转换芯片来转换电平,直接就用TTL电平通信
- GPS模块、GSM模块、串口转WIFI模块、HC04蓝牙模块
TTL和232的区别
电平标准不同
TTL电平一般是芯片里面出来的电平
通讯标准 | 电平标准(发送端) |
---|---|
5V TTL | 逻辑1:2.4V ~ 5V; 逻辑0:0 ~ 0.5V |
RS-232 | 逻辑1:-15V ~ -3V ;逻辑0:+3V ~ +15V(增加抗干扰能力) |
协议层
主要规定通讯逻辑,统一收发双方的数据打包、解包标准。(软件)
串口数据包的基本组成
-
波特率
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面讲解的DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。上图中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200 等。
-
通讯的起始和停止信号
数据包的起始信号由一个逻辑0 的数据位表示,而数据包的停止信号可由0.5、1、1.5 或2 个逻辑1 的数据位表示,只要双方约定一致即可。
-
有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7 或8 位长。
-
数据校验(可选)
由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。
简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。
STM32—USART / UART
简介
STM32有5个串口,其中有三个通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter),简称USART(USART1、USART2、USART3),两个通用异步收发器(Universal Asynchronous Receiver and Transmitter),简称UART(UART4、UART5)。USART1在APB2上,计算波特率的时候,fck 为72MHZ,其他的在APB1上,计算波特率的时候,fck 为36MHZ。
USART 功能框图
功能引脚
TX: 发送数据输出引脚。
RX: 接收数据输入引脚。
SW_RX: 数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS: 请求以发送(Request To Send),n 表示低电平有效。如果使能RTS 流控制,当USART 接收器准备好接收新数据时就会将nRTS 变成低电平;当接收寄存器已满时,nRTS 将被设置为高电平。该引脚只适用于硬件流控制。
nCTS: 清除以发送(Clear To Send),n 表示低电平有效。如果使能CTS 流控制,发送器在发送下一帧数据之前会检测nCTS 引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK: 发送器时钟输出引脚。这个引脚仅适用于同步模式。
USART 引脚在STM32F103ZET6 芯片具体分布见下表:
引脚 | APB2 总线 | APB1 总线 | APB1 总线 | APB1 总线 | APB1 总线 |
---|---|---|---|---|---|
USART1 | USART2 | USART3 | UART4 | UART5 | |
TX | PA9 | PA2 | PB10 | PC10 | PC12 |
RX | PA10 | PA3 | PB11 | PC11 | PD2 |
SCLK | PA8 | PA4 | PB12 | ||
nCTS | PA11 | PA0 | PB13 | ||
nRTS | PA12 | PA1 | PB14 |
UART 只是异步传输功能,所以没有SCLK、nCTS 和nRTS 功能引脚。
数据寄存器
USART 数据寄存器(USART_DR)只有低9 位有效,并且第9 位数据是否有效要取决于USART 控制寄存器1(USART_CR1)的M位设置,当M位为0 时表示8 位数据字长,当M位为1 表示9 位数据字长,我们一般使用8 位数据字长。
USART_DR 包含了已发送的数据或者接收到的数据。USART_DR 实际是包含了两个寄存器,一个专门用于发送的可写TDR,一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR 写入数据会自动存储在TDR 内;当进行读取操作时,向USART_DR读取数据会自动提取RDR 数据。
TDR 和RDR 都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR 内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR。
控制寄存器 和 状态寄存器
控制寄存器有三个,为USART_CR1、USART_CR2、USART_CR3,对于每一位的功能可查看STM32F10x-参考手册第25章第6节。
为了便于理解,从发送和接受的过程对控制寄存器和状态寄存器的相关位功能进行学习
发送
- USART_CR1 寄存器的发送使能位TE 置1 时,启动数据发送。(发送移位寄存器的数据会在TX 引脚输出,低位在前,高位在后。如果是同步模式SCLK 也输出时钟信号。)当发送使能位TE 置1 之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR 寄存器写入要发送的数据。
- 停止位时间长短是可以通过USART 控制寄存器2(USART_CR2)的STOP[1:0]位控制。
- 状态寄存器(USART_SR) TXE 位:当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。如果USART_CR1寄存器中的TXEIE为1,则产生中断。对USART_DR的写操作,将该位清零。
- 状态寄存器(USART_SR) TC 位 :当包含有数据的一帧发送完成后,并且TXE=1时,由硬件将该位置’1’。如果USART_CR1中的TCIE为’1’,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入’0’来清除,只有在多缓存通讯中才推荐这种清除程序。
接收
- 控制寄存器1(USART_CR1) RE 位 置1,接收使能并开始搜寻RX引脚上的起始位。
- 状态寄存器(USART_SR) RXNE 位 :当RDR移位寄存器中的数据被转移到USART_DR寄存器中,该位被硬件置位。如果USART_CR1寄存器中的RXNEIE为1,则产生中断。对USART_DR的读操作可以将该位清零。RXNE位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。
波特率生成
-
波特比率寄存器(USART_BRR)的位15:4为DIV_Mantissa[11:0]:USARTDIV的整数部分,这12位定义了USART分频器除法因