USART小知识

一、空闲帧

1.定义

空闲符号被视为完全由 '1' 组成的完整的数据帧,后面跟着包含了数据的下一帧的开始位 ('1'
的位数也包括了停止位的位数 ) 。

2.意义

        对于USART接收而言,我们需要了解USART是否正在接收数据帧。空闲帧(Idle Frame)可以帮助我们区分接收状态和空闲状态。当检测到空闲帧时,表明USART当前未处于接收状态。然而,这样的描述还不够严谨。

检测空闲帧的严谨性

首先,USART的IDLE标志位(IDLE flag)是在接收完成后检测到空闲帧时置位的。如果没有再次接收数据,即使再次检测到空闲帧,IDLE标志位也不会重新置位。因此,IDLE标志位的置位代表了一次完整通信的结束。这对使用USART接收不定长数据非常有利。

应用场景

在实际应用中,我们可以通过以下步骤利用空闲帧和IDLE标志位进行数据接收:

  1. 开启RXNEIE中断:启用接收数据寄存器非空中断(RXNEIE),以便在接收到每个数据字节时触发中断。
  2. 软件定义帧结尾:通常,我们需要定义一个特定的数据作为帧结尾。然而,空闲帧可以代替这个角色。
  3. 开启IDLEIE中断:启用空闲中断(IDLEIE),以便在检测到空闲帧时触发中断。

在上述配置下,我们可以将接收到的数据存储在缓冲区中。当检测到空闲帧时,我们可以从缓冲区中取出所有数据,并从头开始填充缓冲区。因此,为了避免不必要的软件处理,IDLE标志位在接收完毕后应仅置位一次。

问题讨论:RE开启后IDLE是否需要在检测到空闲帧后置位?

IDLE这个标志只能证明帧结束后,总线彻底进入了空闲,但无法告诉帧合适开始了,在STM32F030中增加了一个Busy标志位,它在起始位检测成功后置位,RXNE置位处清除。所以RE开启后IDLE置位意义并不是很大,可以置位也可以不置位。

        对于USART发送而言,发送的前提条件包括UE,TE,波特率配置正常,UE,TE已经有一个为1以后,另一个从0变1后,Tx线上将会发送空闲帧。对于接收方来讲,这是有好处的,因为正常的通信过程中,发送方是不会关开TE/UE的,当我们进行定长接收时,在未达到指定长度的接收时检测到了IDLE,那么说明对端发生了异常。

二、波特率产生与时钟采样

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称为UART)是一种异步收发传输器,是电脑硬件的一部分,将数据通过串列通信进行传输。UART通常用在与其他通信接口(如EIA RS-232)的连接上。它包括了RS232RS449RS423RS422RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。

波特率:是衡量数据传输速度的一种指标,表示每秒钟传输的信号变化(或符号)次数。对于串行通信中的USART(Universal Synchronous/Asynchronous Receiver/Transmitter)来说,波特率通常用来表示每秒传输的比特(bits per second, bps)的数量。

例如:115200波特率下,1个Bit的宽度为8.67us,那么1s就可以传输115200个Bit115200bit/s=115.2Kpbs

那么对于设计来讲,如何确保波特率足够精准呢?

首先USART的通讯波特率范围取决于其工作的时钟频率,以及其采样方式,常见的USART采样方为16位采样和8位采样,其含义就是对1个Bit进行16次/8次电平采样,本质就是1个Bit有多少个USART时钟周期,例如USART时钟频率48M,那么时钟周期为20.83ns,波特率115200,1个bit的宽度为8.6805us,该宽度除以时钟周期,代表一个Bit有416.7个时钟周期,每个采样点就是26.04个时钟周期,这里我们要么舍去0.4要么进位,由于0.4/0.0625>5,四舍五入,配置小数部分为1,这代表了每个采样点都是26个时钟周期,但会多出来几个,我们可以选择插在前面,或者最后面。

三、停止位

1.定义:在数据位结束之后发送配置长度的高电平

2.意义:

①停止位本身不带有信息,停止位会降低通讯的速率,但是停止位也有它存在的必要性,由于USART是NRZ编码,每一帧数据都是从1bit低电平开始的,如果数据结束后不会到高电平,就无法顺利检测下一个起始位。

②而且对于接收方来讲,如果接受效率很低,那么停止位长就是好事,不会接收不过来,导致溢出问题。

③对于ST的停止位,是进行了停止位的采样点,如果采到低是会报错的,存在FE,NE两种错误,产生FE大概率是收发双方的帧格式不同,或者波特率相差太大,产生NE就是因为线路上存在噪声。

3.停止位分类

1个停止位 标准的

2个停止位 第二个停止位属于是凑数的,主要在接收方效率低时配置

1.5个停止位 为了智能卡模式特殊做的,智能卡协议规定了检测NACK的位置,正常的停止位是在第一Bit的8,9,10进行采样确定当前bit的值,而1.5个停止位则是在后1Bit的8,9,10.因为当对端检测到LSB的校验位出错时,会在停止位过0.5±0.2bit后拉低1到2bit的低电平,所以1.5的停止位采样是为了服务于智能卡模式,当FE产生就是检测到了NACK

0.5个停止位 特点是没有停止位采样,不会产生FE错误,但检测到FE错误也会回复NACK,所以它也能作为智能卡接收方,但它不能作为发送方,因为发送方要具备检测NACK的能力,所以ST手册说建议配1.5Bit,不然切换麻烦。

注意:这些停止位在所有模式都能配置,没有硬性规定。但在STM32F030系列的USART,仅1.5停止位才能回复NACK,也只有1.5个停止位才能正确检测NACK。这是有原因的,因为NACK是一个特别特殊的东西,它长得很像起始位,智能卡模式下为了不把NACK错认为起始位,必须做起始位检测屏蔽,等待NACK过去之后再开始接收数据,发送方如果一旦配置了1.5个停止位,当数据位结束之后,起始位检测并不是立即开始(如果立即开始,将在3个采样点高电平之后开始接收),而是需要过0.7bit之后,接收方在这之前就已经拉低了,所以0.7bit之后检测不到下降沿,NACK就不会被错认为起始位,当NACK恢复高之后下一个数据的起始位就能正常检测。对于F4,F1系列不对NACK检测进行严加控制,只要开启NACK功能就启用NACK屏蔽机制,这对于接收效率影响是很大的,停止位1和2的采样点位置本来就不适合智能卡,那么也不需要屏蔽机制,所以F0做了改善。

四、波特率容忍度

我们知道对于异步接受,双方波特率要想做到分毫不差是有难度的,只有足够高精度的晶振产生精准的时钟,波特率才会异常精准,作为通用芯片,必须要具备对较差波特率有一定容忍,对于用户使用起来体验才会更好。

如何实现?

1.重同步

每一次在进入接收空闲(数据位结束)到检测到起始位下降沿后,就将波特率计数器刷新,防止帧与帧之间的累积误差。

2.采样在中间进行,假如一个bit偏1个采样点,字长为8,那么第8bit时累计产生了8个采样点的累计误差,由于8,9,10采样,所以最大误差可以达到第8~9个采样点,也就是半个Bit,举个例子,波特率2400,一个bit有416.7us,假设对端快,一个Bit有(416.7-26)=390.7bit,那么波特率容忍度为(2559-2400)/2400≈6%,你可以实测一下,ST的波特率容忍度大概就在5%左右。

3.容忍度的体现不仅仅体现在数据的正确性上,还需要体现在标志位上是否存在容忍度,举个例子:IDLE标志位需要在停止位结束检测10Bit高电平,而一旦检测中途起始位检测成功,就不会置位IDLE,如果设计时检测到下降沿IDLE就取消,那么可能是噪声导致的,其实不该取消,或者你在9.7bit后出现下降沿起始位检测成功了然后IDLE不置位了,这其实不对,因为第10bit的高电平已经检测完毕,所以IDLE应该置位。

4.采样方式可以更换,为了达到更大的容忍度,我们可以只采一个采样点就决定当前值,容忍度会有提升,但是抗噪能力就很差

五、起始位检测

USART接收的灵魂就在于起始位检测,因为一旦起始位检测通过之后,那么必然会产生RXNE,所以起始位检测一定要做到真正的检测到的是起始位而不会错吧噪声当成起始位。

起始位检测第一条件:在下降沿出现之前必须检测到3个采样点的高,因为如果在下降沿前只有极短的高电平,那么很有可能这是一个噪声,因为正常的通讯中不存在这种情况

起始位检测第二条件:3,5,7采样(数据位不存在)

起始位第三检测条件:8,9,10采样

具体是怎么个逻辑,看ST手册,这三个条件保障了接收的抗干扰能力

  • 21
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值