1串口通讯协议简
串口通讯(SerialCommunication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。
物理层串口通讯的物理层有很多标准及变种,我们主要讲解RS-标准,RS-标准主要规定了信号的用途、通讯接口以及信号的电平标准。使用RS-标准的串口设备间常见的通讯结构见图1。
图1串口通讯结构图
在上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-标准”传输数据信号。由于RS-电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。
1.电平标准
根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-标准,见表1。
表1TTL电平标准与RS电平标准
通讯标准
电平标准(发送端)
5VTTL
逻辑1:2.4V-5V
逻辑0:0~0.5V
RS-
逻辑1:-15V~-3V
逻辑0:+3V~+15V
我们知道常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。使用RS与TTL电平校准表示同一个信号时的对比见图2。
图2RS-与TTL电平标准下表示同一个信号
因为控制器一般使用TTL电平标准,所以常常会使用MA3芯片对TTL及RS-电平的信号进行互相转换。
2.RS-信号线
在最初的应用中,RS-串口标准常用于计算机、路由与调制调解器(MODEN,俗称“猫”)之间的通讯,在这种通讯系统中,设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。
RS-是全双工通信。是三线制非差分信号,收发各使用一根信号线,通过这几根信号线与地线的电压差,来判断传输的数据。所以是全双工的。但传输距离很近,一般不超过十米。
RS是电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,RS规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的;但是,RS与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。RS最终结果都是转换为TTL电平方式与单片机通信(CAN收发器把差分信号转化为TTL--CAN控制器(MCU))。其目的都是提高通信质量,提高抗干扰能力。
RS
RS,半双工、(逻辑1:+2V--+6V逻辑0:-6V---2V)这里的电平指AB两线间的电压差。是二线制差分信号,也就是实际传输的数据是通过判断这两条信号线上的电压差来实现的,正因如此,半双工的,也就是发送和接收不能同时进行,也因如此,的通讯距离,可以达到几千米。RS和RS一样,也是电气协议。
在旧式的台式计算机中一般会有RS-标准的COM口(也称DB9接口),见图3。
图3电脑主板上的COM口及串口线
其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-标准调制的。
在这种应用场合下,DB9接口中的公头及母头的各个引脚的标准信号线接法见图4及表2。
图4DB9标准的公头及母头接法
表2DB9信号线说明(公头,为方便理解,可把DTE理解为计算机,DCE理解为调制调解器)上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用“直通型”的串口线连接起来即可,见图5。
图5计算机与调制调解器的信号线连接
串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。
在目前的其它工业控制使用的串口通讯中,一般只使用RXD、TXD以及GND三条信号线,直接传输数据信号,而RTS、CTS、DSR、DTR及DCD信号都被裁剪掉了。
协议层串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见图6。
图6串口数据包的基本组成
1.波特率
本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面讲解的DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图6中用虚线分开的每一格就是代表一个码元。常见的波特率为、、等。
2.通讯的起始和停止信号
串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。
3.有效数据
在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。
4.数据校验
在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity)。
奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:,此时总共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
偶校验与奇校验要求刚好相反,要求帧数据和校验位中“1”的个数为偶数,比如数据帧:,此时数据帧“1”的个数为4个,所以偶校验位为“0”。
0校验是不管有效数据中的内容是什么,校验位总为“0”,1校验是校验位总为“1”。
2STM32的USART简介
通用同步异步收发器(UniversalSynchronousAsynchronousReceiverandTransmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于USART还有一个UART(UniversalAsynchronousReceiverandTransmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
串行通信一般是以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。USART就是对这些传输参数有具体规定,当然也不是只有唯一一个参数值,很多参数值都可以自定义设置,只是增强它的兼容性。
USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会)SIRENDEC规范。
USART支持使用DMA,可实现高速数据通信,有关DMA具体应用将在DMA章节作具体讲解。
USART在STM32应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
UART和USART的区别
USART(universalsynchronousasynchronousreceiverandtransmitte):通用同步异步收发器,USART是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。
UART(universalasynchronousreceiverandtransmitter):通用异步收发器,异步串行通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。从名字上可以看出,USART在UART基础上增加了同步功能,即USART是UART的增强型。
当我们使用USART在异步通信的时候,它与UART没有什么区别,但是用在同步通信的时候,区别就很明显了:大家都知道同步通信需要时钟来触发数据传输,也就是说USART相对UART的区别之一就是能提供主动时钟。如STM32的USART可以提供时钟支持ISO的智能卡接口。
USART是指单片机的一个端口模块,可以根据需要配置成同步模式(SPI,I2C),也可以将其配置为异步模式,后者就是UART。所以说UART姑且可以称之为一个与SPI,I2C对等的“协议”,而USART则不是一个协议,而是更应该理解为一个实体。相比于同步通讯,UART不需要统一的时钟线,接线更加方便。但是,为了正常的对信号进行解码,使用UART通讯的双方必须事先约定好波特率,即每个码元的长度。
3STM32的USART功能框图
USART的功能框图包含了USART最核心内容,掌握了功能框图,对USART就有一个整体的把握,在编程时就思路就非常清晰。USART功能框图见图7。
图7USART功能框图
1.功能引脚
TX:发送数据输出引脚。
RX:接收数据输入引脚。
SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。
nRTS:请求以发送(RequestToSend),n表示低电平有效。如果使能RTS流控制,当
USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,
nRTS将被设置为高电平。该引脚只适用于硬件流控制
nCTS:清除以发送(ClearToSend),n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。
SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。
USART引脚在STM32FZET6芯片具体分布见表3。
表3STM32FZET6芯片的串口引脚
STM32FZET6系统控制器有三个USART和两个UART,其中USART1和时钟来源于APB2总线时钟,其最大频率为72MHz,其他四个的时钟来源于APB1总线时钟,其最大频率为36MHz。UART只是异步传输功能,所以没有SCLK、nCTS和nRTS功能引脚。
2.数据寄存器
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支持DMA传输,可以实现高速数据传输,具体DMA使用将在DMA章节讲解。
3.控制器
围绕着发送器和接收器控制部分,有好多个寄存器:CR1、CR2、CR3和SR,即USART的三个控制寄存器(ControlRegister)及一个状态寄存器(StatusRegister)。通过向寄存器写入各种控制参数来控制发送和接收,如奇偶校验位、停止位等,还包括对USART中断的控制;串口的状态在任何时候都可以从状态寄存器中查询得到。USART使用USART之前需要向USART_CR1寄存器的UE位置1使能USART,UE位用来开启供给给串口的时钟。发送或者接收数据字长可选8位或9位,由USART_CR1的M位控制。
发送器当USART_CR1寄存器的发送使能位TE置1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出,低位在前,高位在后。如果是同步模式SCLK也输出时钟信号。
一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。
停止位时间长短是可以通过USART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。默认使用1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。
当选择8位字长,使用1个停止位时,具体发送字符时序图见图8。
图8字符发送时序图
当发送使能位TE置1之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。在写入最后一个数据后,需要等待USART状态寄存器(USART_SR)的TC位为1,表示数据传输完成,如果USART_CR1寄存器的TCIE位置1,将产生中断。
在发送数据时,编程的时候有几个比较重要的标志位我们来总结下。
表4STM32串口发送寄存器
发送配置步骤:
1.通过在USART_CR1寄存器上置位UE位来激活USART
2.编程USART_CR1的M位来定义字长。
3.在USART_CR2中编程停止位的位数。
4.如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中的描述配置DMA寄存器。
5.利用USART_BRR寄存器选择要求的波特率。
6.设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
7.把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7。
8.在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏最后一次传输。
接收器如果将USART_CR1寄存器的RE位置1,使能USART接收,使得接收器在RX线开始搜索起始位。在确定到起始位后就根据RX线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR内,并把USART_SR寄存器的RXNE位置1,同时如果USART_CR2寄存器的RXNEIE置1的话可以产生中断。
在接收数据时,编程的时候有几个比较重要的标志位我们来总结下。
表5STM32串口接收寄存器
接收配置步骤:
1.将USART_CR1寄存器的UE置1来激活USART。
2.编程USART_CR1的M位定义字长
3.在USART_CR2中编写停止位的个数
4.如果需多缓冲器通信,选择USART_CR3中的DMA使能位(DMAR)。按多缓冲器通信所要求的配置DMA寄存器。
5.利用波特率寄存器USART_BRR选择希望的波特率。
6.设置USART_CR1的RE位。激活接收器,使它开始寻找起始位。
4.波特率生成
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位bit/s(bps)。对于USART波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。
在配置波特率时,我们向波特比率寄存器USART_BRR写入参数,修改了串口时钟的分频值USARTDIV。USART_BRR寄存器包括两部分,分别是DIV_Mantissa(USARTDIV的整数部分)和DIV_Fraction(USARTDIV的小数)部分,最终,计算公式为USARTDIV=DIV_Mantissa+(DIV_Fraction/16)。
USARTDIV是对串口外设的时钟源进行分频的,对于USART1,由于它挂载在APB2总线上,所以它的时钟源为fpclk2;而USART2、3挂载在APB1上,时钟源则为fpclk1,串口的时钟源经过USARTDIV分频后分别输出作为发送器时钟及接收器时钟,控制发送和接收的时序。
USART的发送器和接收器使用相同的波特率。计算公式如下:
Tx/Rx=fpclk/(16*USARTDIV)
其中,fpclk为USART时钟,USARTDIV是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分,DIV_Fraction[3:0]位定义USARTDIV的小数部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此时USART_BRR值为0x18A;那么USARTDIV的小数位10/16=0.;整数位24,最终USARTDIV的值为24.。
如果知道USARTDIV值为27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整数为11,所以DIV_Fraction[3:0]为0xB;DIV_Mantissa=整数(27.68)=27,即为0x1B。
波特率的常用值有、、、。下面以实例讲解如何设定寄存器值得到波特率的值。
我们知道USART1使用APB2总线时钟,最高可达72MHz,其他USART的最高频率为36MHz。我们选取USART1作为实例讲解,即fpclk=72MHz。为得到bps的波特率,此时:
Tx/Rx=/(16*USARTDIV)
解得USARTDIV=39.0,可算得DIV_Fraction=0.0*16=1=0x01,
DIV_Mantissa=39=0x27,即应该设置USART_BRR的值为0x。
5.校验控制
STM32F系列控制器USART支持奇偶校验。当使用校验位时,串口传输的长度将是8位的数据帧加上1位的校验位总共9位,此时USART_CR1寄存器的M位需要设置为1,即9数据位。将USART_CR1寄存器的PCE位置1就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见USART_SR寄存器的PE位置1,并可以产生奇偶校验中断。
使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。
6.中断控制
USART有多个中断请求事件,具体见表6。
表6USART中断请求
中断事件
事件标志
使能控制位
发送数据寄存器为空
TXE
TXEIE
CTS标志
CTS
CTSIE
发送完成
TC
TCIE
准备好读取接收到的数据
RXNE
RXNEIE
检测到上溢错误
ORE
检测到空闲线路
IDLE
IDLEIE
奇偶校验错误
PE
PEIE
断路标志
LBD
LBDIE
多缓冲通信中的噪声标志、上溢错误和帧错误
NF/ORE/FE
EIE
4STM32的USART硬件设计
串口接串口所谓的串口接串口,也就是不同的板子之间进行数据通信时,直接将串口短接即可,之间无需插接任何其他设备。如图9所示,如果要将板子与其他设备(STM32板子或者其他开发板,但不可是PC机)串口通信,直接将PA9和PA10与其他短接,值得注意的是需要反接,即RX-TX,TX-RX。
图9STM32FZET6USART1硬件电路图
串口转RS关于RS-前文已经详细介绍了,笔者就不再赘述了,笔者在这里要说下为何要用串口转RS,我们知道工控机的COM口就是标准RS-接口,它的高电平定义为-12V,而低电平定义为+12V。所以单片机(STM32或者其他)的串口必须经过电平转换才可以和标准RS-通信,这个转换芯片5V的一般是MAX或SP,3.3V的一般是MAX3或SP3。这就是工控机和STM32的串口之间就需要一个转换器,打个比方,就像我国的市电电压是V,日本的是V,那么你买个日本电器在国内使用,你就得买个电压转换器,不然你在国内一用,你的电器就是烧了。工控机和STM32串口通信就需要一个信号转换器,也就是电平转换器,这是因为它们之间的电平不同,其硬件电路如下图所示。
图10串口转硬件电路图
这种应用常用于工业控制,毕竟工业环境比较恶劣,串口转RS的硬件电路如下图所示。RS_TX和RS_RX直接接是STM32的串口,对应USART1的USART1_TX1和USART1_RXD。
RS硬件电路图
图11串口转硬件电路图
USB转串口这也是我们常使用的一种场景,我们在调试程序时,为了方便,或者没有仿真器/调试器,我们通过串口打印输出到上位机,就是进行数据调试,当也不一定是调试,我们要想将STM32终端设备获取的数据等信息通过PC机进行可视化显示,串口通信将是一个不错的选择。但是现在的PC机一般是没有RS-接口的,一般只有工控机才有接口,那么怎么解决呢?我们一般使用USB转串口芯片,目的只有一个,把电脑的USB口映射为串口用。常用的USB转串口芯片有CH、CP、PL、FT等。我们选择哪一个呢?CH是国产芯片,其他的是进口芯片。CH批量价1.5元每个,一般应用方面,性能已经足够,我使用这么多年,就没有出现过问题。PL山寨货太多,买的不放心。CP批量价5.2元,它是QFN封装,对于新手不易焊接。FT批量价在10元以上,一般用在工业级环境。经过综合的比较,我们选择CH作为我们开发板上使用的USB转串口芯片。
笔者的板子使用的USB转串口芯片是CH芯片,硬件电路如下图所示。CH是一个USB总线的转接芯片,实现USB转串口、USB转IrDA红外或者USB转打印口。在串口方式下,CH提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级到USB总线。CH芯片中TXD和RXD与STM32F1的USART1_RXD和USART1_TX1连接。CH的VD+和VD-是USB的信号接口。也就连接到了PC机的USB口。XI与XO为晶振的输入和输出,外界12MHz的晶振。图12USB转串口硬件电路图
5STM32串口编程流程
设置的一般步骤可以总结为如下几个步骤:
1)串口时钟使能,GPIO时钟使能;
2)串口复位;
3)GPIO端口模式设置;
4)串口参数初始化;
5)开启中断并且初始化NVIC;(根据需要配置)
6)使能串口;
7)编写中断处理函数;(根据需要配置)
关于STM32F1的具体代码请参看笔者博客。
串口通信:
本文编辑:佚名
转载请注明出地址 http://www.smartcarf.com/smartcarcx/9001.html