NRF52 2.4G Radio 模块
1. 2.4 GHz无线电收发器
使用2.4G Radio模块,一般是为了使用自定义的协议通讯,相比于BLE等规范协议,可以一定程度上自由的设定通讯间隔、数据包大小、私有的加密等,但也需要自己解决多连接、无线干扰等问题
Radio模块框图
1. 速率 1Mbps 2Mbps (125K 500Kbps 长距离), 2Mbps: 4us/Byte
2. 半双工, 不能同时发送和接收
3. EasyDMA让射频模块可以直接从RAM读写数据而不需要CPU的参与,但用户需要在开启START任务收发无线数据之前,将内存的地址和长度填入Radio的PACKETPTR寄存器和PCNF1.MAXLEN寄存器中
4. 1个发送通道, 8个接收通道
5. 支持Whitening和CRC校验
6. 支持获取RSSI(接收的数据信号强度指示)
7. 自动低功耗管理
空中包格式
-
PREAMBLE是前导码,除了在BLE模式2Mbps情况下是2个字节,其他情况通常是用1个字节。当ADDRESS的第一个bit是0时PREAMBLE会被设为0xAA,否则为0x55
-
空中包里,ADDRESS 和 PAYLOAD部分总是LSB,CRC部分总是MSB,S0,LENTH,S1的大小端受PCN1.ENDIAN寄存器控制。
-
ADDRESS是无线的收发地址,它由BASE和PREFIX两部分组成,只有接收端与发射端的地址匹配,才能成功通信。BASE部分的长度由FCNF1.BALEN控制,内容由BASE0和BASE1两个寄存器控制,PREFIX的内容由PREFIX0和PREFIX1两个寄存器控制,通过这两个部分的排列搭配,可以搭配出8种逻辑地址。用户在配置发送的地址时从这8个逻辑地址中挑选一个,由TXADDRESS寄存器控制,设置接收地址的时候根据需要将这写逻辑地址配置给8个接收通道,由RXADDRESSES寄存器控制,用户可以根据需要打开接收地址通道的个数,可同时打开8个接收通道。
TXADDRESS寄存器:设置值为0-7,对应选择上图中的一个逻辑地址作为发射地址
RXADDRESSES寄存器:设置值为bit0-bit7,使能对应逻辑地址作为接收地址
-
S0+LENGTH+S1+PAYLOAD+static add-on 是存储在RAM中的数据包,PACKETPTR寄存器指向的RAM空间分布应该也是这样的
-
CI、TERM1和TERM2字段仅存在于BLE远距离模式中,这里忽略
-
S0,LENGTH,S1是可选部分,它们的长度分别由PCNF0.S0LEN,PCNF0.LFLEN ,PCNF0.S1LEN决定,大小端由PCNF1.ENDIAN控制,这里S0 S1都可以设置为0,就不用管它们,LENGTH是4bit的,但也会占用一个Byte的RAM空间,所以PACKETPTR指向的发送或接收RAM对应Byte[0]即为这一包数据包的长度(STATLEN = 0下的情况)
-
上图中未显示static add-on(其长度在STATLEN中定义,标准BLE数据包中的长度为0字节)。static add-on在payload和CRC之间发送,在需求每包都为固定值,可以设置STATLEN为此固定值,否则设置0,可以让每个数据包实现动态的长度
-
PAYLOAD的最大长度由LENGTH决定,实际的长度由PACKETPTR指向的RAM Byte[0]设置
-
PCNF1.MAXLEN定义了Radio收发数据包最大字节数,限制了PAYLOAD加上static add-on的总长度,可以防止超出EasyDMA定义的RAM范围被读写
-
S0、LENGTH、S1、PAYLOAD的组合长度不能超过258字节
-
CRC是校验字段,CRC可以校验除了PREAMBLE之外的整个数据包,CRC校验的配置通过CRCCNF CRCPOLY CRCINIT寄存器完成
2. Radio工作状态机
状态 | 具体描述 |
---|---|
DISABLE | Radio模块没有进行任何操作,功耗最低 |
TXRU | Disable状态下TXEN = 1 进入TXRU,Radio正在启动 |
TXIDLE | 要发送的数据已准备好,Radio准备开始发送 |
TX | Radio正在发送数据包 |
TXDISABLE | Radio正在关闭发射机 |
RXRU | Disable状态下RXEN = 1 进入RXRU,Radio正在启动 |
RXIDLE | Radio已经准备好接收数据 |
RX | Radio处于接收数据状态 |
RXDISABLE | Radio正在关闭接收机 |
3. TX 发送状态
发送一包数据
发送一包数据,使用NRF快捷方式(shortcuts),READY事件后立即START,END事件立即DISABLE,可节省发送时间和程序判断
连续发送数据,END事件再次START
4. RX 接收状态
接收一包数据
接收一包数据,使用快捷方式
接收多包数据,END事件再次START
5. 示例代码
TX端初始化
#define RADIO_PACKET0_S1_SIZE 0 // S1 size in bits
#define RADIO_PACKET0_S0_SIZE 0 // S0 size in bits
#define RADIO_PACKET0_PAYLOAD_SIZE 5 //8 // payload size in bits
#define RADIO_PACKET1_BASE_ADDRESS_LENGTH 3 // base address length in bytes
#define RADIO_PACKET1_STATIC_LENGTH 0 // Static length in number of bytes
#define RADIO_PACKET1_MAX_PAYLOAD_LENGTH 32 // Maximum length of packet payload
void