叢 林,楊 凱,胡文東,徐文濤,黃 燁
(1.空軍工程大學(xué) 航空航天工程學(xué)院,陜西 西安710038;2.第四軍醫(yī)大學(xué)航 空航天醫(yī)學(xué)系,陜西 西安710032)
隨著科學(xué)技術(shù)水平的不斷提高,傳統(tǒng)的有線通信因自身的局限性已越來(lái)越不能滿足人們的需要,無(wú)線通信技術(shù)得到了快速發(fā)展。如今出現(xiàn)了種類眾多的無(wú)線通信技術(shù),目前比較熱門的有WiFi、藍(lán)牙、UWB、ZigBee、Nordic nRF以及TI公司的SimpliciTI等。不同無(wú)線通信技術(shù)在成本、功耗、傳輸速率、使用頻段、功能方面有很大區(qū)別,針對(duì)不同的需求要選擇適合的無(wú)線技術(shù)。
針對(duì)便攜式設(shè)備的低成本、低功耗要求,藍(lán)牙和WiFi功耗相對(duì)較大,UWB規(guī)范尚不統(tǒng)一且芯片價(jià)格高,Zigbee的傳輸速率受限僅250 kbit/s,SimpliciTI則受TI公司硬件平臺(tái)限制。綜合考慮各個(gè)因素,本系統(tǒng)采用了Nordic Semiconductor公司2.4 GHz低成本高性能的nRF24L01無(wú)線射頻芯片,由低功耗ARM系列STM32L152RD微處理器控制,實(shí)現(xiàn)短距離無(wú)線數(shù)據(jù)通信。nRF24L01不僅可以提供一個(gè)真正的超低功耗解決方案,而且也擁有優(yōu)良的共存性,其載波監(jiān)測(cè)功能保證了在WLAN干擾下的可靠通信。高速的頻率切換時(shí)間減少了與藍(lán)牙等跳頻系統(tǒng)出現(xiàn)互相干擾的可能。
系統(tǒng)的設(shè)計(jì)思路是在滿足高速傳輸數(shù)據(jù)的同時(shí)盡可能的降低功耗,故在MCU與無(wú)線芯片的選型上側(cè)重于性能和功耗的平衡。系統(tǒng)硬件部分采用模塊化的設(shè)計(jì)思想,主要由供電模塊,nRF24L01射頻模塊和微控制器模塊組成。其中供電模塊根據(jù)實(shí)際需求方案很多,本文就不詳細(xì)敘述了。
nRF24L01是由Nordic Semiconductor公司出品的GFSK單片式收發(fā)芯片[1],工作于2.4~2.5 GHz的世界通用(ISM)頻段,傳輸速率可達(dá)2 Mbit/s。芯片包括頻率發(fā)生器、功率放大器、增強(qiáng)型SchockBurstTM模式控制器、晶振和調(diào)制解調(diào)器。發(fā)射功率和頻道選擇等工作參數(shù)可以通過(guò)SPI接口進(jìn)行設(shè)置。增強(qiáng)型ShockBurstTM功能使軟件設(shè)計(jì)更為簡(jiǎn)單,集成了雙向通信所需要的鏈路層,而通常這些功能需要一個(gè)高速的MCU和大空間的存儲(chǔ)器和高的電源消耗來(lái)實(shí)現(xiàn)。nRF24L01及外部接口如圖1所示。
圖1 nRF24L01及外部接口
STM32L152RD基于高品質(zhì)的ARM Cortex-M3內(nèi)核,融合了高性能和超低功耗的特性,內(nèi)置高速存儲(chǔ)器,工作頻率為32 MHz。它采用了優(yōu)化的節(jié)能架構(gòu)與0.13μm的STMicroelectronics超低漏電生產(chǎn)工藝,此外,為了實(shí)現(xiàn)超低功耗,STM32L152RD還劃分了6種工作模式,使其在任何設(shè)定時(shí)間內(nèi)都能以最低的功耗完成任務(wù)。STM32控制器的SPI[2](串行外設(shè)接口)允許芯片與外部設(shè)備以全雙工或者半雙工、同步、串行方式通信,可用于多種用途,包括使用一條雙向數(shù)據(jù)線的雙線單工同步傳輸,還可使用CRC校驗(yàn)的可靠通信。
通常SPI通過(guò)4個(gè)管腳與外部器件相連。MISO:主設(shè)備輸入/從設(shè)備輸出管腳,該管腳在從模式下發(fā)送數(shù)據(jù),在主模式下接收數(shù)據(jù);MOSI:主設(shè)備輸出/從設(shè)備輸入管腳,該管腳在主模式下發(fā)送數(shù)據(jù),在從模式下接收數(shù)據(jù);SCK:串口時(shí)鐘,作為主設(shè)備的輸出,從設(shè)備的輸入;NSS:從設(shè)備選擇。這是一個(gè)可選的管腳,用來(lái)選擇主/從設(shè)備[3]。
系統(tǒng)除了使用MCU這4個(gè)管腳與無(wú)線模塊相連,還通過(guò)PA0管腳控制nRF24L01的片選端CE,PB0管腳控制中斷響應(yīng)。圖2是微控制器模塊STM32L152RD與nRF24L01的接口電路原理圖。
圖2 接口電路原理圖
nRF24L01無(wú)線射頻芯片內(nèi)置的鏈路層使軟件設(shè)計(jì)更為簡(jiǎn)單,系統(tǒng)進(jìn)行無(wú)線通信無(wú)須配置復(fù)雜的通信協(xié)議,只需編程配置好射頻芯片與MCU的SPI通信接口,然后在發(fā)送時(shí)將有效數(shù)據(jù)放入TX緩沖區(qū),芯片將把地址信息和TX緩沖區(qū)的有效數(shù)據(jù)與內(nèi)部自行產(chǎn)生的數(shù)據(jù)頭、標(biāo)志位和CRC校驗(yàn)碼等信息結(jié)合起來(lái)進(jìn)行數(shù)據(jù)打包并發(fā)送出去。表1給出增強(qiáng)型的ShockBurstTM模式的數(shù)據(jù)包[4]。整個(gè)系統(tǒng)的軟件設(shè)計(jì)部分分為初始化操作、配置發(fā)送模式、配置接收模式、配置中斷4部分。
表1 增強(qiáng)型的ShockBurstTM模式的數(shù)據(jù)包 byte
無(wú)線射頻芯片nRF24L01要進(jìn)行無(wú)線通信,首先要對(duì)MCU的時(shí)鐘,MCU的SPI通信口和nRF24L01進(jìn)行初始化操作[5]。MCU時(shí)鐘和SPI接口初始化部分STM32L152RD的芯片資料[6]很詳細(xì),在此就不詳細(xì)敘述了。nRF24L01的初始化主要包括地址、應(yīng)答方式、工作頻率、數(shù)據(jù)長(zhǎng)度、發(fā)射速率、中斷響應(yīng)等參數(shù)的配置。nRF24L01初始化操作[7]的流程圖如圖3所示。
圖3 nRF24L01初始化操作流程圖
nRF24L01配置為增強(qiáng)型的ShockBurstTM發(fā)送模式[8],當(dāng)MCU有數(shù)據(jù)要發(fā)送nRF24L01就會(huì)啟動(dòng)Shock-BurstTM模式,自動(dòng)生成數(shù)據(jù)頭、標(biāo)志位和CRC校驗(yàn)碼并發(fā)送數(shù)據(jù)。數(shù)據(jù)發(fā)送完畢后將轉(zhuǎn)到接收模式并等待接收端的ACK應(yīng)答信號(hào)。如果沒有收到ACK應(yīng)答信號(hào),則認(rèn)為數(shù)據(jù)丟失,nRF24L01將循環(huán)重發(fā)數(shù)據(jù)包,直到收到ACK或重發(fā)次數(shù)超過(guò)重發(fā)寄存器中設(shè)置的值為止。如果數(shù)據(jù)重發(fā)次數(shù)超過(guò)了初始設(shè)定值,則會(huì)產(chǎn)生數(shù)據(jù)溢出導(dǎo)致IRQ中斷。當(dāng)收到ACK應(yīng)答信號(hào)時(shí),nRF24L01就認(rèn)為最后一包數(shù)據(jù)已經(jīng)發(fā)送成功,TX_FIFO寄存器中的數(shù)據(jù)被清除并產(chǎn)生IRQ中斷通知MCU。MCU根據(jù)任務(wù)需求控制nRF24L01進(jìn)入發(fā)送模式,接收模式或待機(jī)模式。發(fā)送模式流程如圖4所示。
配置發(fā)送模式代碼如下:
void nRF24L01_TxPacket(unsigned char*tx_buf)
{
NRF24L01_MODE_CE_0();
SPI_Write_Buf(WRITE_REG1+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//寫入接收地址
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);//寫入//要發(fā)送的數(shù)據(jù)
SPI_RW_Reg(WRITE_REG1+CONFIG,0x0e);//IRQ中斷,16位CRC
NRF24L01_MODE_CE_1();//CE置1,激發(fā)增強(qiáng)型的ShockBurstTM發(fā)送模式
圖4 發(fā)送模式流程圖
Delay_us(20);//注意延遲值不能太低
}
在增強(qiáng)型的ShockBurstTM接收模式[9]下,nRF24L01可以接收6路不同地址相同頻率的數(shù)據(jù),每個(gè)數(shù)據(jù)通道擁有自己的地址,通過(guò)寄存器RX_ADDR_PX來(lái)配置。nRF24L01CE置高后130μs便自動(dòng)檢測(cè)空中信息,當(dāng)有通道接收到有效的地址和數(shù)據(jù)時(shí),進(jìn)行CRC校驗(yàn),正確則記錄地址并以此為目標(biāo)地址發(fā)送應(yīng)答信號(hào)ACK同時(shí)自動(dòng)去除數(shù)據(jù)頭,標(biāo)志位和校驗(yàn)碼并將有效數(shù)據(jù)寫入RX_FIFO寄存器,芯片通過(guò)產(chǎn)生IRQ中斷通知MCU接收完畢,隨后MCU可從RX_FIFO寄存器讀出有效數(shù)據(jù)。如果CRC校驗(yàn)錯(cuò)誤則丟棄數(shù)據(jù)包重新檢測(cè)空中信息。當(dāng)成功接收數(shù)據(jù)時(shí),MCU可根據(jù)任務(wù)需求控制nRF24L01進(jìn)入發(fā)送模式,接收模式或待機(jī)模式。接收模式流程如圖5所示。
配置接收模式代碼如下:
void nRF24L01_SetRX_Mode(void)
{
NRF24L01_MODE_CE_0();
SPI_RW_Reg(0xe2,0); //清接收FIFO
SPI_RW_Reg(WRITE_REG1+STATUS,0XFF);//清狀態(tài)寄存器
SPI_RW_Reg(WRITE_REG1+CONFIG,0x0F);//IRQ中斷,16位CRC
NRF24L01_MODE_CE_1();
}
圖5 接收模式流程圖
中斷機(jī)制是單片機(jī)的基礎(chǔ)設(shè)施之一,它起著通信網(wǎng)絡(luò)的作用,以協(xié)調(diào)系統(tǒng)對(duì)各種內(nèi)外部時(shí)間的響應(yīng)和處理。通過(guò)配置外部中斷,可以判斷數(shù)據(jù)發(fā)送和接收的情況,以便對(duì)相應(yīng)事件做出處理。配置中斷代碼如下:
void NRF24L01_INT_IRQHandler(void)
{
uint8_t status;status=0;
if(EXTI_GetITStatus(NRF24L01_IRQ_EXTI_LINE)!=RESET)//判斷是否產(chǎn)生了EXTI2中斷
{
if(GPIO_ReadInputDataBit(NRF24L01_IRQ_GPIO_PORT,NRF24L01_IRQ_PIN)==0)//判斷是否是PA2線變低
status=SPI_Read(READ_REG1+STATUS);//讀狀態(tài)寄器
if(status &0x40) //如果接收到數(shù)據(jù)
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//將數(shù)據(jù)從RX緩沖區(qū)讀出
SPI_RW_Reg(0xe2,0); //清除發(fā)送緩沖區(qū)
}
else if((status &0x10)>0)//發(fā)射達(dá)到最大復(fù)發(fā)次數(shù)
SPI_RW_Reg(0xe1,0); //清除發(fā)送緩沖區(qū)
else if((status &0x20)>0)//發(fā)射后收到應(yīng)答
SPI_RW_Reg(0xe1,0);
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);//將數(shù)據(jù)從RX緩沖區(qū)讀出
SPI_RW_Reg(WRITE_REG1+STATUS,0xFF);//清除寄存器標(biāo)志
}
EXTI_ClearITPendingBit(NRF24L01_IRQ_EXTI_LINE);//清除EXTI2上的中斷標(biāo)志
}}
為保證系統(tǒng)準(zhǔn)確有效,現(xiàn)將本文方案與目前已有的幾種無(wú)線通信系統(tǒng)方案進(jìn)行對(duì)比[9-10],其中系統(tǒng)綜合耗電的計(jì)算是通過(guò)無(wú)線芯片發(fā)射電流和接收電流的平均值與8 MHz工作時(shí)的MCU電流之和。對(duì)比分析如表2所示。
表2 幾種無(wú)線方案對(duì)比分析
表中系統(tǒng)綜合耗電的數(shù)據(jù)直觀地顯示出本文設(shè)計(jì)的系統(tǒng)功耗明顯低于其他的無(wú)線方案,更滿足便攜設(shè)備低功耗的需求。
提出了一種基于STM32L152RD微控制器和nRF24L01無(wú)線射頻芯片的超低功耗無(wú)線通信系統(tǒng)方案,并搭建了實(shí)際硬件系統(tǒng),實(shí)現(xiàn)了超低功耗下的高速近距離無(wú)線數(shù)據(jù)傳輸。無(wú)工作任務(wù)時(shí)nRF24L01可進(jìn)入掉電模式,STM32L152RD可進(jìn)入休眠模式,系統(tǒng)功耗更低,特別滿足便攜式設(shè)備功耗盡可能低的要求。系統(tǒng)硬件電路簡(jiǎn)單、成本低、傳輸速率快、可靠性好、具有良好的可擴(kuò)展性,適用于對(duì)功耗有較高要求的便攜設(shè)備無(wú)線通信。
[1]Nordic Semiconductor ASA.nRF24L01_Product_Specification_v2.0[EB/OL].[2013-01-01].http://www.nordicsemi.no.
[2]潘勇.短距離無(wú)線數(shù)據(jù)網(wǎng)絡(luò)的應(yīng)用研究無(wú)線數(shù)據(jù)網(wǎng)絡(luò)[D].天津:天津大學(xué),2010.
[3]徐廣偉.RFID在煤礦系統(tǒng)中的應(yīng)用[D].成都:成都理工大學(xué),2010.
[4]肖林榮,應(yīng)時(shí)彥,馬躍坤,等.2.4 GHz射頻收發(fā)芯片nRF24LE1及其應(yīng)用[J].信息技術(shù),2009(12):13-16.
[5]徐愛鈞,彭秀華.單片機(jī)高級(jí)語(yǔ)言C51Windows環(huán)境編程與應(yīng)用[M].北京:電子工業(yè)出版社,2008.
[6]STMicroelectronics.STM32L152RD Datasheet[EB/OL].[2013-01-01].http://www.st.com.
[7]隋紹勇,鄭維廣,張振邦.基于STM32F103和nRF24L01的近程無(wú)線數(shù)傳系統(tǒng)設(shè)計(jì)[J].電子元器件應(yīng)用,2010(12):15-17.
[8]張金昌,李博,馮小琴.nRF24L01在智能電子導(dǎo)游系統(tǒng)中的應(yīng)用[J].數(shù)字通信,2012(4):88-90.
[9]朱慧彥,林林.基于MCU和nRF24L01的無(wú)線通信系統(tǒng)設(shè)計(jì)[J].電子科技,2012(4):81-83.
[10]時(shí)志云,王代華,張志杰.基于nRF24L01和PICl6F877的無(wú)線數(shù)據(jù)傳輸系統(tǒng)設(shè)計(jì)[J].電子測(cè)量,2008(1):60-63.