基于TinyOS的CC1100驅動(dòng)程序設計
摘 要:在無(wú)線(xiàn)傳感器網(wǎng)絡(luò )中,網(wǎng)絡(luò )整體性能取決于節點(diǎn)上的通信模塊。該文根據實(shí)際需要,在實(shí)現網(wǎng)絡(luò )基本功能的前提下,選用功耗較小的CC1100芯片作為節點(diǎn)的無(wú)線(xiàn)收發(fā)單元。在分析CC1100功能特性并介紹嵌入式操作系統TinyOS的基礎上,闡述如何使用NesC語(yǔ)言實(shí)現基于MSP430F1611平臺的CC1100驅動(dòng)程序。
本文引用地址:http://dyxdggzs.com/article/149991.htm1 概述
無(wú)線(xiàn)傳感器網(wǎng)絡(luò )(Wireless Sensor Network, WSN)是當前信息技術(shù)領(lǐng)域的熱點(diǎn)研究方向之一,它綜合了傳感器技術(shù)、遙測技術(shù)、嵌入式計算技術(shù)、分布式信息處理技術(shù)和無(wú)線(xiàn)通信技術(shù),是一種通過(guò)無(wú)線(xiàn)通信方式形成的多跳自組織網(wǎng)絡(luò )系統。無(wú)線(xiàn)傳感器網(wǎng)絡(luò )由大量體積小、功耗低、具有無(wú)線(xiàn)通信、傳感和數據處理功能的傳感器節點(diǎn)組成。節點(diǎn)是無(wú)線(xiàn)傳感器網(wǎng)絡(luò )的基本單元,它一般由傳感器模塊(傳感器、A/D轉換器)、處理器模塊(微處理器、存儲器)、無(wú)線(xiàn)通信模塊(無(wú)線(xiàn)收發(fā)器)和能量供應模塊(電池)組成。
本文研發(fā)的無(wú)線(xiàn)傳感器網(wǎng)絡(luò )節點(diǎn)選用Chipcon公司低功耗低成本單片收發(fā)芯片CC1100作為無(wú)線(xiàn)通信模塊,將其通過(guò)SPI串行總線(xiàn)技術(shù)與MCU(MSP430F1611)相連。采用加州大學(xué)伯克利分校人員專(zhuān)門(mén)為無(wú)線(xiàn)傳感器網(wǎng)絡(luò )開(kāi)發(fā)的嵌入式操作系統TinyOS作為軟件平臺。
2 設計需求分析
無(wú)線(xiàn)傳感器網(wǎng)絡(luò )由大量資源受限的節點(diǎn)組成。資源受限的特點(diǎn)決定了在選擇無(wú)線(xiàn)收發(fā)芯片以及開(kāi)發(fā)驅動(dòng)時(shí),必須滿(mǎn)足低功耗,并實(shí)現收發(fā)分組的基本功能。節點(diǎn)對CC1100的主要功能要求如下:發(fā)送時(shí)把MCU遞交過(guò)來(lái)的數據封裝成幀并實(shí)現分組發(fā)送;接收時(shí)完成分組接收后把數據提取出來(lái)交給MCU.無(wú)線(xiàn)傳感器網(wǎng)絡(luò )中節點(diǎn)發(fā)送一個(gè)比特所消耗的能量約等于其處理器進(jìn)行1 000次32位加法運算消耗的能量[1],因此,為了減少分組碰撞,降低因分組重發(fā)而消耗的能量,CC1100應實(shí)現發(fā)送數據之前的信道監聽(tīng)即載波監聽(tīng)功能。為了進(jìn)一步降低能耗,節點(diǎn)在沒(méi)有數據發(fā)送或接收時(shí)應置于休眠狀態(tài),并可以按指定方式激活,即具有休眠喚醒功能。具體設計需求如下:
(1)收發(fā)分組。這是CC1100需要實(shí)現的主要功能,CC1100在發(fā)送數據前,要完成數據的分組封裝,CC1100無(wú)線(xiàn)通信協(xié)議的分組格式如下:
其中,前導碼是一連串的10101010?,其數量為8n個(gè)比特,n的大小由用戶(hù)編程決定。同步字的內容和數量均可編程確定,長(cháng)度為數據域的字節數,數據域內容為MCU遞交的數據,CRC校驗可以編程選擇使用,灰色部分均可編程選擇。
(2)載波監聽(tīng)。由于無(wú)線(xiàn)傳感器中節點(diǎn)數量眾多,節點(diǎn)密度大,如果不加控制就互相通信,必然會(huì )發(fā)生分組碰撞。為了減少碰撞機會(huì ),提高節點(diǎn)能量效率,本文通過(guò)CC1100的電平檢測功能實(shí)現載波監聽(tīng)。CC1100提供了2種載波監聽(tīng)方式:絕對門(mén)限監聽(tīng)和相對門(mén)限監聽(tīng)。絕對門(mén)限監聽(tīng)是當信道電平超過(guò)某個(gè)指定數值時(shí)通知信道忙,相對門(mén)限監聽(tīng)是當信道電平增加量超過(guò)指定倍數(如6 dB)時(shí),檢測為信道忙。絕對門(mén)限監聽(tīng)需要大量信道特性統計來(lái)設置絕對門(mén)限電平值,相對門(mén)限監聽(tīng)方式可以避免上述工作且能適應時(shí)變噪聲場(chǎng)合。在本文項目中采用相對門(mén)限來(lái)監聽(tīng)信道,效果很好。
(3)睡眠喚醒。由于無(wú)線(xiàn)傳感器節點(diǎn)能量受限,因此在不必要的情況下,應盡量減少節點(diǎn)上硬件資源的活動(dòng)時(shí)間,在多數情況下,無(wú)線(xiàn)模塊應處于休眠狀態(tài)。CC1100通過(guò)發(fā)送一個(gè)命令控制器可以關(guān)掉無(wú)線(xiàn)收發(fā)模塊。類(lèi)似地,發(fā)送一個(gè)喚醒命令控制器可以激活該模塊。實(shí)現驅動(dòng)時(shí),筆者把上述命令封裝在一個(gè)接口中,供上層調用。
3 硬件連接關(guān)系
節點(diǎn)上MCU與無(wú)線(xiàn)收發(fā)模塊的硬件連接關(guān)系如圖1所示。左側是MCU,采用美國Texas Instruments(TI)公司生產(chǎn)的超低功耗微處理器MSP430F1611,它是一個(gè)16 位、具有精簡(jiǎn)指令集(RISC)、超低功耗的混合型單片機,其片上集成了豐富的外圍模塊,包括看門(mén)狗、定時(shí)器、硬件乘法器、A/D轉換器等,根據其運行打開(kāi)的模塊數目不同(即采用不同的工作模式),芯片的功耗有著(zhù)顯著(zhù)差異,除了正常的活動(dòng)模式外,它具有5種低功耗模式(LPM0~LPM4),在等待方式下,其電流僅為0.7 μA,在深睡眠情況下,最低電流僅為0.1 μA [2].右側是無(wú)線(xiàn)收發(fā)模塊CC1100,它是Chipcon公司采用0.18 μm CMOS技術(shù)生產(chǎn)的低功耗多頻段無(wú)線(xiàn)收發(fā)芯片,具有尺寸小、功耗低、靈敏度高、獨立的64字節收發(fā)緩存(TXFIFO/ RXFIFO)、數字化接收信號強度輸出(RSSI)等特點(diǎn),并有前向糾錯和數據白化等硬件處理模塊。它還具有3個(gè)通用數字輸出引腳GDOx(x=1~3),在實(shí)際應用時(shí),可以通過(guò)寄存器配置讓它們?yōu)樯蠈訉?shí)時(shí)提供信道或分組狀態(tài)[3].在硬件平臺上,CC1100的4個(gè)SPI通信管腳(SI, SO, SCLK, CSn)分別連接到相應MSP430F1611的4個(gè)SPI串行通信引腳,即MOSI, MISO, UCLK, MCLK上。通過(guò)這4根線(xiàn),處理器可以對CC1100進(jìn)行寄存器讀寫(xiě)和功能配置。由于CC1100只是從機模式,因此處理器只能采用主機模式。另外,本項目采用了其中2個(gè)通用數字輸出引腳GDO0和GDO2,分別用來(lái)實(shí)現分組發(fā)送指示和載波監聽(tīng)指示。
圖1 CC1100與MSP430F1611的硬件連接關(guān)系
CC1100與MSP430F1611通信時(shí),時(shí)鐘源由MSP430F1611提供,經(jīng)過(guò)配置處理器寄存器,本文采用其外圍時(shí)鐘模塊的系統子時(shí)鐘SMCLK.它們的通信方式為SPI串行通信方式。SPI通信是一種高速、全雙工的同步總線(xiàn)通信技術(shù),其硬件功能很強大,僅通過(guò)4個(gè)管腳,就可以在主機時(shí)鐘源SCLK節拍的控制下,通過(guò)2個(gè)雙向移位寄存器實(shí)現CC1100與MSP430F1611的串行數據交換。CSn引腳主要用來(lái)控制數據通信的同步性,在CC1100和MSP430F1611通信期間,要始終保證CSn引腳電平為低。
4 軟件平臺
TinyOS操作系統是目前無(wú)線(xiàn)傳感器網(wǎng)絡(luò )中應用較廣泛的操作系統,它是UC Berkeley開(kāi)發(fā)的源代碼開(kāi)放式操作系統,專(zhuān)門(mén)為無(wú)線(xiàn)傳感網(wǎng)絡(luò )設計。它基于組件的架構方式,可以快速實(shí)現各種應用。此外,其輕量級線(xiàn)程技術(shù)、事件驅動(dòng)模式、主動(dòng)消息通信技術(shù)等思想極大提高了節點(diǎn)的資源利用率[2].TinyOS環(huán)境下編程語(yǔ)言為NesC,NesC是對C語(yǔ)言的擴展,擴展的目的是將C的模塊化思想與TinyOS的事件驅動(dòng)機制結合起來(lái)。為了支持組件化編程模式,NesC語(yǔ)言引入了接口和組件的概念。接口是一系統功能類(lèi)似或相關(guān)的函數聲明,根據不同方向命名為命令或事件,具體實(shí)現在提供或使用該接口的組件中。組件包括配件和模塊,配件負責把不同組件通過(guò)接口連接起來(lái),模塊提供程序所需的代碼實(shí)現。組件中的接口是雙向的,它給出使用者可以調用的命令或必須處理的事件。不同組件之間通過(guò)接口靜態(tài)連接,以提高程序的運行效率,增加程序的魯棒性。NesC的并發(fā)模型是基于運行到結束的任務(wù)實(shí)現的,程序運行任務(wù)時(shí),硬件中斷服務(wù)程序能搶占任務(wù),且在中斷服務(wù)程序中也可能出現其他中斷服務(wù)程序來(lái)?yè)屨嫉默F象,甚至出現多級中斷嵌套。但由于中斷處理程序只做少量工作,會(huì )很快執行完畢,因此沒(méi)有提交成功的任務(wù)不會(huì )被無(wú)限期掛起。
5 CC1100驅動(dòng)實(shí)現
在TinyOS中,硬件抽象體系結構(Hardware Abstract Architecture, HAA)一般有3個(gè)不同的抽象層次,根據不同需要,可以靈活地實(shí)現不同芯片、不同平臺、甚至不同系統間的程序調用。但考慮到代碼數量、程序復雜度、節點(diǎn)資源等因素,在設計CC1100驅動(dòng)程序時(shí),需要借鑒TinyOS 3層抽象體系外,并兼顧節點(diǎn)存儲能力和運算能力。
5.1 TinyOS中的硬件抽象體系結構
TinyOS 中的硬件抽象體系結構一般分為3層,如圖2所示,分別為硬件表示層(HPL)、硬件抽象層(HAL)和硬件接口層(HIL)[4].通過(guò)對硬件平臺進(jìn)行不同層次的抽象,可以在系統開(kāi)發(fā)中有區別地向上層屏蔽硬件特征,從而實(shí)現在不同程度上隔離上層組件和物理平臺,便于程序移植。在功能上,硬件抽象組件相當于底層硬件的驅動(dòng)程序,上層組件通過(guò)硬件抽象組件提供的接口進(jìn)行調用。
圖2 TinyOS 中的硬件抽象體系結構 在圖2中,硬件表示層通過(guò)存儲器或端口映射對硬件平臺上某個(gè)模塊(如通信模塊、存儲模塊等)進(jìn)行直接操作與控制,對上層屏蔽硬件特征,實(shí)現軟/硬件的分離,從而實(shí)現該模塊硬件功能的軟件語(yǔ)言表達。硬件接口層在硬件抽象層的基礎上實(shí)現對該硬件的功能操作,這是該體系結構的核心,通過(guò)調用該層接口,可以實(shí)現平臺上某個(gè)模塊提供的全部功能。硬件接口層是針對平臺上不同芯片(如一個(gè)硬件平臺上的2個(gè)通信模塊CC1100和CC2420)的更高層次的抽象,它通過(guò)不同硬件抽象層提供的接口,把平臺上不同芯片的組件封裝成與底層組件芯片甚至硬件芯片無(wú)關(guān)的接口供高層調用,從而屏蔽不同芯片的差異,實(shí)現了兼容性較強的跨平臺抽象體 系結構。 5.2 CC1100驅動(dòng)體系結構 在設計驅動(dòng)程序時(shí),由于CC1100硬件功能強大并能夠提供豐富的控制寄存器資源,通過(guò)對這些寄存器的配置可以實(shí)現基本功能,因此在設計時(shí),筆者側重于構建一個(gè)合理的組件層次結構,以便模塊的修改與跨平臺應用。在筆者開(kāi)發(fā)的節點(diǎn)上只有一個(gè)通信模塊CC1100,未涉及多個(gè)無(wú)線(xiàn)收發(fā)芯片,加上節點(diǎn)處理、存儲能力的限制,在滿(mǎn)足需求的前提下,本文只設計了TinyOS 硬件抽象體系3層中的下2層,從而達到縮減代碼、節約能量的目的。CC1100驅動(dòng)體系結構體系如圖3所示。 圖3 CC1100驅動(dòng)體系結構 在圖3中,硬件表示層配件HPLCC1100C向上層提供了3個(gè)接口:StdControl, Chipcon, CCFIFO,模塊HPLCC1100M完成對CC1100直接控制和基本功能的軟件表達,實(shí)現3個(gè)接口的全部命令執行代碼。硬件抽象層配件CC1100RadioC向上層提供了4個(gè)接口:StdControl, PhyState, PhyPacket和CarriSns,模塊CC1100RadioM包含了CC1100全部功能的軟件實(shí)現。本文結合CC1100驅動(dòng)體系結構,簡(jiǎn)要介紹其主要功能,即收發(fā)分組。 HAL層的CC1100RadioM模塊是物理層組件結構的高層,該模塊主要實(shí)現對分組的發(fā)送與接收、對無(wú)線(xiàn)發(fā)送模塊的狀態(tài)進(jìn)行控制以及載波監聽(tīng)功能。其中,StdControl接口主要完成無(wú)線(xiàn)收發(fā)模塊的初始化和CC1100的啟動(dòng)及停止;PhyState實(shí)現CC1100的各個(gè)工作狀態(tài)的切換,包括無(wú)線(xiàn)模塊的休眠和喚醒;PhyPacket實(shí)現分組的收發(fā),高層組件可以直接調用該接口進(jìn)行數據發(fā)送或接收;CarriSns用來(lái)為上層提供載波監聽(tīng)功能,通過(guò)硬件引腳電平情況來(lái)判斷信道忙閑狀態(tài)。上述接口只是相關(guān)命令或事件的聲明,其真正實(shí)現在提供這些接口的模塊,即CC1100RadioM中。 HPL層的HPLCC1100M()模塊實(shí)現對無(wú)線(xiàn)通信模塊的直接控制和軟件表達,實(shí)質(zhì)是對CC1100各個(gè)寄存器進(jìn)行讀寫(xiě)。該模塊為整個(gè)硬件平臺提供了SPI同步串行通信機制,向上層提供了StdControl, Chipcon, CCFIFO接口。其中,StdControl接口完成CC1100復位并初始化底層芯片,包括SPI通信時(shí)鐘源選擇、波特率設置、引腳輸入輸出方式以及無(wú)線(xiàn)收發(fā)模塊的射頻頻率、調制方式、數據速率、信號檢測方式等;Chipcon接口實(shí)現控制寄存器讀寫(xiě)操作和命令控制器的發(fā)送,以實(shí)現對CC1100的配置和控制,其實(shí)現方式是SPI串行通信,CCFIFO主要完成TXFIFO和RXFIFO的數據連續讀寫(xiě)操作,主要是在發(fā)送或接收數據時(shí)供CC1100RadioM調用。上述接口只是相關(guān)命令或事件的聲明,其真正實(shí)現在提供這些接口的模塊即HPLCC1100M中。 當上層組件把需要發(fā)送的數據遞交下來(lái),并調用CC1100RadioM組件提供的接口PhyPacket中的發(fā)送命令時(shí),CC1100RadioM會(huì )先調用HPLCC1100M中CCFIFO接口提供的寫(xiě)FIFO命令把要發(fā)送的數據寫(xiě)入發(fā)送緩存TXFIFO中,筆者使用CC1100的連續讀寫(xiě)方式來(lái)實(shí)現。然后發(fā)送命令控制器STX使能CC1100開(kāi)始發(fā)送分組,并把CC1100狀態(tài)切換到發(fā)送狀態(tài)。本文使用了CC1100的通用數字輸出引腳GDO2,通過(guò)適當配置,該引腳電平會(huì )在CC1100發(fā)送/接收完前導碼時(shí)產(chǎn)生上升沿跳變,在整個(gè)分組發(fā)送/接收完成后產(chǎn)生下降沿跳變??梢酝ㄟ^(guò)查詢(xún)GDO2引腳電平來(lái)判斷分組是否寫(xiě)入完畢。當發(fā)送數據寫(xiě)完以后,CC1100會(huì )按第2節所述的分組格式對數據進(jìn)行封裝,上層組件通過(guò)查詢(xún)GDO2引腳確定分組發(fā)送完畢后,根據需要再發(fā)送命令控制器把CC1100置于空閑或休眠狀態(tài)。 接收分組時(shí)節點(diǎn)會(huì )先檢測信道中的前導碼,如果按指定方式檢測到指定數量的前導碼,CC1100的GDO2引腳電平會(huì )產(chǎn)生一個(gè)上升沿跳變,上層組件得知引腳跳變后,會(huì )把CC1100切換到接收狀態(tài)并調用HPLCC1100M組件中的讀取接收緩存RXFIFO命令,然后開(kāi)始讀取接收緩存,讀取完CC1100接收緩存中的分組并把有用數據提取出來(lái)交給上層后,可以根據需要把它置于空閑或休眠狀態(tài)。在程序實(shí)現過(guò)程中,為了節約節點(diǎn)能源,減少MSP430F1611的活動(dòng)時(shí)間,筆者沒(méi)有使用等待查詢(xún)方式而采用硬件中斷方式,即使用了GDO2引腳的電平跳變特點(diǎn),當檢測到前導碼時(shí),觸發(fā)一個(gè)MSP430F1611端口中斷,在中斷服務(wù)程序中進(jìn)行了讀取接收緩存RXFIFO等操作,從而讓MSP430F1611更多時(shí)間處于休眠狀態(tài),達到降低功耗的目的。 6 結束語(yǔ) 無(wú)線(xiàn)傳感器網(wǎng)絡(luò )節點(diǎn)能量受限的特點(diǎn)決定了本文選擇和開(kāi)發(fā)軟硬件的思路及方法。出于低功耗考慮,筆者選擇CC1100芯片,給出使用NesC語(yǔ)言在TinyOS環(huán)境下設計的基于SPI串行總線(xiàn)的CC1100驅動(dòng)程序。程序在本文節點(diǎn)上的實(shí)際應用說(shuō)明該程序實(shí)現了基于MSP430F1611平臺的無(wú)線(xiàn)收發(fā)功能以及分組的正常收發(fā)。大量測試結果表明,節點(diǎn)運行穩定,具備載波監聽(tīng)、休眠喚醒等相關(guān)功能。
評論