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電子元器件組成電路的電平是個電壓范圍,規定:
?
?
總結一下,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?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信號的。
再看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
串口標準RS232C電壓
UART串口協議基礎1
怎樣通過uart發送“break”信號
總結
以上是生活随笔為你收集整理的UART的break信号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android关于分辨率的支持(QVGA
- 下一篇: MySql CHECK使用方法