基于nRF905的無(wú)線數(shù)據(jù)傳輸設(shè)備設(shè)計(jì)
引言
無(wú)線通信在機(jī)動(dòng)性要求較強(qiáng)的設(shè)備中或人們不方便隨時(shí)到達(dá)現(xiàn)場(chǎng)的條件下得到了越來(lái)越廣泛的應(yīng)用,如無(wú)線數(shù)據(jù)采集、無(wú)線設(shè)備管理和監(jiān)控、汽車儀表數(shù)據(jù)的無(wú)線讀取等都是其典型應(yīng)用。微功率短距離無(wú)線通信技術(shù)作為無(wú)線通信實(shí)用技術(shù),一般使用單片射頻收發(fā)芯片,加上微控制器和少量外圍器件構(gòu)成專用或通用無(wú)線通信模塊,通常射頻芯片采用GFSK(高斯頻移鍵控)調(diào)制方式,工作于ISM(工業(yè)、科學(xué)、醫(yī)療)頻段,通信模塊包含簡(jiǎn)單透明的數(shù)據(jù)傳輸協(xié)議或使用簡(jiǎn)單的加密協(xié)議,用戶不必對(duì)無(wú)線通信原理和工作機(jī)制有較深的了解,只要依據(jù)命令字進(jìn)行操作即可實(shí)現(xiàn)基本的數(shù)據(jù)無(wú)線傳輸功能,因其功率小、開發(fā)簡(jiǎn)單快速而在工業(yè)、民用等領(lǐng)域應(yīng)用廣泛。本文介紹利用ATmega16單片機(jī)和無(wú)線數(shù)據(jù)收發(fā)芯片nRF905構(gòu)成的短距離無(wú)線數(shù)據(jù)傳輸設(shè)備,給出了硬件和軟件設(shè)計(jì)方案。
1 系統(tǒng)硬件設(shè)計(jì)
1.1 系統(tǒng)結(jié)構(gòu)
無(wú)線數(shù)據(jù)傳輸系統(tǒng)結(jié)構(gòu)如圖1所示。該系統(tǒng)由外部數(shù)據(jù)設(shè)備和無(wú)線數(shù)據(jù)傳輸模塊組成,外部數(shù)據(jù)設(shè)備為PC機(jī)或數(shù)據(jù)采集等設(shè)備,我們?cè)O(shè)計(jì)的主要是無(wú)線數(shù)據(jù)傳輸模塊。無(wú)線數(shù)據(jù)傳輸模塊基于微功耗單片射頻收發(fā)器nRF905設(shè)計(jì),采用Atmel公司的高性能、低功耗8位處理器ATmega16為主處理芯片,完成數(shù)據(jù)的處理和控制。
1.2 ATmega16和nRF905
Atmel公司的ATmega16單片機(jī)具有先進(jìn)的RISC(精簡(jiǎn)指令集計(jì)算機(jī))結(jié)構(gòu)、非易失性程序和數(shù)據(jù)存儲(chǔ)器,16 kB可編程Flash存儲(chǔ)器、512 B的EEPROM和1 kB片內(nèi)SRAM,具有豐富的外設(shè)接口,其USART(通用同步和異步接收器和轉(zhuǎn)發(fā)器)是一個(gè)高度靈活的串行通信設(shè)備,SPI(串行外設(shè)接口)允許ATmega16與外設(shè)或其他AVR器件進(jìn)行高速的同步數(shù)據(jù)傳輸。
nRF905是挪威Nordic VLSI公司推出的單片射頻收發(fā)器,工作電壓為1.9 V~3.6 V,工作于433/868/915 MHz這3個(gè)ISM頻段,頻道轉(zhuǎn)換時(shí)間小于650μs,最大數(shù)據(jù)速率為100 kbit/s。nRF905由頻率合成器、接收解調(diào)器、功率放大器、晶體振蕩器和GFSK調(diào)制器組成,不需外加聲表面濾波器,ShockBurstTM工作模式,自動(dòng)處理字頭和CRC(循環(huán)冗余檢驗(yàn)),使用SPI接口與微控制器通信,配置非常方便。此外,其功耗很低,以-10 dBm輸出功率發(fā)射時(shí)電流只有11 mA,工作于接收模式時(shí)的電流為12.5 mA,具有窄閑模式與關(guān)機(jī)模式,易于實(shí)現(xiàn)功率管理。
1.3 硬件電路
硬件電路主要由電源與復(fù)位電路、外部數(shù)據(jù)設(shè)備接口電路、單片機(jī)系統(tǒng)和nRF905應(yīng)用電路等幾部分組成。硬件電路如圖2所示。
1.3.1 電源與復(fù)位電路
nRF905和單片機(jī)的典型工作電壓為+3.3 V,而系統(tǒng)供電電源為+5V,所以采用低壓差線性穩(wěn)壓器TPS7333實(shí)現(xiàn)+5 V~+3.3 V的線性穩(wěn)壓。為了實(shí)現(xiàn)穩(wěn)定、可靠的復(fù)位,使用低電壓工作的復(fù)位芯片TPS70733產(chǎn)生復(fù)位信號(hào)。
1.3.2 外部數(shù)據(jù)設(shè)備接口
無(wú)線數(shù)據(jù)傳輸模塊與外部數(shù)據(jù)設(shè)備之間采用RS-232接口,ATmega16的PD0-PD1用于連接RS-232串口。通常,PC機(jī)與單片機(jī)用兩根線方式進(jìn)行全雙工異步通信。由于AVR單片機(jī)輸人輸出為TTL電平,PC機(jī)配置的是RS-232標(biāo)準(zhǔn)串行接口,二者電氣規(guī)范不一致,因此,使用ICL3221收發(fā)芯片實(shí)現(xiàn)串口電平轉(zhuǎn)換。
數(shù)據(jù)傳輸速率在板可設(shè)置或通過(guò)外部數(shù)據(jù)設(shè)備設(shè)置。在板波特率利用ATmega16的PA7、PA6兩位設(shè)置,可設(shè)置為9.6kbit/s、19.2 kbit/s、38.4kbit/s、115.2 kbit/s。利用外部數(shù)據(jù)設(shè)備設(shè)置波特率時(shí),單片機(jī)的初始數(shù)據(jù)傳輸速率為9.6 kbit/s,PA7、PA6置為00狀態(tài),當(dāng)單片機(jī)收到波特率沒(méi)置命令后,數(shù)據(jù)傳輸速率調(diào)整為設(shè)定值。
1.3.3 單片機(jī)與nRF905接口電路
單片機(jī)與nRF905的接口電路很最要。nRF905內(nèi)部有5個(gè)寄存器:狀態(tài)寄存器、配置寄存器、發(fā)射地址寄存器、發(fā)射數(shù)據(jù)寄存器和接收數(shù)據(jù)寄存器。除了對(duì)寄存器讀寫外,還需對(duì)nRF905工作模式的切換進(jìn)行控制。單片機(jī)與nRF905的信號(hào)連接見(jiàn)圖3。
ATmega16與nRF905之間的雙向數(shù)據(jù)傳輸使用SPI接口,單片機(jī)的PB7-PB4連接nRF905的SPI接口,PD2-PD7連接nRF905的控制信號(hào)和檢測(cè)信號(hào),用于nRF905的模式切換以及通信過(guò)程中必須的信號(hào)指示接口。
2 系統(tǒng)軟件設(shè)計(jì)
2.1 數(shù)據(jù)傳輸過(guò)程
PC機(jī)(或其他外部設(shè)備)有數(shù)據(jù)傳輸或需設(shè)置設(shè)備參數(shù)時(shí),通過(guò)串口將數(shù)據(jù)發(fā)送給單片機(jī),單片機(jī)接收數(shù)據(jù)后,將需發(fā)送的數(shù)據(jù)(這里包括目標(biāo)設(shè)備地址和所要發(fā)送的數(shù)據(jù))通過(guò)SPI接口發(fā)送給nRF905,nRF905將數(shù)據(jù)加前導(dǎo)碼和CRC碼,將數(shù)據(jù)包發(fā)送。
當(dāng)nRF905接收到有效數(shù)據(jù)后,DR置高,單片機(jī)檢測(cè)到DR為高電平后,復(fù)位TRX_CE引腳,使nRF905進(jìn)入空閑模式,通過(guò)SPI接口從nRF905中讀出接收數(shù)據(jù),然后通過(guò)USART傳送給PC機(jī)或其他外部沒(méi)備。
軟件功能模塊由CPU寄存器初始化、串行口初始化、串口收發(fā)送程序、SPI初始化、SPI收發(fā)送程序、I/O口初始化、nRF905配置寄存器操作、nRF905接收程序、發(fā)送程序、主程序模塊組成。下面簡(jiǎn)要介紹主要的軟件功能模塊。
2.2 USART串口軟件設(shè)計(jì)
AVR USART與AVR UART在寄存器位定義、波特率發(fā)生器、發(fā)送器操作、發(fā)送緩沖器的功能以及接收器操作等方面完全兼容,此外,接收緩沖器進(jìn)行了兩方面改進(jìn):增加了一個(gè)緩沖器;接收移位寄存器可以作為第3級(jí)緩沖。
2.2.1 串口數(shù)據(jù)幀格式
外部數(shù)據(jù)設(shè)備與無(wú)線數(shù)據(jù)傳輸設(shè)備間的雙向數(shù)據(jù)傳輸使用相同的幀格式,幀格式由幀頭、幀長(zhǎng)、幀標(biāo)志和數(shù)據(jù)組成。幀頭為數(shù)據(jù)幀開始標(biāo)志,固定為0FF81H,長(zhǎng)度2字節(jié)。幀長(zhǎng)指從幀標(biāo)志開始至本幀結(jié)束的所有數(shù)據(jù)的字節(jié)數(shù),不包括幀頭、幀長(zhǎng)本身,單位為字節(jié),幀長(zhǎng)占1字節(jié)。幀標(biāo)志用以指示本幀數(shù)據(jù)的內(nèi)容屬性,長(zhǎng)度為1字節(jié)。不同類型幀的數(shù)據(jù)長(zhǎng)度和幀標(biāo)志具體定義如表1所示。
數(shù)據(jù)指所傳輸?shù)臉I(yè)務(wù)等內(nèi)容,數(shù)據(jù)長(zhǎng)度見(jiàn)表1,數(shù)據(jù)內(nèi)容定義如下:
a) 波特率設(shè)置:01H~0AH對(duì)應(yīng)波特率(單位為kbit/s)為2.4、4.8、9.6、14.4、19.2、28.8、38.4、57.6、76.8、115.2。
b) 設(shè)備地址設(shè)置:設(shè)備地址為00000000H~FFFFFFFFH。
c) 發(fā)射功率:00H為低功率;01H為高功率。
d) 工作頻率:433 MHz頻段,信道間隔100 kHz。
e) 發(fā)送數(shù)據(jù):發(fā)送數(shù)據(jù)長(zhǎng)度不定,最長(zhǎng)不超過(guò)254字節(jié)。
2.2.2 USART初始化
初始化USART操作包括波特率設(shè)置、數(shù)據(jù)格式和UCSRB寄存器設(shè)置。USART的波特率寄存器UBRR和降序計(jì)數(shù)器相連接,一起構(gòu)成可編程的預(yù)分頻器或波特率發(fā)生器。UBRR值的計(jì)算由該公式完成:UBRR=fosc/(16baud)-1,其中Baud為波特率,fosc為系統(tǒng)時(shí)鐘頻率。通過(guò)設(shè)置UCSRC寄存器,設(shè)置數(shù)據(jù)格式為8位數(shù)據(jù)位和1位停止位。通過(guò)設(shè)置UCSRB寄存器,使能串口發(fā)送和接收,并響應(yīng)接收完成中斷。
2.2.3 數(shù)據(jù)發(fā)送和接收
數(shù)據(jù)發(fā)送采用查詢方式。置位UCSRB寄存器的發(fā)送允許位TXEN將使能USART的數(shù)據(jù)發(fā)送,將需要發(fā)送的數(shù)據(jù)加載到發(fā)送緩沖區(qū)將啟動(dòng)數(shù)據(jù)發(fā)送,加載過(guò)程為CPU對(duì)UDR寄存器的寫操作。發(fā)送數(shù)據(jù)時(shí),按照幀格式在所需發(fā)送的數(shù)據(jù)前加上幀頭、幀長(zhǎng)、幀標(biāo)志組幀發(fā)送。
數(shù)據(jù)接收采用中斷方式。置位UCSRB寄存器的接收允許位RXEN將啟動(dòng)USART的數(shù)據(jù)接收器,通過(guò)讀取UDR寄存器就可以獲得接收緩沖器的內(nèi)容。接收數(shù)據(jù)時(shí),幀標(biāo)志有效才能開始接收一幀數(shù)據(jù),并根據(jù)讀出的幀長(zhǎng)信息完成接收規(guī)定長(zhǎng)度的數(shù)據(jù)。
2.3 SPI接口軟件設(shè)汁
本設(shè)計(jì)中SPI配置為主機(jī)模式,nRF905為從設(shè)備。SPI波特率最高可設(shè)置為1/2系統(tǒng)時(shí)鐘,系統(tǒng)時(shí)鐘為8 MHz,因此SPI速率可達(dá)4 MHz。此外,正確選擇SPI的工作模式對(duì)SPI數(shù)據(jù)傳輸非常重要,AT-mega16的SCK的相位和極性有4種組合,SPI工作模式由CPOL、CPHA設(shè)置,根據(jù)nRF905的SPI讀寫時(shí)序,ATmega16的SPI工作模式應(yīng)設(shè)置為模式0。
ATmega16與nRF905同時(shí)進(jìn)行雙向數(shù)據(jù)傳輸。ATmega16配置為SPI主機(jī)時(shí),SPI接口不自動(dòng)控制SS引腳,由用戶軟件來(lái)控制。ATmega16通過(guò)將從機(jī)的CSN引腳置低實(shí)現(xiàn)與從機(jī)的同步。SPI時(shí)鐘由寫入到SPI發(fā)送緩沖寄存器的數(shù)據(jù)啟動(dòng),SPI MOSI引腳上的數(shù)據(jù)發(fā)送次序由寄存器SPCR的DORD位控制,置位時(shí)數(shù)據(jù)的LSB(最低位)首先發(fā)送,否則數(shù)據(jù)的MSB(最高位)首先發(fā)送。我們選擇先發(fā)送MSB,同時(shí)接收到的數(shù)據(jù)傳送到接收緩沖寄存器,CPU進(jìn)行右對(duì)齊從接收緩沖器中讀取接收到的數(shù)據(jù)。應(yīng)該注意,當(dāng)需要從nRF905中讀取多個(gè)數(shù)據(jù)時(shí),即使nRF905并不需要ATmega16串行輸出的數(shù)據(jù),每讀取一個(gè)數(shù)據(jù)前都要向SPI發(fā)送緩沖器寫一個(gè)數(shù)據(jù)以啟動(dòng)SPI接口時(shí)鐘。由于SPI系統(tǒng)的發(fā)送方向只有1個(gè)緩沖器,而在接收方向有2個(gè)緩沖器,所以在發(fā)送時(shí)一定要等到移位過(guò)程全部結(jié)束后,才能對(duì)SPI數(shù)據(jù)寄存器執(zhí)行寫操作;而在接收數(shù)據(jù)時(shí),需要在下一個(gè)字節(jié)移位過(guò)程結(jié)束之前通過(guò)訪問(wèn)SPI數(shù)據(jù)寄存器讀取當(dāng)前接收到的數(shù)據(jù),否則第1個(gè)數(shù)據(jù)丟失。
2.4 nRF905配置及收發(fā)流程
對(duì)nRF905寄存器的操作是一個(gè)很關(guān)鍵的問(wèn)題,nRF905的所有配置都是通過(guò)SPI接口進(jìn)行的。nRF905的SPI接口只有在掉電模式和standby模式是激活的。當(dāng)CSN為低時(shí),SPI接口開始等待一條指令,任何一條新指令均由CSN由高到低的轉(zhuǎn)換開始。
nRF905發(fā)送模式工作過(guò)程如下:
a) 當(dāng)ATmega16發(fā)送數(shù)據(jù)時(shí),將接收設(shè)備地址和所要發(fā)送的數(shù)據(jù)通過(guò)SPI接口寫入nRF905,SPI傳輸速率由初始化設(shè)置。
b) 置位TRX_CE、TX_EN,激活nRF905發(fā)送模式。
c) nRF905自動(dòng)完成數(shù)據(jù)打包(加入前導(dǎo)碼和CRC),包經(jīng)過(guò)GFSK調(diào)制以100 kbit/s發(fā)送,當(dāng)傳輸完畢DR置位。
d) 如果將AUTO_RETRAN位置高,nRF905將連續(xù)發(fā)送數(shù)據(jù)包,直至將TRX_CE引腳復(fù)位。
e) 當(dāng)TRX_CE引腳被設(shè)置為低時(shí),nRF905結(jié)束發(fā)送模式,并進(jìn)入standby模式。
nRF905接收模式工作過(guò)程如下:
a) 將TRX_CE置位,TX_EN復(fù)位后650μs,nRF005進(jìn)入接收模式等待數(shù)據(jù)到來(lái)。
b) 當(dāng)nRF905在接收信號(hào)檢測(cè)到載波,則CD(carrier detect)引腳置位;然后,如果接收到有效地址則AM(address match)置位,最后將接收到的有效數(shù)據(jù)包去掉前導(dǎo)碼、地址,CRC正確后,將DR(data ready)引腳置位。
c) CPU復(fù)位TRX_CE引腳,使nRF905進(jìn)入空閑模式,然后通過(guò)SPI接口讀取數(shù)據(jù)。
d) 數(shù)據(jù)接收完畢后,nRF905 DR和AM引腳復(fù)位并準(zhǔn)備進(jìn)入下一個(gè)工作模式。
應(yīng)該注意的是,在數(shù)據(jù)發(fā)送過(guò)程中無(wú)論將TRX_CE、TX_EN怎樣設(shè)置,nRF905都會(huì)完成此次發(fā)送而不受影響,此后,進(jìn)八所設(shè)置的工作模式。而在接收數(shù)據(jù)包的過(guò)程中TRX_CE或TX_EN狀態(tài)改變,則nRF905會(huì)立即改變工作模式,丟失數(shù)據(jù)。
2.5 主程序流程
主程序流程圖如圖4所示。
3 結(jié)束語(yǔ)
我們采用 nRF905射頻收發(fā)芯片和ATmega16微控制器設(shè)計(jì)了短距離無(wú)線數(shù)據(jù)傳輸設(shè)備,完成硬件電路和系統(tǒng)軟件調(diào)試后,進(jìn)行了無(wú)線數(shù)據(jù)收發(fā)實(shí)驗(yàn)。實(shí)驗(yàn)結(jié)果表明,在300 m通信距離,該無(wú)線傳輸設(shè)備工作穩(wěn)定,能實(shí)現(xiàn)數(shù)據(jù)的高速有效傳輸,具有低功耗、抗干擾能力強(qiáng)等優(yōu)點(diǎn)。
評(píng)論