錢光明 康日 鄧朝豐



摘要:nRF52840是NORDIC公司近年推出的一個無線芯片,具有CORTEX-M4內核,支持多種接口和無線協議。該文基于該芯片設計了一個2.4GHz教學演示實驗,幾個從節點首先與一個主節點同步,然后在各自的時槽內向主節點發送數據包。文中給出了收發程序的詳細設計,意在幫助學生盡快地熟悉這一芯片,盡快入門。
關鍵詞:時槽;任務;事件;主節點;從節點
中圖分類號:TP3? ? ? ? ? ?文獻標識碼:A
文章編號:1009-3044(2021)04-0234-03
Abstract: nRF52840 is a wireless chip in recent years. With a CORTEX-M4 core, it supports many interfaces and several wireless protocols. In this paper, a 2.4GHz teaching demonstration experiment is designed with this chip. First, several slave nodes get synchronized with a master node, then send packets to the master in their own time slots. The detailed design of transmitting and receiving program is presented to help students get familiar with this chip and get started as quickly as possible.
Key words: time slot; task; event; master node; slave node
1引言
從nRF24L01到nRF52840,NORDIC推出了一系列無線收發芯片。在nRF52840中,包括CORTEX-M4內核和無線收發模塊,支持多種接口,支持藍牙和IEEE 802.15.4等多種無線結構[1]。但是,開發者要使用和熟悉nRF52840,還是需要花費時間的,尤其是官方提供的固件程序。該芯片與以往nRF24L01相比,無線收發的具體實現和有關的命名,都有了很大的不同[1-2]。本文使用淘寶網購的nRF52840硬件模塊[3],每一個模塊充當一個無線節點,一個主節點,幾個從節點。設計了一個傳統的2.4GHz收發包演示實驗[4],即從節點在獲得與主節點同步后,在各自的時槽內,向主節點發送各自的數據包。該實驗在芯片硬件和官方基本固件程序的基礎上進行設計,不使用其他軟件模塊和第三方程序,從而有利于熟悉芯片的工作原理,把握底層運行指標。
2 nRF52840的2.4GHz無線狀態轉換圖
nRF52840遵循圖1來進行2.4GHz無線收發[1]。圖中的英文名詞可分為三類。
第一類是每一個方框中的名詞,代表狀態,例如TX代表發送狀態。一共有九個狀態:TXDISABLE(發送取消狀態),RXDISABLE(接收取消狀態),DISABLED(已取消狀態),TXRU(發送準備狀態),RXRU(接收準備狀態),TXIDLE(發送空閑狀態),RXIDLE(接收空閑狀態),TX(發送狀態),RX(接收狀態)。
第二類是方框外帶斜杠的名詞,代表事件(EVENT)或稱事件標志。一共有三類事件:/DISABLED(已取消事件),/READY(準備好事件),/END(結束事件)。
第三類是方框外不帶斜杠的名詞,代表任務(TASK)或稱命令。一共有五類任務:DISABLE(取消任務),TXEN(發送準備任務),RXEN(接收準備任務),START(啟動任務),STOP(停止任務)。注意這里的“任務”,實際上是一種命令,它與操作系統中的“任務”概念非常不同。
在本文下面的程序中,會有這些狀態、任務和事件的使用舉例。
3 同步數據包的發送和接收
為使得每個從節點不沖突,只在各自的時槽中發包,必須先同步。所有從節點復位后,首先處于接收狀態。然后復位主節點,由主節點發出同步數據包beacon。
這里,先明確一下實驗中的收發次序:主節點發beacon,所有從節點接收。beacon完畢后,進入時槽1,從節點1發數據包1,主節點收;時槽1完畢后,進入時槽2,從節點2發數據包2,主節點收;后面的時槽以此類推。實驗中,每個時槽寬度設為1600μs。
圖2是主節點發beacon的程序段。圖中,為了使printf 語句能正常使用,并通過串口調試助手在PC機上輸出有關信息,那么,在初始化階段需要設置好串口,我們使用官方提供的函數APP_UART_FIFO_INIT來完成。
接下來,本程序段中的packet_build_send函數用于準備包、發包、并等待包發送完畢。準備在存儲器中的數據包(數組packet存放)需要由S0、LENGTH、S1和PAYLOAD這四個部分組成,其中S0域、S1域和LENGTH域都是可選的,這三個域加上數據域PAYLOAD,總長不超過258個字節。LENGTH域一般用來表示數據域PAYLOAD的長度(字節數)。本實驗中,不設S0域和S1域,LENGTH域為一個字節,設為255,而PAYLOAD則為255個字節。
我們將PAYLOAD的首字節設為nodenum,代表發包節點的編號,主節點編號為0。從節點1的編號為1,從節點2的編號為2,以此類推。包數組packet中,packet[0]=LENGTH,packet[1]=nodenum。
packet_build_send函數中先準備好一個包(充當beacon),然后將包地址賦給NRF_RADIO->PACKETPTR這一指針,接下來按圖3的順序發包并等待發送結束。圖3中,先發出TXEN任務,然后等待/READY事件。再發出START任務,然后等待/END事件。一旦出現/END事件,就表明發送完畢。
再回到圖2。radio_disable函數中,會通過DISABLE任務,使模塊回到DISABLED狀態。然后,prepare_for_receive函數為接收數據包做準備,該函數主要是發出RXEN任務,并等待/READY事件。接下來,調用nrfx_timer_enable函數,以啟動定時器TIMER_LED0,進入時槽1。該定時器的定時周期,就定為時槽的寬度。當然,需要先初始化該定時器,主要利用nrfx_timer_us_to_ticks函數將時槽寬度1600μs轉換為ticks,另外,還需在TIMER_LED0所配備的事件處理函數timer_led_event_handler0中,將時槽控制變量slotend加1。
對于從節點,其接收beacon的程序段則如圖4所示。prepare_for_receive函數為接收beacon做好了準備,接著,發出START任務,進入RX接收狀態,并等待/END事件標志。/END一旦變為1,則說明收到了一個包。如果CRCSTATUS為1(說明CRC校驗正確)且packet[1]=0(說明該包來自主節點master),就認為正確收到了beacon,便通過nrfx_timer_enable函數,啟動定時器TIMER_LED1,進入時槽1。當然,TIMER_LED1也需要初始化,定時周期也是1600μs。如果CRCSTATUS和packet[1]都出錯,說明收到的不是正確的beacon,程序則回到loop位置,繼續接收。
4 從節點輪流發包
進入時槽1后,從節點1發包,主節點接收。從節點發包的程序段如圖5所示。slotnum++的結果,在時槽1中為1,時槽2中為2,以此類推。顯然,slotnum的值代表時槽的編號。任何一個時槽中,從節點發包都用圖5。對于從節點1,其節點編號nodenum=1,從圖中的if語句可知:只有當nodenum和slotnum相等,即節點編號和時槽編號相等時,發包函數packet_build_send才會被調用。該發包函數準備數據包時,會將nodenum賦值給packet[1]。
現在看看時槽控制變量slotend的使用。每個時槽開始時,slotend=0。定時周期1600μs后,通過中斷,TIMER_LED1所配備的事件處理函數timer_led_event_handler1被調用,該函數中slotend將被置為1,表明一個時槽的時間結束。
從時槽1開始,主節點接收數據包的程序段如圖6所示。主節點的定時器命名為TIMER_LED0,如前所述,其定時周期也是1600μs,時槽控制變量slotend的用法與圖5相同。圖6中,一開始主節點發出START任務,進入RX接收狀態,等待從節點發包。當/END事件到來時,表明收到了包,進一步判斷該包是否正確(CRC檢查),是不是想要的包(nodenum和slotnum是否相等),并用printf語句輸出相關信息。無論是否收到數據包,也無論收到的包正確與否,都要等待時槽結束,一旦slotend=1,就進入下一時槽。
收發雙方的時間一定要注意配合。圖中每一個語句的執行都需要時間,尤其是printf語句,輸出信息越長,耗時就越長。所以,如果要增加發送方或接收方printf的輸出信息,則需細心調試。要保證發送方發出數據時,接收方一定要已經準備好。
5結束語
有些程序段在上面并未列出,其中主要有串口的初始化和定時器的有關函數,實驗者可依據官方和商家有關資料,先學會這兩方面的知識。上述實驗演示效果良好,在此基礎上,可以進一步改進和加深。例如,beacon的包可以短一些,從節點可以采用競爭方式發包,發包數據可以嘗試加密等。
參考文獻:
[1] nRF52840 Product Specification v1.1[Z], 2019. https://infocenter.nordicsemi.com/index.jsp
[2] nRF24L01+Product Specification v1.0[Z], 2008. https://infocenter.nordicsemi.com/index.jsp
[3] nRF52840 Eval Kit 用戶手冊 v1.0.2[Z], 2019. https://www.waveshare.net/w/upload/a/a8/NRF52840-Eval-Kit-user-manual-cn.pdf.
[4] 錢光明,易超.短距離無線網的一個教學實驗設計[J].計算機時代,2020,27(6): 109-111.
【通聯編輯:代影】