UART的break信号

目录

1.TTL电平和RS232电平

2.UART的时序

3.break信号

4.如何检测break信号?


最近的一个项目用到了UART的break信号,在查资料的过程中,发现很多文章对break信号有介绍,但是都很简单,看了让人摸不着头脑,所以想把找的资料加上自己的理解整理一下,方便自己以后查看。博客引用的其他人的文章或者论坛等在文末有连接。有很多内容是我对找到的资料的理解,如果有不对的地方欢迎评论指正。

1.TTL电平和RS232电平

要想说明白break信号,我觉的首先要说清楚UART的电平,在网上对break信号描述中,很多是用RS232串口来说的,但是芯片一般都是TTL电平的。RS232电平是有正负的,TTL只有正,所以好多人被RS232的电平给搞晕了。

串口标准RS-232C标准(协议)的全称是EIA-RS-232C标准。
EIA-RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。
          在TxD和RxD上:逻辑1(MARK)=-3V~-15V
          在TxD和RxD上: 逻辑0(SPACE)=+3~+15V
          在RTS、CTS、DSR、DTR和DCD等控制线上:
               信号有效(接通,ON状态,正电压)=+3V~+15V
               信号无效(断开,OFF状态,负电压)=-3V~-15V
EIA-RS-232C是用正负电压来表示逻辑状态,与TTL以高低电平表示逻辑状态的规定不同。因此,为了能够同计算机接口或终端的TTL器件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。实现这种变换的方法可用分立元件,也可用集成电路芯片。

 TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定,+5V等价于逻辑"1",0V等价于逻辑"0"。
数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定:

 

  1.    输出高电平>=2.4V,输出低电平<=0.4V;
  2.    输入高电平>=2.0V,输入低电平<=0.8V。

 

总结一下,TTL和RS232是电平不同,但是在理解break信号的时候我们不需要考虑电平的正负问题。在很多其他资料中会提到MARK电平(状态)、SPACE电平,这些都是指RS232电平,MARK是逻辑1,对应TTL的高电平,SPACE是逻辑0,对应TTL的低电平。在下面分析中我只会说高低电平或者逻辑1或者逻辑0.

2.UART的时序

时序我觉得有必要先说明一下,因为brake信号其实就是持续一段时间的低电平(逻辑0或者说SPACE电平),只有了解了UART的时序,才更好理解break信号。

UART的每一帧数据是包括起始位、数据位、停止位,这三个是一定会有的,也可以选择加上检验位(奇校验或者偶校验),检验位在数据位和停止位之间。数据位和停止位是可以设置的。例如最常用的数据位是8bit(1字节),当然还有5-9bit,甚至更多,不同的芯片可能不一样。插一个题外话:串口通信数据位长度对传输数据的影响   

 

空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。其实就是发送一个从“高到低”动作,低电平需要保持1 bit的时间

数据位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供 计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

波特率:是衡量资料传送速率的指标。表示每秒钟传送的二进制位数。例如资料传送速率为120字符/秒,而每一个字符为10位,则其传送的波特率为10×120=1200位/秒=1200波特。

 

每个数据都是由1个start位开始的,开始位始终是逻辑0。跟随在开始位后面的是特定长度的数据,数据是LSB模式(先发地位再发高位)发送的;如果校验位被使能,那么1个校验位也将产生,并被发送。数据的最后一位由1个stop位标志,结束位始终是逻辑1。一个空闲line就是由连续多个的stop位组成的,这也就意味着空闲信号其实就是信号线一直保持在逻辑1。

例子:一个ASCII字符“A”(8-bit,hex码为0x41)一直都是以如下的方式进行传送的。注意:数据是LSB first发送方式。

UART的break信号_第1张图片

再发一个时序图:

3.break信号

    出现以下情况时,可使UART 产生中断:
          (1).FIFO 溢出错误
          (2).线中止错误(line-break,即Rx 信号一直为0 的状态,包括校验位和停止位在内)
          (3).奇偶校验错误
          (4).帧错误(停止位不为1)
          (5).接收超时(接收FIFO 已有数据但未满,而后续数据长时间不来)
          (6).发送
          (7).接收

   break信号波形

      我网上找了一下资料,有两个描述: 

      (1). 一般,直到有数据传输时,接收和传输信号会保持在mark电压。如果一个信号掉到space电压并且持续了很长时间,一般来说是1/4到1/2秒,那么就说有一个break条件存在了。break经常被用来重置一条数据线或者用来改变像调制解调器这样的设备的通讯模式

    (2).Since there is always some period of time where the line will be in a mark state between data characters, the start of a character can always be recognised. This also means that the longest period of time that the line can be in a space state is:
    1 start bit + however many data bits + a parity bit (if any)
   A break signal is defined as holding the line in the space state for longer than that period of time - no valid data byte can do that, so the break 'character' isn't really a character. It's a special signal.

 

As far as when you need to issue a break signal depends entirely on the protocol being used.

     下面是我的理解是:

         break就是一个逻辑低电平,电平持续时间多久可就自定义,但是至少要大于1帧数据中开始位+数据位+检验位+停止位的时间。一般是1/4到1/2秒。

         因为UART的空闲状态是高电平, stop位是也是高电平,那么整个UART在传输过程中低电平的持续时间最大就是:1bit位的起始位(低电平)+n bit的数据位(传输的数据全0)+1bit的校验位(校验位是0),所以只要有大于这个时间的低电平,肯定不是数据,那么久可以作为break信号了。因为一般UART的波特率都不低,即使波特率是200,1bit位的时间也有5ms,一帧一般也就十几个bit,所以一般break信号的低电平持续时间大于100ms就可以了。

4.如何检测break信号?

下面有人评论问如何识别break信号,这个确实没有做过,之前客户只要求modem在收到短信的时候产生break信号,识别break信号是客户做的,因为是国外的客户,而且这个项目都已经算结束了,也不方便问客户。手上刚好有STM32的芯片手册,发现STM32里面有一些break信号的内容可以提供参考。

STM32里有个断开符号的概念,就是break信号,只是这个信号持续时间最多只有12个bit位'0'(1个起始位+九个数据位+2个停止位),然后就变成了高电平,这个低电平时间应该只有us级别。

STM32可以通过设置控制寄存器的SBK标志位,能够直接发送断开信号,如下图。如果想要break信号持续时间达到100ms左右,这种方式是不可以的,原因上面已经说了,所以只能把TX当成GPIO,设置为0,持续n ms,然后拉高。我看到展讯的modem的UART代码,就是这样产生break信号的。

UART的break信号_第2张图片

再看STM32如何检测断开符号,如下图:

UART的break信号_第3张图片

UART的break信号_第4张图片

UART的break信号_第5张图片

通过上面的资料可知,当RX上有break信号的时候,UART会有一个帧错误,我们可以在中断处理函数中检测FE标志位,如果为1,那么有可能是帧错误或者break信号,接着我们在检测RX引脚,如果低电平持续时间达到了几十毫秒,则说明是break信号。

后来我仔细看STM的UART的资料,发现UART有个LIN模式,有个LIN断开符检测中断,能够直接检测break信号。

UART的break信号_第6张图片

UART的break信号_第7张图片

这些都是我在STM32的芯片手册上找到的,芯片手册链接:STM32中文参考手册_V10.pdf
因为手里面只有一块STM32的开发板,想使用PC来发送break信号做测试,但是不知道PC怎么发送break信号,所以并没有做测试。
我觉得其他的芯片应该也有类似的机制。

 

参考资料:

http://www.chinadmd.com/file/szacieprs6rx6ocrivieswvz_1.html

串口标准RS232C电压

UART串口协议基础1

怎样通过uart发送“break”信号

你可能感兴趣的:(杂记)