《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 業(yè)界動態(tài) > 紅外通訊協(xié)議在嵌入式系統(tǒng)中的實現(xiàn)

紅外通訊協(xié)議在嵌入式系統(tǒng)中的實現(xiàn)

2008-08-21
作者:葉 暉

??? 摘?要: 從紅外通訊協(xié)議的特點,、基本原理對紅外無線通信技術(shù)進行了分析,結(jié)合實際例程探討了紅外數(shù)據(jù)" title="紅外數(shù)據(jù)">紅外數(shù)據(jù)通信在嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)中的基本設(shè)計要點,。
??? 關(guān)鍵詞: 紅外通訊協(xié)議? 嵌入式系統(tǒng)? 異步通信收發(fā)器? 狀態(tài)機

?

??? 紅外和藍牙協(xié)議是兩種較流行的短距離無線通信協(xié)議,。但目前藍牙協(xié)議各大廠商尚未有一個統(tǒng)一的標(biāo)準(zhǔn)規(guī)范,,加之硬件價格較為昂貴的缺點,因此市場上紅外通信" title="紅外通信">紅外通信在手機,、筆記本電腦等小型移動設(shè)備中仍然應(yīng)用廣泛,,在嵌入式系統(tǒng)中的實現(xiàn)應(yīng)用有著較高實際意義。
1 紅外協(xié)議背景
??? 紅外線是波長在750nm至1mm之間的電磁波,,其頻率高于微波而低于可見光,,是一種人的眼睛看不到的光線。目前無線電波和微波已被廣泛應(yīng)用在長距離的無線通信中,但由于紅外線的波長較短,,對障礙物的衍射能力差,,所以更適合應(yīng)用在需要短距離無線通信場合點對點的直線數(shù)據(jù)傳輸。為了使各種設(shè)備能夠通過一個紅外接口進行通信,,紅外數(shù)據(jù)協(xié)會(Infrared Data Association,簡稱IRDA) 發(fā)布了一個關(guān)于紅外的統(tǒng)一的軟硬件規(guī)范,,也就是紅外數(shù)據(jù)通訊標(biāo)準(zhǔn)。
2 紅外協(xié)議基本結(jié)構(gòu)
??? 紅外數(shù)據(jù)通訊標(biāo)準(zhǔn)包括基本協(xié)議和特定應(yīng)用領(lǐng)域的協(xié)議兩類,。類似于TCP-IP協(xié)議,,它是一個層式結(jié)構(gòu),其結(jié)構(gòu)形成一個棧,,如圖1所示,。

?


??? 其中基本的協(xié)議有三個:①物理層協(xié)議(IrPHY),制定了紅外通信硬件設(shè)計上的目標(biāo)和要求,,包括紅外的光特性,、數(shù)據(jù)編碼、各種波特率下幀的包裝格式等,。為達到兼容,,硬件平臺以及硬件接口設(shè)計必須符合紅外協(xié)議制定的規(guī)范。②連接建立協(xié)議(IrLAP)層制定了底層連接建立的過程規(guī)范,, 描述了建立一個基本可靠連接的過程和要求,。③ 連接管理協(xié)議(IrLMP)層制定了在單個IrLAP連接的基礎(chǔ)上復(fù)用多個服務(wù)和應(yīng)用的規(guī)范。在IrLMP協(xié)議上層的協(xié)議都屬于特定應(yīng)用領(lǐng)域的規(guī)范和協(xié)議,。④流傳輸協(xié)議(TinyTP)在傳輸數(shù)據(jù)時進行流控制,。制定把數(shù)據(jù)進行拆分、重組,、重傳等的機制,。⑤對象交換協(xié)議(IrOBEX)制定了文件和其他數(shù)據(jù)對象傳輸時的數(shù)據(jù)格式。⑥模擬串口層協(xié)議(IrCOMM)允許已存在的使用串口通信的應(yīng)用象使用串口那樣使用紅外進行通信,。⑦局域網(wǎng)訪問協(xié)議(IrLAN)允許通過紅外局域網(wǎng)絡(luò)喚醒筆記本電腦等移動設(shè)備,,實現(xiàn)遠程遙控等功能。
??? 整個紅外協(xié)議棧比較龐大復(fù)雜,,在嵌入式系統(tǒng)中,,由于微處理器速度和存儲器容量等限制,不可能也沒必要實現(xiàn)整個的紅外協(xié)議棧,。一個典型的例子就是TinyTP協(xié)議中數(shù)據(jù)的拆分和重組,。它采用了信用片(credit card)機制,這極大地增加了代碼設(shè)計的復(fù)雜性,,而實際在紅外通信中一般不會有太大數(shù)據(jù)量的傳輸,,尤其在嵌入式系統(tǒng)中完全可以考慮將數(shù)據(jù)放入單個數(shù)據(jù)包進行傳輸,,用超時和重發(fā)機制保證傳輸?shù)目煽啃浴R虼丝梢詫f(xié)議棧簡化,,根據(jù)實際需求,,有選擇地實現(xiàn)自己需要的協(xié)議和功能即可。
3 紅外協(xié)議數(shù)據(jù)基本傳輸原理
??? 由于硬件接口限制,,嵌入式系統(tǒng)中紅外通信的速率基本在9600bps~115.2kbps之間,。這里是通過硬件電路板上的異步通信收發(fā)器(UART)進行紅外數(shù)據(jù)編碼和無線傳輸。在115.2kbps速率下紅外采用RZI的編碼調(diào)制方案,,脈沖周期為3/16位周期,。數(shù)據(jù)校驗采用CRC16。其基本思想是將要發(fā)送的數(shù)據(jù)按照CRC16算法(CRC算法可以參考相關(guān)資料)進行打包校驗,,在接收時進行CRC解包并與常數(shù)0XF0B8比較,若匹配即數(shù)據(jù)校驗無誤,。紅外數(shù)據(jù)傳輸以幀為基本單位,。幀是一些特定域的組合,其中紅外協(xié)議底層字節(jié)包格式如圖2所示,。

?


??? 各個域含義如下:STA為開始標(biāo)志,,即0x7E、ADDR為8位的地址域,;DATA為數(shù)據(jù)域,;FCS為16位的CRC校驗碼;STO標(biāo)志幀結(jié)束,,在接收兩個連續(xù)的幀時必須至少有3個以上的STO標(biāo)志('01111110'B)為間隔,。若連續(xù)收到7個以上的1后則標(biāo)志該幀有錯誤,設(shè)備會放棄該幀,。在紅外數(shù)據(jù)實際傳輸過程中,,為了延時控制考慮,一般在數(shù)據(jù)幀頭添加多個STA域,,通常采用連續(xù)11個0x7E達到延時目的,。在接收時,當(dāng)收到多個STA域時當(dāng)作一個來處理,,多余的STA域被忽略,。紅外數(shù)據(jù)傳輸?shù)臓顟B(tài)機流程如圖3所示。

?


??? 下面對圖2作幾點說明:(1)數(shù)據(jù)傳輸時首先進入Address Discovery過程,,在此過程中發(fā)廣播幀,,等待對方設(shè)備響應(yīng),收到響應(yīng)幀后可以取得對方設(shè)備地址,。(2)取得對方地址后,,進入Connect過程,在此過程中將與對方設(shè)備協(xié)商傳輸參數(shù),如波特率,、數(shù)據(jù)包大小,、輪轉(zhuǎn)時間片等,之后建立連接,。(3)建立完連接即進入Information Transfer過程,,進行數(shù)據(jù)校驗,傳輸,。其中按照一定算法進行時間片數(shù)據(jù)幀收發(fā)控制,。(4)數(shù)據(jù)傳輸完畢后進入Disconnect過程,斷開連接,。(5)在Address Discovery過程中,,有可能發(fā)現(xiàn)對方設(shè)備地址與本機設(shè)備地址有沖突,此時進入Address Conflict Resolution過程, 解決完設(shè)備沖突后再返回,。
??? 圖3是一個標(biāo)準(zhǔn)的紅外數(shù)據(jù)傳輸狀態(tài)機流程,,但在一些嵌入式設(shè)計方案中,出于省電等目的,,可以不進入Address Discovery過程,,也就是簡化掉Address Discovery過程而轉(zhuǎn)入Sniff過程。在探查一定時間后,,若未收到對方設(shè)備響應(yīng)幀,,自動進入休眠狀態(tài),若收到對方設(shè)備響應(yīng)幀,,則進入正常的連接過程,。同時,在連接過程與對方協(xié)商傳輸參數(shù)的過程中有一項窗口大?。╳indows size)參數(shù),,它是指定接收方可緩沖多少個幀后再進行接收確認,其數(shù)值為1~7,。在嵌入式系統(tǒng)存儲空間有限的情況下,,可以采用默認值1進行數(shù)據(jù)的簡單確認,也就是接收到一個數(shù)據(jù)幀后立即進行確認,。這樣既節(jié)省了資源又使代碼量更小,,運行速度更快。
4 嵌入式系統(tǒng)中紅外協(xié)議實現(xiàn)設(shè)計
??? 筆者采用Sitronix公司的ST2204電路板為硬件平臺,,處理芯片內(nèi)核為65C02,。ST2204電路板使用了集成的8位處理器,尋址能力達到了44M字節(jié),,并提供了低電壓檢測功能,。由于2204集成了上述這些功能,,非常適合省電、支持長電池壽命的手持移動設(shè)備嵌入式設(shè)計實現(xiàn)方案,。在固件設(shè)計,、軟件設(shè)計" title="軟件設(shè)計">軟件設(shè)計方面采用了匯編語言。65C02上的匯編采用存儲器映象方式,,并廣泛使用了零頁尋址,,因此使用起來十分方便、高效,。整個設(shè)計實現(xiàn)可分為硬件設(shè)計和軟件設(shè)計兩部分,。硬件設(shè)計包括電路設(shè)計和固件程序(Firmware)的編寫;軟件設(shè)計包括CRC數(shù)據(jù)編碼校驗,、數(shù)據(jù)收發(fā)及主站(Primary),、輔站(Slave)狀態(tài)機流程實現(xiàn)等。
??? 在硬件設(shè)計方面根據(jù)對設(shè)備的需求和硬件板芯片性能,,可以設(shè)計出相應(yīng)的電路在仿真板上進行實驗,。固件程序的編寫可采用分塊的方法,例如初始化(Initialize)模塊,、中斷處理(Interrupt)模塊、時鐘(Timer)事件處理模塊等,。初始化模塊可根據(jù)硬件板的指南說明(Specification)提供的各個寄存器值設(shè)置初始化參數(shù),;中斷處理模塊可按照中斷向量表提供的入口地址編寫,其基本要求短小精悍,,運行的時鐘周期與微處理器頻率和設(shè)備需求的波特率緊密相關(guān),。時鐘事件處理可根據(jù)硬件板提供的基本時鐘設(shè)置不同的時鐘精度,以滿足不同的需求,。在紅外傳輸實際設(shè)計中定時器主要用于三個方面:第一是sniff探查過程中主站發(fā)廣播幀后輔站超時未響應(yīng)的處理,;第二是超時重發(fā)控制;最后一個是數(shù)據(jù)傳輸過程中輪轉(zhuǎn)時間片的控制,。其中第三個方面要求的精度比較高,,紅外協(xié)議制定的標(biāo)準(zhǔn)是在25ms~85ms之間。因此有必要把超時處理放在中斷處理,。在程序編寫時使用信號量和程序計數(shù)器進行時間控制,。其基本思路是設(shè)置一個程序計數(shù)器進行累加計時,當(dāng)各自事件時間到達時分別設(shè)置三個信號量來標(biāo)志事件處理,,當(dāng)事件處理完畢后重置各自信號量,,轉(zhuǎn)入重新計時。
??? 在軟件設(shè)計方面,,要對發(fā)送的數(shù)據(jù)進行幀包裝(Frame Wrapper),,添加CRC16校驗,,用匯編實現(xiàn)CRC算法比C稍微復(fù)雜些。一個主要的技巧是將要進行校驗的數(shù)據(jù)地址和CRC數(shù)據(jù)表的索引地址置入一個零頁的內(nèi)存地址中,, 采用通用寄存器" title="通用寄存器">通用寄存器對其進行間接尋址,。這樣就實現(xiàn)了C語言中的指針效果,可以比較方便地查詢CRC表,。在數(shù)據(jù)收發(fā)應(yīng)用中,, 分為主站 (Primary station)和輔站(slave station) 兩種角色。主站角色負責(zé)發(fā)起,,建立連接,,進行時間片輪轉(zhuǎn)調(diào)度等。輔站主要負責(zé)應(yīng)答,,響應(yīng)命令,。在一定條件下主站輔站角色可以互換,主輔站均可收發(fā)數(shù)據(jù),。
??? 收發(fā)數(shù)據(jù)的中斷函數(shù)最重要也是底層的核心所在,。在接收方首先會進行硬件初始化,設(shè)置UART接收初始化狀態(tài)并進行中斷允許標(biāo)志設(shè)置(具體設(shè)置可以參考所選擇的電路板說明)等,。當(dāng)紅外數(shù)據(jù)到達后即會觸發(fā)一個UART中斷,,系統(tǒng)處理完當(dāng)前事件后便會根據(jù)中斷向量表提供的入口地址調(diào)用接收中斷處理程序接收數(shù)據(jù)。在接收過程中,,UART會搜尋匹配開始位和結(jié)束標(biāo)志,。接收完畢后,返回系統(tǒng)調(diào)用程序,。在實際應(yīng)用中,,當(dāng)接收完數(shù)據(jù)后,即可按接收幀控制域判斷幀類型,,并結(jié)合接收站所處的相應(yīng)狀態(tài)機進行流程處理,。下面是紅外接收數(shù)據(jù)的中斷程序源碼:
??? /***************************************
??? * UART Receiver Interrupt Service Routine
??? ***************************************/
??? ISR_URX:
????? ??pha
????? ??phx????; 壓棧,保存通用寄存器值
????? ??cld????; 清空十進制標(biāo)志位
????? ??ldx?#00001100B?; 允許接收,,并設(shè)置可以接收下一字節(jié)
????? ??stx???ldx?mBagLen
????? ??cpx?#IrDA_BAG_LEN??; 一個包的長度
????? ??bcs??err_over????; 溢出否
????? ??lda???sta?mReadBuff,x???; 寫數(shù)據(jù)
????? ??lda???sta?mIrdaByteFlag???; 保存狀態(tài)標(biāo)志位
????? ??inc?mBagLen????; 計數(shù)器++
????? ??bra??exit
?????err_over:
????? ??smb0? ?exit:
????? ??plx??????; 出棧,,恢復(fù)通用寄存器值
????? ??pla
????? ??rti
??? 該中斷處理程序在硬件收到一個字節(jié)時觸發(fā)。它先將通用寄存器值壓棧保存,,接下來進行狀態(tài)寄存器的控制,,并檢查一些狀態(tài)標(biāo)志,然后進行數(shù)據(jù)的接收,;將數(shù)據(jù)保存在一個緩存里,,并進行溢出等狀態(tài)的檢測和控制。最后恢復(fù)通用寄存器的值,,返回中斷調(diào)用函數(shù),。按照類似的原理可以編寫出紅外發(fā)送方程序,。編寫數(shù)據(jù)收發(fā)中斷程序有一點要注意,程序代碼量和處理器主頻以及選擇的紅外波特速率是密切相關(guān)的,。若不注意就很容易造成“丟中斷”的現(xiàn)象,,這是應(yīng)該避免的。還有一點要說明:UART是工作在半雙工模式下,,在一些實時系統(tǒng)和時間精度要求較高的應(yīng)用中是不能同時進行收發(fā)數(shù)據(jù)的,。但由于其收發(fā)時間片較短(最長為500ms),在一些普通應(yīng)用中可以模擬成同時收發(fā),。
??? 在程序編寫完后對其進行編譯/連接定位,,用調(diào)試器以16進制的形式加載在主機開發(fā)系統(tǒng)中即可進行模擬調(diào)試。但是模擬調(diào)試不能百分之百地模擬硬件的全部特性,。它主要用于調(diào)試軟件邏輯,、狀態(tài)機流程。對于調(diào)試UART數(shù)據(jù)收發(fā)等實時性較強的硬件特征還需到目標(biāo)系統(tǒng)上進行驗證,。

參考文獻
1 Joe Tajnai. Infrared Data Association Serial Infrared Physical?Layer Specification [EB/OL]
.http://www.irda.org/standards/pubs/IrPHY_1p4.pdf, 2003-04
2 Timothy Williams. Infrared Data Association Serial Infrared?Link Access Protocol [EB/OL]. http://www.irda.org/standards/,2003-04
3 Andy Seaborne. Infrared Data Association Link Management?Protocol [EB/OL]. http://www.irda.org/standards/, 2003-04

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點,。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有,。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容、版權(quán)和其它問題,,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。