钱光明 康日 邓朝丰
摘要: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.
【通联编辑:代影】