目录
最近的一个项目用到了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电子元器件组成电路的电平是个电压范围,规定:
- 输出高电平>=2.4V,输出低电平<=0.4V;
- 输入高电平>=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发送方式。
再发一个时序图:
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
depe
nds
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信号的。
再看STM32如何检测断开符号,如下图:
通过上面的资料可知,当RX上有break信号的时候,UART会有一个帧错误,我们可以在中断处理函数中检测FE标志位,如果为1,那么有可能是帧错误或者break信号,接着我们在检测RX引脚,如果低电平持续时间达到了几十毫秒,则说明是break信号。
后来我仔细看STM的UART的资料,发现UART有个LIN模式,有个LIN断开符检测中断,能够直接检测break信号。
这些都是我在STM32的芯片手册上找到的,芯片手册链接:
STM32中文参考手册_V10.pdf
因为手里面只有一块STM32的开发板,想使用PC来发送break信号做测试,但是不知道PC怎么发送break信号,所以并没有做测试。
我觉得其他的芯片应该也有类似的机制。
参考资料:
http://www.chinadmd.com/file/szacieprs6rx6ocrivieswvz_1.html