最近的一个项目用到了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电子元器件组成电路的电平是个电压范围,规定:
- 输出高电平>=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,甚至更多,不同的芯片可能不一样。插一个题外话:串口通信数据位长度对传输数据的影响
例子:一个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 depends entirely on the protocol being used.
下面是我的理解是:
break就是一个逻辑低电平,电平持续时间多久可就自定义,但是至少要大于1帧数据中开始位+数据位+检验位的时间。一般是1/4到1/2秒。
因为UART的空闲状态是高电平, stop位是也是高电平,那么整个UART在传输过程中低电平的持续时间最大就是:1bit位的起始位(低电平)+n bit的数据位(传输的数据全0)+1bit的校验位(校验位是0),所以只要有大于这个时间的低电平,肯定不是数据,那么久可以作为中断了。因为一般UART的波特率都不低,即使波特率是200,1bit位的时间也有5ms,一帧一般也就十几个bit,所以一般break信号的低电平持续时间大于100ms就可以了。
参考资料:
http://www.chinadmd.com/file/szacieprs6rx6ocrivieswvz_1.html