基于SI4432的高性能無(wú)線(xiàn)收發(fā)應用平臺設計
近些年來(lái),隨著(zhù)集成電路技術(shù)的發(fā)展,ISM頻段單芯片的無(wú)線(xiàn)數據通信IC的性能日益提高,短距離無(wú)線(xiàn)應用領(lǐng)域也在不斷地擴大,其中包括消費電子、工業(yè)控制、安防、自動(dòng)抄表等諸多領(lǐng)域。數據的無(wú)線(xiàn)收發(fā)在無(wú)線(xiàn)產(chǎn)品設計中占有很大的比重。為縮短產(chǎn)品設計周期以及提高產(chǎn)品的穩定性,使產(chǎn)品設計工程師在設計過(guò)程中只需關(guān)注系統應用的設計,而將數據收發(fā)交付一種成熟穩定的收發(fā)系統來(lái)完成。為此,本文設計了一種基于SI4432+STM32F103的高性能無(wú)線(xiàn)收發(fā)平臺。
1 STM32F103和SI4432芯片簡(jiǎn)介
STM32系列是采用ARM CortexTM-M3 內核的閃存微控制器,所有功能都具有業(yè)界最優(yōu)的功耗水平。在結合了高性能(最高72 MHz頻率)、低功耗(睡眠、停機和待機模式)和低電壓(可2.0 V~3.6 V供電)特性[1]的同時(shí)保持了高度的集成性能和簡(jiǎn)易的開(kāi)發(fā)特性,為用戶(hù)提供最大程度的靈活性。
SI4432是Silicon Labs公司的ISM頻段收發(fā)一體芯片,最大輸出功率達到了+20 dBm(100 mW),具有“距離之王”的美譽(yù)(空曠距離可達2 000 m)。SI4432具有特有的連續頻率覆蓋范圍(240 MHz~960 MHz)、寬工作電壓(+1.8 V~+3.6 V)、高靈敏度(在BER0.1%, 數據速率2.0 kb/s時(shí)為-118 dBm)等特點(diǎn),還集成了一些可節省應用成本的特性,如喚醒定時(shí)器、溫度傳感器、發(fā)射和接收數據FIFO、高性能ADC[2],這些特性可大幅簡(jiǎn)化系統設計師的工作,并允許使用低端的微控制器。高集成度使得外圍僅需一個(gè)30 MHz的晶體和幾個(gè)用于匹配/濾波的無(wú)源器,因此非常適用于對尺寸和成本敏感的大批量生產(chǎn)中的應用。
2 硬件設計
該平臺主要由微處理器ARM7 STM32F103(以下簡(jiǎn)稱(chēng)STM32)和RF收發(fā)芯片SI4432組成。STM32通過(guò)SPI接口對SI4432進(jìn)行初始化配置、數據收發(fā)控制等,而SI4432通過(guò)nIRQ腳將相應的中斷發(fā)送至STM32。該平臺采用單天線(xiàn)進(jìn)行數據的收發(fā),所以必須采用RF收發(fā)切換開(kāi)關(guān)用于對SI4432的收發(fā)狀態(tài)進(jìn)行切換, 其中GPIO1控制RF切換開(kāi)關(guān)為發(fā)送狀態(tài),GPIO2控制RF切換開(kāi)關(guān)為接收狀態(tài)[2]。系統硬件組成如圖1所示。
為滿(mǎn)足用戶(hù)各種不同的設計需求,該平臺還提供串口、通用IO口和AD轉化接口。其中,AD轉化接口可以用于需要處理模擬信號的系統,如有各種傳感器的環(huán)境監控系統。
3 軟件設計
軟件編程采用模塊化設計思想,系統中各主要功能模塊均編成獨立的函數由主程序調用。功能模塊包括:初始化程序(初始化SPI、 SI4432)、無(wú)線(xiàn)發(fā)送程序和無(wú)線(xiàn)接收程序等。
3.1狀態(tài)轉化
為了最大限度地降低功耗,軟件設計中采用SI4432的自動(dòng)喚醒功能,在沒(méi)有數據收發(fā)時(shí)芯片處于空閑狀態(tài),定時(shí)一段時(shí)間后將狀態(tài)切換至發(fā)送或是接收,檢查是否有數據的收發(fā)。SI4432主要有四種狀態(tài):關(guān)閉、空閑、發(fā)送和接收,這些狀態(tài)在滿(mǎn)足一定的條件時(shí)可實(shí)現相互轉移,狀態(tài)轉移如圖2所示。在關(guān)閉狀態(tài)下功耗最低,空閑次之??臻e狀態(tài)有五種不同的模式,用戶(hù)可以根據不同的應用靈活選擇。這些狀態(tài)或模式可以在操作模式和功能控制寄存器07H中設定,通過(guò)在寄存器07H中設定txon/rxon控制位可以從空閑狀態(tài)中的任一模式自動(dòng)轉移到發(fā)送/接收狀態(tài)。不同模式/狀態(tài)下轉換需要的時(shí)間和功耗都不相同,可以根據系統需要選擇最佳的狀態(tài)和模式。
3.2 無(wú)線(xiàn)發(fā)送程序流程
無(wú)線(xiàn)發(fā)送程序負責寫(xiě)入數據載荷,并根據通信協(xié)議為數據載荷加上前導碼、同步字、數據載荷長(cháng)度等,形成數據包并將其發(fā)送出去,其流程如圖3所示。在完成 SPI和 SI4432 的初始化后,通過(guò)配置 SI4432 的寄存器3EH來(lái)設置包的長(cháng)度,然后清除發(fā)送FIFO,并通過(guò)SPI連續寫(xiě)寄存器7FH將待發(fā)送數據寫(xiě)入發(fā)送 FIFO(字節數小于64 B),最后打開(kāi)“發(fā)送完中斷允許”標志,將其他中斷都禁止。完成中斷使能后,使能發(fā)送功能,數據開(kāi)始發(fā)送。當數據包發(fā)送完時(shí),引腳nIRQ會(huì )被拉低產(chǎn)生一個(gè)低電平并通知STM32數據包已發(fā)送完畢,當nIRQ引腳變?yōu)榈蜁r(shí)讀取中斷狀態(tài)并拉高 nIRQ,否則繼續等待。一次數據發(fā)送成功后,關(guān)閉發(fā)送使能,進(jìn)入下一次數據循環(huán)發(fā)送狀態(tài)。
3.3 無(wú)線(xiàn)接收程序流程
無(wú)線(xiàn)接收程序負責獲取有效載荷數據長(cháng)度,并讀取接收FIFO中的有效數據,其流程如圖4所示。在程序完成SPI和SI4432的初始化后,打開(kāi)“有效包中斷”和“同步字檢測中斷”,將其他中斷都禁止,并使能接收功能。等待nIRQ引腳因中斷產(chǎn)生而被拉低,讀取中斷標志位拉高nIRQ引腳。若引腳 nIRQ 變成低電平,表示接收到有效數據包,通過(guò)寄存器4 BH讀取包長(cháng)度信息,并通過(guò)SPI訪(fǎng)問(wèn)寄存器7 FH從接收 FIFO中讀取接收到的數據,之后關(guān)閉接收使能,進(jìn)入下一次數據接收狀態(tài)。
設計中參考了802.15.4中CSMA/CA的相關(guān)原理,采用非信標的方式實(shí)現符合系統要求的精簡(jiǎn)的CSMA/CA發(fā)送機制[3]。非信標的方式即:結點(diǎn)若有數據要發(fā)送,需要先通過(guò)CSMA/CA機制進(jìn)行信道監測,也就是在等待一個(gè)隨機時(shí)間后,對當前信道進(jìn)行監聽(tīng),若監測到信道空閑,就可以開(kāi)始傳送數據;若監測到信道忙,則需要重新等待一個(gè)隨機時(shí)間,然后再繼續監聽(tīng)信道,具體實(shí)現流程如圖8[4-5]所示。步驟如下:
(1)在開(kāi)始發(fā)送數據之前先監聽(tīng)信道0.5 ms。如果在這段時(shí)間內信道是空閑的(通過(guò)讀取寄存器26 H的接收信號強度(RSSI)值,則與設定的信道空閑閾值做比較來(lái)判斷,發(fā)送節點(diǎn)將隨機延時(shí)0或1個(gè)時(shí)隙(1時(shí)隙為1 ms)。如果信道仍然是空閑的就開(kāi)始發(fā)送數據;若信道變得忙碌,則跳到第(3)步驟。
(2)如果在0.5 ms內信道為忙,則發(fā)送節點(diǎn)每隔0.5 ms采樣一次RSSI值,直到RSSI值小于設定的門(mén)閾值或是采樣次數達到10次。如果采樣次數達到10次,則跳轉到步驟(5)。
(3)若信道仍然為忙,則發(fā)送方將再等待一隨機時(shí)間,等待時(shí)間的大小是由下式確定:
RandomTime = n×time[1:0]
其中,n是0~15中的一個(gè)隨機數,time[1:0]可以設定為固定的時(shí)間(0.25 ms、0.5 ms、1 ms、2 ms),可以根據應用的需要選擇不同的值。
(4)如果在這段時(shí)間內信道是空閑的,則發(fā)送數據;若忙碌則跳轉到步驟(5)。
(5)若嘗試的次數超出限定值(MAX_TRY_NUMBER),則跳轉到步驟(6)。
(6)如果由于信道忙無(wú)法發(fā)出數據,則發(fā)送節點(diǎn)將返回信道忙錯誤。
4 高性能應用設計
在實(shí)際的產(chǎn)品應用中,通常采用ACK握手信號、載波監聽(tīng)多路訪(fǎng)問(wèn)/沖突防止(CSMA/CA)等機制來(lái)保證數據收發(fā)的高效、穩定、可靠。而SI4432硬件不支持這些機制。為了增加本系統的高效適應性,設計了以下高性能通信機制。
4.1 基于A(yíng)CK的雙向通信
在無(wú)線(xiàn)數據傳輸過(guò)程中,為了確保發(fā)送過(guò)程的可靠性,發(fā)送端需要一應答信號以確保發(fā)送數據已被準確無(wú)誤接收。本設計中,接收端也可以通過(guò)ACK數據包發(fā)送有效數據至發(fā)送端,大大提高了信道的使用率。應答信號數據包格式如圖5所示。
圖5中,ACK控制字節的數據格式如圖6所示。如果發(fā)送節點(diǎn)需要一反饋以判斷數據包是否到達目的地,則需要將應答請求位(ACKRQ位)置1。發(fā)送完數據包以后,自動(dòng)轉為接收狀態(tài),等待ACK狀態(tài)的到來(lái)并接收應答信號數據包。如果接收節點(diǎn)接收到有效數據包且檢測到ACK控制字節中的ACKRQ位為1,則會(huì )自動(dòng)產(chǎn)生應答信號并且發(fā)送至發(fā)送節點(diǎn)。應答信息數據包中,ACK控制字節中的應答標志位(ACK位)被置1,并且有效數據為接收節點(diǎn)發(fā)給發(fā)送方的數據(當不需要發(fā)送有用數據時(shí),全部用0x00填充),同時(shí)源地址和目的地址相互交換。具體通信過(guò)程如圖7所示。
程序中,為了防止發(fā)送節點(diǎn)長(cháng)時(shí)間地等待,設定只需等待固定的時(shí)間,等待的時(shí)間長(cháng)短主要由實(shí)際的網(wǎng)絡(luò )參數決定:是否使能了包轉發(fā)、實(shí)際的數據速率等。若在規定的時(shí)間內,發(fā)送方未能接收到ACK數據包,則進(jìn)入ACK接收錯誤狀態(tài);若成功接收將進(jìn)入休眠、發(fā)送或是空閑狀態(tài)。
使用ACK信號可以實(shí)現收發(fā)節點(diǎn)的雙向通信,能很好地解決手動(dòng)切換無(wú)線(xiàn)收發(fā)狀態(tài)導致雙方互相等待的問(wèn)題,同時(shí)只在需要ACK信號的應用中才附帶應答有效信息,減少不必要的通信過(guò)程,大大提高了系統的穩定性和高效性。
4.2 精簡(jiǎn)的CSMA/CA發(fā)送機制
在無(wú)線(xiàn)通信過(guò)程中,在一個(gè)通信域內可能存在幾十個(gè)乃至幾百個(gè)無(wú)線(xiàn)終端同時(shí)工作。在這樣復雜的無(wú)線(xiàn)網(wǎng)絡(luò )中,無(wú)線(xiàn)數據發(fā)送頻繁,發(fā)生碰撞不可避免。當數據發(fā)送發(fā)生碰撞時(shí),意味著(zhù)有數據幀丟失。為了盡可能地避免由于發(fā)送數據時(shí)發(fā)生碰撞而導致數據幀的丟失,必須引入一種可以避免發(fā)送碰撞的機制。
評論