USART串口协议

参考视频:[9-1] USART串口协议_哔哩哔哩_bilibili

USART串口协议

通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统

通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

引脚:

TX是数据发送脚,RX是数据接收脚。

SCL是时钟,SDA是数据。

SCLK是时钟,MOSI是主机输出数据脚,MISO是主机输入数据脚,CS是片选,用于指定通信的对象。

CAN_H和CAN_L,这两个是差分数据脚,用两个引脚表示一个差分数据。

DP和DM,也是一对差分数据脚。

双工:

全双工:通信双方能够同时进行双向通信,一般来说,全双工的通信都有两根通信线

半双工:数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送

单工:数据只能从一个设备到另一个设备,不能反着来

时钟:接收到的电平,如何判断,这就需要有一个时钟信号来告诉接收方,你什么时候需要采集数据。

I2C和SPI有单独的时钟线,所以它们是同步的,接收方可以在时钟信号的指引下进行采样。

剩下的串口、CAN、USB没有时钟线,所以需要双方约定一个采样频率,这就是异步通信,并且还需要加一些帧头帧尾等,进行采样位置的对齐。

电平特性:

单端信号:引脚的高低电平都是对GND的电压差,所以单端信号通信的双方必须要共地,也就是把GND接在一起,所以说这里的通信的引脚,前三个还应该加一个GND引脚。

差分信号:靠两个差分引脚的电压差来传输信号。不过USB里面还有一些地方需要单端信号,所以USB还是需要共地的。

设备:

串口和USB属于点对点的通信,中间三个是可以在总线上挂载多个设备的。

点对点相当于老师找一个学生去办公室谈话。多设备相当于老师在教室里,面对所有同学谈话,需要有一个寻址的过程,以确定通信的对象。

串口通信

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。

单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力

硬件电路

简单双向串口通信有两根通信线(发送端TX和接收端RX

TXRX要交叉连接

只需单向的数据传输时,可以只接一根通信线

电平标准不一致时,需要加电平转换芯片

VCC和GND是供电,TX和RX是通信的引脚。

TX和RX是单端信号,它们的高低电平都是相对于GND的。所以严格来说GND也算通信线。

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:

TTL电平:+3.3V+5V表示10V表示0

RS232电平:-3~-15V表示1+3~+15V表示0

RS485电平:两线压差+2~+6V表示1-2~-6V表示0(差分信号)

一个设备使用TX发送高低电平,另一个设备使用RX接收高低电平。在线路中,使用TTL电平。因为STM32是3.3V的器件。所以如果线路对地是3.3V,就代表发送了逻辑1;如果线路对地是0V,就代表发送了逻辑0。

串口参数及时序

串口中,每一个字节都装载在一个数据帧里面。每一个数据帧都由起始位,数据位,停止位组成,数据位有8个,代表一个字节的8位。右图的数据位最后加了一个奇偶校验位,这样数据位就一共是9位。

串口的参数:

波特率:串口通信的速率。因为串口是异步通信,所以需要双方约定一个通信速率,比如我每隔1s发送一位,那你就也得每隔1s接收一位。

起始位:标志一个数据帧的开始,固定为低电平。首先引脚空闲时为高电平,然后需要传输的时候,必须需要先发送一个起始位,这个起始位必须是低电平,来打破空闲状态的高电平,来产生一个下降沿。

数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。比如要发送0X0F,首先把0F转换为二进制,就是00001111,然后低位先行,所以数据要从低位开始发送,也就是11110000,这样依次放在发送引脚上。

校验位:用于数据验证,根据数据位计算得来。

停止位:用于数据帧间隔,固定为高电平。同时这个停止位也是为下一次发送做准备的。

串口时序:

USART串口外设

USARTUniversal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器。

USARTSTM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。

带波特率发生器(实际就是分频器),最高达4.5Mbits/s。

配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2)。

可选校验位(无校验/奇校验/偶校验)。

支持同步模式、硬件流控制、DMA、智能卡、IrDALIN。

STM32F103C8T6 USART资源: USART1 USART2 USART3。

USART框图

数据寄存器分为两种,一个是发送数据寄存器,一个是接收数据寄存器。当进行写操作时,数据就写到了TDR;当进行读操作时,数据就是从RDR读出来的。

发送移位寄存器的作用就是把一个字节的数据一位一位地移出去,正好对应串口协议的波形的数据位。

比如某时刻给TDR写入了0x55这个数据,在寄存器里就是二进制存储01010101,这时硬件检测到写入数据了,就会检查当前发送移位寄存器是不是有数据正在移位,如果没有01010101就会立刻全部移动到发送移位寄存器,准备发送。

当数据从TDR移动到发送移位寄存器时,会置一个标志位,叫TXE(发送寄存器空),如果检查到这个标志位为1了,就可以在TDR写入下一个数据了。

注意:当TXE为1时,数据其实还没有发送出去,只要数据从TDR转移到发送移位寄存器了,TXE就会置1,就可以写入新的数据了。

发送移位寄存器就会在下面这里的发送器控制驱动下,向右移动一位,然后一位一位地把数据输出到TX引脚,这里是向右移位的,正好和串口协议规定的低位先行是一致的。当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器里来。

接收端也是类似的,数据从RX引脚通向接收移位寄存器,在接收器控制的驱动下,一位一位地读取RX电平,先放在最高位,然后向右移,移位八次之后,就能接收一个字节了。因为串口协议规定是低位先行,所以接收移位寄存器是从高位往低位这个方向移动的。之后当一个字节移位完成之后,这一个字节的数据就会整体地一下子转移到接收数据寄存器RDR里来,在转移的过程中也会置一个标志位,叫RXNE(接收数据寄存器非空),当检测到RXNE置1之后,就可以把数据移走了。

硬件数据流控,简称流控。如果发送设备发的太快,接收设备来不及处理,就会出现丢弃或覆盖数据的现象,有了流控,就可以避免这个问题了。流控有两个引脚,一个nRTS,一个nCTS。nRTS是请求发送,是输出脚,也就是告诉别人,我当前能不能接收。nCTS是清除发送,是输入脚,也就是用于接收别人nRTS的信号的。前面的n表示低电平有效。

首先找到另一个支持流控的串口,它的TX接到我的RX,然后我的nRTS要输出一个能不能接收的反馈信号,接到对方的nCTS。当我能接收的时候,nRTS就置低电平,请求对方发送,对方的nCTS接收到之后,就可以一直发。但我处理不过来时,比如接收数据寄存器我一直没读,又有新的数据过来了,现在就代表我没有及时处理,那nRTS就会置高电平,对方nCTS接收到之后,就会暂停发送。直到接收数据寄存器被读走,nRTS置低电平,新的数据才会继续发送。

反过来。当我的TX给对方发送数据时,我们nCTS就要接到对方的nRTS,用于判断对方能不能接收。TX和nCTS是一对的,RX和nRTS是一对的。nCTS和nRTS也要交叉连接。

SCLK用于产生同步的时钟信号,它是配合发送移位寄存器输出的。发送寄存器每移位一次,同步时钟电平就跳变一个周期,时钟告诉对方,我移出去一位数据了。当然这个时钟只支持输出,不支持输入,所以两个USART不能实现同步的串口通信。

唤醒单元:实现串口挂载多设备。串口一般是点对点的通信,点对点是只支持两个设备互相通信,想发数据直接发就行。而多设备在一条总线上,可以接多个从设备,每个设备分配一个地址,我想跟某个设备通信,就先进行寻址,确定通信对象,再进行数据收发。在这里可以给串口分配一个地址,当发送指定地址时,此设备唤醒开始工作;当发送别的设备地址时,别的设备就唤醒工作。

中断输出控制,中断申请位,就是状态寄存器这里的各种标志位。状态寄存器这里有两个标志位比较重要,一个是TXE发送寄存器空,另一个是RXNE接收寄存器非空,这两个是判断发送状态和接收状态的必要标志位。中断控制就是配置中断是不是能通向NVIC。

最下面就是波特率发生器,其实就是分频器。APB时钟进行分频,得到发送和接收移位的时钟。

fPCLKx(x=1,2),USART1挂载在APB2,所以就是PCLK2的时钟,一般是72M;其他的USART都挂载在APB1,所以是PCLK1的时钟,一般是36M。

之后时钟进行分频,除以一个USARTDIV的分频系数。

分频完之后还要再除16,得到发送器时钟和接收器时钟,通向控制部分。

右边这里如果TE为1,就是发送器使能了,发送部分的波特率就有效;如果RE为1,就是接收使能了,接收部分的波特率有效。

USART基本结构

最左边是波特率发生器,用于产生约定的通信速率。时钟来源是PCLK2/1,经过波特率分频后,产生的时钟通向发送控制器和接收控制器。发送控制器和接收控制器,用来控制发送移位和接收移位。

之后由发送数据寄存器和发送移位寄存器这两个寄存器的配合,将数据一位一位地移出去,通过GPIO的复用输出,输出到TX引脚,产生串口协议规定的波形。当数据由发送数据寄存器转移到发送移位寄存器时,会置一个TXE的标志位,看这个标志位就可以知道是不是可以写下一个数据了。

然后接收部分也是类似的,RX引脚的波形,通过GPIO输入,在接收控制器的控制下,一位一位地移入接收移位寄存器,移完一帧数据后,数据就会统一转运到接收数据寄存器,在转移的同时,置一个RXNE标志位,检查这个标志位就可以知道是不是收到数据了,同时这个标志位也可以去申请中断,这样就可以在收到数据时,直接进入中断函数,然后快速地读取和保存数据。

图中看上去有4个寄存器,但在软件层面上,只有一个DR寄存器可以供我们读写。

最后就是开关控制。

同步时钟输出功能,可以看到在每个数据位的中间,都有一个时钟上升沿。接收端可以在时钟上升沿进行采样。

最好选择9位字长,有校验;或者8位字长,无校验。这样每一帧的有效载荷都是1字节。

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率,连续采样一帧数据。输入的这部分电路对采样时钟进行了细分,它会以波特率的16倍频率进行采样,也就是在一位的时间里可以进行16位的采样,最开始,空闲状态高电平,采样一直是1,在某个位置突然采到0,就说明在这两次采样之间,出现了下降沿,如果没有任何噪声,之后就是起始位了,在起始位,会进行连续16次采样。

从1到16,在一个数据位,有16个采样时钟,由于起始位侦测已经对齐了采样时钟,所以就直接在8,9,10次采样数据位。没有噪声的理想情况下,这三次肯定全为1或全为0。如果有噪声,导致3次采样不全为0或者全为1,就按2:1来,2次为1就认为收到了1,2次为0就认为收到了0。

发送器和接收器的波特率由波特率寄存器BRR里的DIV确定。DIV分为整数部分和小数部分。

计算公式:波特率 = fPCLK2/1 / (16 * DIV)。因为前面有16个采样时钟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值