鄭紅菱, 張 杰, 鄭郁正
(1.成都信息工程學院計算機學院,四川成都610225;2.成都信息工程學院通信工程學院,四川成都610225)
對于紅外IrDA1.0標準的應用,一般設備都采用集成的紅外收發(fā)器[1]。如圖1所示的RPM851A,基帶數(shù)據(jù)信號必須經(jīng)過IrDA1.0標準編解碼器與紅外收發(fā)器連接,才能實現(xiàn)紅外數(shù)據(jù)通信。有些串行通信芯片或者智能處理器的串行通信部件都集成了IrDA1.0編解碼器,但獨立使用IrDA1.0編解碼器還占了很大一部分,其中有TI公司的TIR1000、HP公司的HSDL-7000、Zilog公司的ZHX1010、MicroChip公司的MCP21XX系列紅外編解碼器。
從集成的紅外收發(fā)器結(jié)構(gòu)來看,所有編解碼器與這類的紅外收發(fā)器連接工作時,都只能以半雙工模式工作。對于要以全雙工模式工作的設備來說,如果想將有線通信方式改為紅外無線通信方式,將很難找到現(xiàn)成的解決方案。
因此,選用高性價比的MCS51單片機,成本不足人民幣2元,設計了一個IrDA1.0標準協(xié)議??刂破?采用軟件緩沖技術(shù),利用紅外數(shù)據(jù)通信的半雙工信道,實現(xiàn)了透明全雙工通信。同時,對IrDA1.0的編解碼做了改進,采用了時長編碼,將傳輸速度提高了一倍,實現(xiàn)了115200bps全雙工通信。
圖1 集成紅外數(shù)據(jù)收發(fā)器RPM851A
根據(jù)IrDA1.0標準對紅外發(fā)光管的要求,發(fā)送器的工作時間介于1.6μ s到30μ s之間,一般情況下不超過20μ s;接收器能接收的最短光脈沖時間為1.6μ s,超過1.6μ s的光脈沖會被截短為1.6μ s,輸出 Tout=1.5μ s的接收脈沖,其前沿時間 Tup≤75ns,后沿時間 Tdown≤500ns;所以可以計算出接收一個脈沖時間 TR為:
TR=Tup+Tout+Tdown≤75ns+1.5μ s+500ns=2075ns現(xiàn)有的IrDA1.0編碼器只對基帶信號0進行編碼發(fā)送,而信號1則不發(fā)送。一位信號0被分成16個時間片,形成“7+3+6”的3/16占空脈寬調(diào)制編碼結(jié)構(gòu),其中只用3個時間片發(fā)送紅外脈沖。因此,假設通信速率為Rb,則每位發(fā)送脈沖的時間為;而一個比特的總時長為
根據(jù)上述公式,當通信速率為115200bps時:
發(fā)送脈沖的時間為:Ts115200=
當通信速率為9600bps時:
從上面計算結(jié)果看,通信速率在 9600bps到了115200bps,紅外發(fā)送脈沖時間為1.6μ s~20μ s,符合紅外收發(fā)器的時序要求。但是從接收器給出的性能看,當發(fā)送脈沖時間超過1.6μ s時,超過的部分不僅消耗功率,而且還導致電路容易損壞。
根據(jù)現(xiàn)有IrDA1.0編碼器的工作原理[2-3],可以知道紅外信道的傳輸速率與數(shù)據(jù)傳輸速率相同,而且采用3/16脈寬調(diào)制編碼時最高速率只能達到115200bps半雙工通信。因此,為了能實現(xiàn)115200bps的全雙工通信,采用兩個發(fā)送脈沖之間的時間構(gòu)造編碼,即“時長編碼”,用于改進紅外傳輸?shù)木幋a。以下對時長編碼的編碼方法進行具體說明。
由于紅外信道是半雙工模式,收發(fā)轉(zhuǎn)換要開銷一些時間,因此為提高傳輸效率,將數(shù)據(jù)字節(jié)分組傳輸,形成紅外信道分組,其分組模式為:
開始標志+分組長度+數(shù)據(jù)+校驗
除“開始標志”外,其他內(nèi)容都是按半字節(jié)數(shù)據(jù)通信,編碼時先高4位,后低4位,校驗是所有字節(jié)的累加和補碼。為傳輸這些數(shù)據(jù)設計時長編碼格式為:
Tr+Tw+Tf+Ti+Tc
其中,紅外接收器輸出前沿時間為 Tr,輸出信號時間為 Tw,輸出后沿為 Tf,填充時間 Ti,編碼單位時長定義為 Tc,半個字節(jié)(即4bit數(shù)據(jù))的二進制編碼作為編碼長度。即采用一個脈沖表示編碼的開始,其時間為 Tr+Tw+Tf;再使用Ti時間隔離編碼標志脈沖和數(shù)據(jù)以避免數(shù)據(jù)和標志脈沖混疊[4-6],同時不同的Ti時間也用于區(qū)分數(shù)據(jù)分組類型;最后用Dc×Tc時間來表示傳輸?shù)男畔?這就是時長編碼方法。
為進一步分析時長編碼的性能,假設單片機的主頻為OSC=22.1184MHz,所以單片機系統(tǒng)基本時間單位為To=1/OSC=1/22.1184μ s≈45.2ns,在單片機中編碼時間都應該是基本時間單位 To的整數(shù)倍。則編碼標志脈沖寬帶為 Tr+Tw+Tf,根據(jù)紅外IrDA1.0標準它的時長應該接近1.6μ s;所以在當前的單片機時鐘條件下采用36個基本時間單位即 Tr+Tw+Tf=36×To≈1.63μ s剛好符合要求;填充時間 Ti必須要保證足夠的時間才能正確識別兩個連續(xù)脈沖數(shù)據(jù),根據(jù)式3的要求在115200bps條件下最小一個比特的時間應該不小于8.68μ s,紅外管才能正確識別,因此(Tr+Tw+Tf)+Ti≥8.68μ s。根據(jù)這一要求我們設計 Ti有兩種取值,當 Ti=12×15×To≈8.14μ s同時 Tc=0時,表示該編碼為一個分組的“開始標志”,而 Ti=12×16×To≈8.68μ s時,則為分組其它內(nèi)容的時長編碼分組。每一時長編碼可以傳輸4位二進制數(shù),用Dc×Tc時間來表示數(shù)據(jù),其中一個 Tc設計為取8個 To時間;所以,當 Dc=0時 Tc×Dc=0的編碼時間最短,為1.63μ s+8.68μ s=10.31μ s;Dc=15時編碼時間最長,為1.63μ s+8.68μ s+15×8×To=15.74μ s。編碼時間越長,傳輸速率就越低,按Dc=15的時間來算,傳輸一個字節(jié)的時間最長為15.74μ s×2=31.48μ s。而按 IrDA1.0的編碼方式用最高速度115200bps傳送,傳送一個字節(jié)的時間為:依據(jù)速率,時長編碼的最低速率是IrDA1.0的86.8/31.48≈2.76倍,可轉(zhuǎn)換傳輸速率為如果按Dc=0最快速率算,時長編碼的速率是IrDA1.0的:86.8/(10.31×2)≈4.2倍。
現(xiàn)在對上述編碼可靠性進行分析。只要是接收可靠性,分析主要是基于 To的精度和穩(wěn)定性。由于采用的時鐘源是來自晶體,晶體的標值精度一般都可以達到千分之一的水平,也就是10-3等級,而晶體的穩(wěn)定性一般可達到萬分之一的水平,所以穩(wěn)定性相對精度來說,對接收沒有影響,可忽略不計[7]。
接收時,采用前沿 Tr計時長,而 Tr最大為 75ns,To為45.2ns,相位判斷時最多相差2個 To,按 Dc=15時的最長編碼時間算,其有(36+12×16+8×15)=348個 To時間,而收發(fā)兩方的精度在348 To內(nèi)還沒有超過一個To的時間,累加下來最大判時誤差不超過3個 To,而Tc時長是以8個 To為間隔設置的,這樣最大誤差造成的采樣相位誤差為=37.5%<50%,所以時長編碼有足夠的容差保證接收不會出錯[8]。
選用的單片機應具有一個全雙工的UART通信接口,實現(xiàn)與數(shù)據(jù)終端設備DTE(Data Terminal Equipment)的通信互連[9-11],另外有一個脈沖寬度調(diào)制PWM輸出接口,用于產(chǎn)生紅外調(diào)制編碼信號,還應具有一個信號捕獲接口,用于接收紅外信號,完成紅外信號解調(diào)。完整的硬件原理圖如圖2所示。
軟件分成 4個部分:UART接收,UART發(fā)送,紅外調(diào)制發(fā)送,紅外接收解調(diào)。UART發(fā)送實時性要求較低,可以放在主程序以查詢方式發(fā)送;UART接收的實時性要求較高性,必須保證不丟失每個數(shù)據(jù),所以采用中斷方式實現(xiàn);而紅外信號的接收與發(fā)送是交替進行、半雙工模式,也就是說發(fā)送時肯定不會接收,而接收時一定不能發(fā)送。紅外的收發(fā)都是針對信號波形處理,時間要求極其嚴格,不能錯過一個 To周期,所以紅外收發(fā)的實時性要求最高。
對于UART的接收和發(fā)送兩部分,是一般性的串行通信口收發(fā)問題,在此不作深入的論述。下面將紅外發(fā)送和接收分別進行論述。
圖2 單片機紅外數(shù)據(jù)全雙工時長編解碼器硬件結(jié)構(gòu)
首先描述單片機中PWM模塊的一種適合本文編碼的工作方式[12]:信號翻轉(zhuǎn)方式。單片機中有一個16位增一定時計數(shù)器C16,當啟動工作時其對應的PWM輸出信號為0,第一個時鐘 To自動對C16加一,達到最大值0xFFFF后再加一變?yōu)?,實現(xiàn)循環(huán)計數(shù)定時;另外有一個16位比較寄存器M16,當C16的值與M16的值相等時,PWM輸出信號取反一次,同時產(chǎn)生中斷請求。中斷服務程序中必須及時修改M16的值,這樣就可以讓輸出信號在設定的時間發(fā)生變化,實現(xiàn)信號調(diào)制編碼。
最長變化時間為65536個 To;最短取決中斷的響應時間,MCS51單片機不允許中斷響應的情況下,一般不超過6個 To時間,再加以設置M16耗費的8個 To時間,共14個 To時間。文中時長編碼最長時間為(12×16+8×15)=312個 To,而最短為36個To,都在可操作時間范圍內(nèi),所以單片機完全可實現(xiàn)實時編碼。
將要發(fā)送的分組先編制成為時間數(shù)據(jù)放在數(shù)組中,盡可能減少發(fā)送時的編碼耗費時間,最后發(fā)送過程按如下步驟操作即可。
(1)停止C16,設C16=0xFFFF,M16=0,PWM 輸出為0,定時一個 16位變量N16,并設N16初值為36,設置該PWM中斷為最高優(yōu)先級,然后啟動C16。
(2)PWM中斷服務程序。將N16賦給M16,即M16=N16(在匯編語言中該語句不影響中斷現(xiàn)場,可以及時修改M16的值);保護中斷現(xiàn)場;如果還有分組時間數(shù)據(jù),則賦給N16,否則關停C16和PWM;恢復中斷現(xiàn)場;中斷返回即可。
首先描述單片機中捕獲模塊的基本原理。所謂捕獲就是記錄一個信號的變化時刻,當單片機捕獲模塊對應輸入引腳上信號發(fā)生上升或下降變化時,就將定時計數(shù)器C16的值自動鎖存入M16,同時產(chǎn)生中斷,這樣記錄下每次信號變化時產(chǎn)生的M16值,就可以測量信號變化的時間長度,從而實現(xiàn)解碼。本方案中只要記錄信號變化的前沿時刻,將當前時刻值減前一時刻值,即可測量本次時長碼的時間。
前面構(gòu)造時長碼時,有一個分組“開始標志”,定義時間長度為12×15個 To,而其他的編碼時長最短為12×16個 To,前面討論過晶體精度帶來一定誤差,設每次測量得到的碼時長為 Tx,則分組“開始標志”的 Tx應滿足:
12×15-6 ≤Tx≤12×15+6
從前面分析得知晶體精度,接收碼字Dc的Tx可變?yōu)?
12×16+Dc×8-3≤Tx≤12×16+Dc×8+3
上式可變換成下式:
Dc×8+1≤Tx-12×16+4≤Dc×8+7
顯然(Tx-12×16+4)整除以8即可求得Dc原碼。
由于紅外信道是半雙工模式,而相對于DTE又是透明全雙工模式,這樣紅外通信雙方就不可避免發(fā)生沖突。解決方案是在發(fā)送前檢測是否有接收信號,如果沒有就自動延時后退一個隨機時間,再次檢測是否有接收信號,如果沒有就開始發(fā)送,否則重復該過程。
另一方面,由于改為時長編碼后的通信速率較高,增加了檢錯重發(fā)機制,保證了數(shù)據(jù)的完整和正確無誤。
用STC12C5A60S2單片機和RPM851A集成紅外收發(fā)器構(gòu)造了硬件測試平臺,紅外距離兩米,兩臺PC以串行數(shù)據(jù)全速對發(fā)、以及隨機分組數(shù)據(jù)和隨機間隔對發(fā),經(jīng)長時間測試統(tǒng)計,沒有發(fā)生誤碼。文中技術(shù)改造了大量的氣象通信設備,實現(xiàn)光電隔離防雷,經(jīng)過3年多時間工作,證明性能穩(wěn)定可靠。
[1] 鄭郁正.單片機原理及應用[M].成都:四川大學出版社,2003.
[2] 施文娟.基于ARM920T的紅外通信系統(tǒng)的設計[J].微型機與應用,2010,(24):59-61.
[3] 李曉雷.基于MSP430單片機的無線以及紅外通信設計[J].伺服控制,2011,(7):71-75.
[4] 葉輝.紅外通訊協(xié)議在嵌入式系統(tǒng)中的實現(xiàn)[J].電子技術(shù)應用,2004,30(7):68-71.
[5] 邱磊,肖兵.基于IrDA協(xié)議棧的紅外通信綜述[J].無線通信技術(shù),2004,13:28-32.
[6] 王成義,郭秀梅,叢曉燕.一種可靠的紅外通信協(xié)議設計與實現(xiàn)[J].激光與紅外,2009,10:1070-1073.
[8] 許繼彥,杜欽生.紅外通信模塊的設計與實現(xiàn)[J].長春大學學報,2009,10:49-51.
[9] 林苗青,翁武坤,周如梅,等.自動氣象站防雷工作中的問題及應對措施[J].2011,9:110-113.
[10] 程程,洪龍.一種實用的紅外通信裝置設計及實現(xiàn)[J].電力自動化設備,2009,9:129-132.
[11] 張鶴,李斌,楊永強.一種基于AT 89S52單片機的紅外通信接口的設計[J].成都大學學報,2008,6:141-143.
[12] 王芳,吳謹.基于凌陽SPCE061A的紅外通信接口設計[J].電子技術(shù),2009,9:16-18.