UART的break信号
目錄
1.TTL電平和RS232電平
2.UART的時(shí)序
3.break信號(hào)
4.如何檢測(cè)break信號(hào)?
最近的一個(gè)項(xiàng)目用到了UART的break信號(hào),在查資料的過程中,發(fā)現(xiàn)很多文章對(duì)break信號(hào)有介紹,但是都很簡(jiǎn)單,看了讓人摸不著頭腦,所以想把找的資料加上自己的理解整理一下,方便自己以后查看。博客引用的其他人的文章或者論壇等在文末有連接。有很多內(nèi)容是我對(duì)找到的資料的理解,如果有不對(duì)的地方歡迎評(píng)論指正。
1.TTL電平和RS232電平
要想說明白break信號(hào),我覺的首先要說清楚UART的電平,在網(wǎng)上對(duì)break信號(hào)描述中,很多是用RS232串口來說的,但是芯片一般都是TTL電平的。RS232電平是有正負(fù)的,TTL只有正,所以好多人被RS232的電平給搞暈了。
串口標(biāo)準(zhǔn)RS-232C標(biāo)準(zhǔn)(協(xié)議)的全稱是EIA-RS-232C標(biāo)準(zhǔn)。
EIA-RS-232C對(duì)電器特性、邏輯電平和各種信號(hào)線功能都作了規(guī)定。
? ? ? ? ? 在TxD和RxD上:邏輯1(MARK)=-3V~-15V
? ? ? ? ? 在TxD和RxD上: 邏輯0(SPACE)=+3~+15V
? ? ? ? ? 在RTS、CTS、DSR、DTR和DCD等控制線上:
? ? ? ? ? ? ? ?信號(hào)有效(接通,ON狀態(tài),正電壓)=+3V~+15V
? ? ? ? ? ? ? ?信號(hào)無效(斷開,OFF狀態(tài),負(fù)電壓)=-3V~-15V
EIA-RS-232C是用正負(fù)電壓來表示邏輯狀態(tài),與TTL以高低電平表示邏輯狀態(tài)的規(guī)定不同。因此,為了能夠同計(jì)算機(jī)接口或終端的TTL器件連接,必須在EIA-RS-232C與TTL電路之間進(jìn)行電平和邏輯關(guān)系的變換。實(shí)現(xiàn)這種變換的方法可用分立元件,也可用集成電路芯片。
?TTL是Transistor-Transistor Logic,即晶體管-晶體管邏輯的簡(jiǎn)稱,它是計(jì)算機(jī)處理器控制的設(shè)備內(nèi)部各部分之間通信的標(biāo)準(zhǔn)技術(shù)。TTL電平信號(hào)應(yīng)用廣泛,是因?yàn)槠鋽?shù)據(jù)表示采用二進(jìn)制規(guī)定,+5V等價(jià)于邏輯"1",0V等價(jià)于邏輯"0"。
 數(shù)字電路中,由TTL電子元器件組成電路的電平是個(gè)電壓范圍,規(guī)定:
?
?
總結(jié)一下,TTL和RS232是電平不同,但是在理解break信號(hào)的時(shí)候我們不需要考慮電平的正負(fù)問題。在很多其他資料中會(huì)提到MARK電平(狀態(tài))、SPACE電平,這些都是指RS232電平,MARK是邏輯1,對(duì)應(yīng)TTL的高電平,SPACE是邏輯0,對(duì)應(yīng)TTL的低電平。在下面分析中我只會(huì)說高低電平或者邏輯1或者邏輯0.
2.UART的時(shí)序
時(shí)序我覺得有必要先說明一下,因?yàn)閎rake信號(hào)其實(shí)就是持續(xù)一段時(shí)間的低電平(邏輯0或者說SPACE電平),只有了解了UART的時(shí)序,才更好理解break信號(hào)。
UART的每一幀數(shù)據(jù)是包括起始位、數(shù)據(jù)位、停止位,這三個(gè)是一定會(huì)有的,也可以選擇加上檢驗(yàn)位(奇校驗(yàn)或者偶校驗(yàn)),檢驗(yàn)位在數(shù)據(jù)位和停止位之間。數(shù)據(jù)位和停止位是可以設(shè)置的。例如最常用的數(shù)據(jù)位是8bit(1字節(jié)),當(dāng)然還有5-9bit,甚至更多,不同的芯片可能不一樣。插一個(gè)題外話:串口通信數(shù)據(jù)位長(zhǎng)度對(duì)傳輸數(shù)據(jù)的影響? ?
?
空閑位:處于邏輯“1”狀態(tài),表示當(dāng)前線路上沒有資料傳送。
起始位:先發(fā)出一個(gè)邏輯”0”的信號(hào),表示傳輸字符的開始。其實(shí)就是發(fā)送一個(gè)從“高到低”動(dòng)作,低電平需要保持1 bit的時(shí)間
數(shù)據(jù)位:緊接著起始位之后。資料位的個(gè)數(shù)可以是4、5、6、7、8等,構(gòu)成一個(gè)字符。通常采用ASCII碼。從最低位開始傳送,靠時(shí)鐘定位。
奇偶校驗(yàn)位:資料位加上這一位后,使得“1”的位數(shù)應(yīng)為偶數(shù)(偶校驗(yàn))或奇數(shù)(奇校驗(yàn)),以此來校驗(yàn)資料傳送的正確性。
停止位:它是一個(gè)字符數(shù)據(jù)的結(jié)束標(biāo)志。可以是1位、1.5位、2位的高電平。 由于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供 計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。適用于停止位的位數(shù)越多,不同時(shí)鐘同步的容忍程度越大,但是數(shù)據(jù)傳輸率同時(shí)也越慢。
波特率:是衡量資料傳送速率的指標(biāo)。表示每秒鐘傳送的二進(jìn)制位數(shù)。例如資料傳送速率為120字符/秒,而每一個(gè)字符為10位,則其傳送的波特率為10×120=1200位/秒=1200波特。
?
每個(gè)數(shù)據(jù)都是由1個(gè)start位開始的,開始位始終是邏輯0。跟隨在開始位后面的是特定長(zhǎng)度的數(shù)據(jù),數(shù)據(jù)是LSB模式(先發(fā)地位再發(fā)高位)發(fā)送的;如果校驗(yàn)位被使能,那么1個(gè)校驗(yàn)位也將產(chǎn)生,并被發(fā)送。數(shù)據(jù)的最后一位由1個(gè)stop位標(biāo)志,結(jié)束位始終是邏輯1。一個(gè)空閑line就是由連續(xù)多個(gè)的stop位組成的,這也就意味著空閑信號(hào)其實(shí)就是信號(hào)線一直保持在邏輯1。
例子:一個(gè)ASCII字符“A”(8-bit,hex碼為0x41)一直都是以如下的方式進(jìn)行傳送的。注意:數(shù)據(jù)是LSB first發(fā)送方式。
再發(fā)一個(gè)時(shí)序圖:
3.break信號(hào)
? ? 出現(xiàn)以下情況時(shí),可使UART 產(chǎn)生中斷:
? ? ? ? ? (1).FIFO 溢出錯(cuò)誤
? ? ? ? ? (2).線中止錯(cuò)誤(line-break,即Rx 信號(hào)一直為0 的狀態(tài),包括校驗(yàn)位和停止位在內(nèi))
? ? ? ? ? (3).奇偶校驗(yàn)錯(cuò)誤
? ? ? ? ? (4).幀錯(cuò)誤(停止位不為1)
? ? ? ? ? (5).接收超時(shí)(接收FIFO 已有數(shù)據(jù)但未滿,而后續(xù)數(shù)據(jù)長(zhǎng)時(shí)間不來)
? ? ? ? ? (6).發(fā)送
? ? ? ? ? (7).接收
? ?break信號(hào)波形
? ? ? 我網(wǎng)上找了一下資料,有兩個(gè)描述:?
? ? ? (1). 一般,直到有數(shù)據(jù)傳輸時(shí),接收和傳輸信號(hào)會(huì)保持在mark電壓。如果一個(gè)信號(hào)掉到space電壓并且持續(xù)了很長(zhǎng)時(shí)間,一般來說是1/4到1/2秒,那么就說有一個(gè)break條件存在了。break經(jīng)常被用來重置一條數(shù)據(jù)線或者用來改變像調(diào)制解調(diào)器這樣的設(shè)備的通訊模式。
? ? (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就是一個(gè)邏輯低電平,電平持續(xù)時(shí)間多久可就自定義,但是至少要大于1幀數(shù)據(jù)中開始位+數(shù)據(jù)位+檢驗(yàn)位+停止位的時(shí)間。一般是1/4到1/2秒。
? ? ? ? ?因?yàn)閁ART的空閑狀態(tài)是高電平, stop位是也是高電平,那么整個(gè)UART在傳輸過程中低電平的持續(xù)時(shí)間最大就是:1bit位的起始位(低電平)+n bit的數(shù)據(jù)位(傳輸?shù)臄?shù)據(jù)全0)+1bit的校驗(yàn)位(校驗(yàn)位是0),所以只要有大于這個(gè)時(shí)間的低電平,肯定不是數(shù)據(jù),那么久可以作為break信號(hào)了。因?yàn)橐话鉛ART的波特率都不低,即使波特率是200,1bit位的時(shí)間也有5ms,一幀一般也就十幾個(gè)bit,所以一般break信號(hào)的低電平持續(xù)時(shí)間大于100ms就可以了。
4.如何檢測(cè)break信號(hào)?
下面有人評(píng)論問如何識(shí)別break信號(hào),這個(gè)確實(shí)沒有做過,之前客戶只要求modem在收到短信的時(shí)候產(chǎn)生break信號(hào),識(shí)別break信號(hào)是客戶做的,因?yàn)槭菄?guó)外的客戶,而且這個(gè)項(xiàng)目都已經(jīng)算結(jié)束了,也不方便問客戶。手上剛好有STM32的芯片手冊(cè),發(fā)現(xiàn)STM32里面有一些break信號(hào)的內(nèi)容可以提供參考。
STM32里有個(gè)斷開符號(hào)的概念,就是break信號(hào),只是這個(gè)信號(hào)持續(xù)時(shí)間最多只有12個(gè)bit位'0'(1個(gè)起始位+九個(gè)數(shù)據(jù)位+2個(gè)停止位),然后就變成了高電平,這個(gè)低電平時(shí)間應(yīng)該只有us級(jí)別。
STM32可以通過設(shè)置控制寄存器的SBK標(biāo)志位,能夠直接發(fā)送斷開信號(hào),如下圖。如果想要break信號(hào)持續(xù)時(shí)間達(dá)到100ms左右,這種方式是不可以的,原因上面已經(jīng)說了,所以只能把TX當(dāng)成GPIO,設(shè)置為0,持續(xù)n ms,然后拉高。我看到展訊的modem的UART代碼,就是這樣產(chǎn)生break信號(hào)的。
再看STM32如何檢測(cè)斷開符號(hào),如下圖:
通過上面的資料可知,當(dāng)RX上有break信號(hào)的時(shí)候,UART會(huì)有一個(gè)幀錯(cuò)誤,我們可以在中斷處理函數(shù)中檢測(cè)FE標(biāo)志位,如果為1,那么有可能是幀錯(cuò)誤或者break信號(hào),接著我們?cè)跈z測(cè)RX引腳,如果低電平持續(xù)時(shí)間達(dá)到了幾十毫秒,則說明是break信號(hào)。
后來我仔細(xì)看STM的UART的資料,發(fā)現(xiàn)UART有個(gè)LIN模式,有個(gè)LIN斷開符檢測(cè)中斷,能夠直接檢測(cè)break信號(hào)。
這些都是我在STM32的芯片手冊(cè)上找到的,芯片手冊(cè)鏈接:STM32中文參考手冊(cè)_V10.pdf
 因?yàn)槭掷锩嬷挥幸粔KSTM32的開發(fā)板,想使用PC來發(fā)送break信號(hào)做測(cè)試,但是不知道PC怎么發(fā)送break信號(hào),所以并沒有做測(cè)試。
 我覺得其他的芯片應(yīng)該也有類似的機(jī)制。
?
參考資料:
http://www.chinadmd.com/file/szacieprs6rx6ocrivieswvz_1.html
串口標(biāo)準(zhǔn)RS232C電壓
UART串口協(xié)議基礎(chǔ)1
怎樣通過uart發(fā)送“break”信號(hào)
總結(jié)
以上是生活随笔為你收集整理的UART的break信号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Android关于分辨率的支持(QVGA
- 下一篇: MySql CHECK使用方法
