基于nRF24L01芯片的近程无线通信系统设计

时间:2022-08-19 03:44:41

基于nRF24L01芯片的近程无线通信系统设计

摘 要: 介绍一种基于STC89C52单片机STM32系列MCU和无线射频收发芯片nrf24l01无线通信系统设计,描述了nRF24L01的主要引脚特性具体应用SPI指令,详细阐述了在Enhanced ShockBurst模式下的配置方法,同时给出了根据nRF24L01的SPI时序用通用IO口模拟SPI接口和配置STM32系列MCU硬件SPI接口的详细说明。

关键词: nRF24L01; STM32; STC89C52; Enhanced ShockBurst模式; SPI指令

中图分类号: TN919?34 文献标识码: A 文章编号: 1004?373X(2014)15?0032?03

Design for short?range wireless communication system based on chip nRF24L01

LI He, CHENG Xiang, ZENG Ling?guo

(School of Mechanical Engineering, Shandong University of Technology, Zibo 250200, China)

Abstract: Design for a wireless communication system based on STC89C52, MCU in STM32F103 series and wireless RF transcieving chip nRF24L01 is introduced in this paper. The main pin characteristics, concrete applications and SPI instructions are described. The configuration method in Enhanced ShockBurst mode is elaborated. The metnods to simulate SPI by using the general IO interface according to SPI time sequence of nRF24L01and configure STM32 hardware SPI are given.

Keywords: nRF24L01; STM32; STC89C52; Enhanced ShockBurst mode; SPI instruction

0 引 言

在有线数据通信系统中,数据的传输需要依赖于电缆,布线复杂,成本高,工作量大,操作不方便,采用无线数据通信方式可以克服以上缺点。nRF24L01是Nordic公司推出的一款工作在2.4~2.48 GHz ISM频段的单片无线射频收发器件,数据传输速率可达到2 Mb/s,内置频率发生器Enhanced ShockBurst模式控制器功率放大器等,只需要少量的器件就可以组成射频收发电路[1]。nRF24L01操作简单,用户只需要通过它的一个标准SPI接口和规定的SPI配置字就可以方便地实现对它的控制。

1 Enhanced ShockBurst模式工作原理

nRF24L01被设置为接收模式时,可以同时接收6路不同数据通道的数据,每个通道都有各自的地址但6路通道采用相同的频率[2]。也就是说,配置为接收模式的nRF24L01可以同时接收6个不同的nRF24L01发送的数据,接收端每个通道的地址要与相应发送端TX_ADDR内容相同。每一路通道都可以被设置为Enhanced ShockBurst模式,成功接收数据后记录地址并以此地址作为目标地址自动发送应答信号。

nRF24L01被设置为Enhanced ShockBurst发送模式时,数据发送完毕后会自动跳转到接收模式使用数据通道0等待接收端的应答信号,若接收到应答信号,则将TX_DS标志位硬件置高,表示数据发送完成并产生中断,此时需要向STATUS寄存器的TX_DS位以软件方式写1,清除中断标志;

若未接收到应答信号将继续发送数据,直到发送数据次数达到软件设置的最大重发次数后,nRF24L01会将MAX_RT位硬件置高,产生最大重发次数中断[3]。这种数据处理模式使得开发人员无需单独处理双向链接协议,编程方便。

2 SPI指令

外部MCU对nRF24L01所有寄存器的访问都是通过SPI指令完成的,一条SPI指令包括命令字和数据字节,每一条SPI指令的执行都必须伴随片选信号CSN由高电平到低电平的突变,同时STATUS寄存器的内容将通过MISO引脚串行移出,在CSN保持为低电平时完成数据字节的写入或读取。

nRF24L01是通过一个SPI接口与MCU相连的,对于没有硬件SPI接口的控制器,需要使用通用IO口模拟[3]。这里给出了用51单片机IO口模拟SPI对nRF24L01的数据读写函数。函数是根据nRF24L01的SPI时序编写的。

图1和图2给出了nRF24L01的SPI读写时序,在每个时钟脉冲的上升沿完成一个数据位的存取,循环8次后完成一个字节的存取。第一个送入nRF24L01的字节是命令字,通过MOSI串行移入,高位在前低位在后,同时STATUS寄存器内容通过MISO串行移出[4],随后分别是数据字节的写入和读出。以读数据为例,读寄存器命令写入nRF24L01后,MCU可以向MOSI写任意字节即可从MISO读出相应寄存器的内容。

uchar Spi_RW(uchar byte)

{

uchar i;

for(i=0;i

{

MOSI=(byte&0x80);

byte=byte

SCK=1;

byte=byte|MISO;

SCK=0;

}

return byte;

}

3 系统设计

本文设计的系统流程图如图3所示。

图3 软件流程图

初始化STC89C52并将nRF24L01初始化为Enhanced ShockBurst发送模式,单片机上电后开始发送数据,若产生TX_DS中断则数据发送成功并继续发送数据;若产生MAX中断则数据超过最大重发次数,清空FIFO寄存器重新发送数据[5]。

初始化STM32F103,将nRF24L01初始化为Enhanced ShockBurst接收模式,等待接收数据,接收到数据后产生中断,进入中断服务程序,判断TX_DS位是否置1,若置1则清除中断标志并读取数据,将读取到的数据通过串口发送给上位机;否则清除中断标志后继续等待接收数据。下面给出对nRF24L01的具体操作方法:

void NRF24L01_Init(u8 model)

{

SPI_CE_L(); //CE引脚置低,进入待机模式

Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,RX_ADDRESS,RX_ADR_WIDTH); //写RX节点地址

Write_Reg(NRF_WRITE_REG+EN_AA,0x01);

//使能通道0的自动应答

Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址

Write_Reg(NRF_WRITE_REG+RF_CH,40); //设置RF通道为CHANAL

Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);

//设置TX发射参数,0 dB增益,2 Mb/s,低噪声增益开启

if(model==RXMODE)

//进入接收模式

{

Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH); //选择通道0的有效数据宽度

Write_Reg(NRF_WRITE_REG + CONFIG, 0x0f);

// IRQ收发完成中断开启,16位CRC校验,接收模式

}

else if(model==TXMODE) //进入发送模式

{

Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);

//设置自动重发间隔时间:500 μs;最大自动重发次数:10次

Write_Buf(NRF_WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //写TX节点地址

Write_Reg(NRF_WRITE_REG + CONFIG, 0x0e);

// IRQ收发完成中断开启,16位CRC校验,发送模式

}

这是nRF24L01的初始化函数,根据需要选择工作在接收模式还是发射模式。本文中nRF24L01采用数据处理方式是Enhanced ShockBurst模式,所以必须使能数据通道的自动应答功能并设置重发间隔时间和最大重发次数。发射端和中断在配置工作通道频率发射功率和数据传输速率时必须完全相同[3]。

uchar Write_Reg(uchar reg, uchar value)

{

uchar status;

SPI_CSN_L(); /*选通SPI接口*/

status = Spi_RW(reg);

/*写寄存器地址同时读取状态寄存器内容*/

Spi_RW(value); /*写数据*/

SPI_CSN_H(); /*禁止该SPI接口*/

return status; /*返回状态寄存器内容*/

}

这个函数用于向地址为reg的寄存器中写入一个字节的数据value并返回状态寄存器内容,实际上reg是由写寄存器指令0x20与寄存器地址共同组成的。

ucharRead_Reg(uint8_t reg)

{

uchar reg_val;

SPI_CSN_L(); /*选通SPI接口*/

Spi_RW(reg); /*写寄存器地址*/

reg_val = Spi_RW(0); /*读取该寄存器返回数据*/

SPI_CSN_H(); /*禁止该SPI接口*/

return reg_val;

}

这个函数用于从地址为reg的寄存器中读出一个字节的数据reg_val,实际上reg是由读寄存器指令0x00与寄存器地址共同组成的。

uchar Write_Buf(uchar reg, uchar*pBuf, uchar count)

{

uint8_t i;

uint8_t status;

SPI_CSN_L(); /*选通SPI接口*/

status = Spi_RW(reg); /*写寄存器地址*/

for(i=0; i

{

Spi_RW(pBuf[i]); /*写数据*/

}

SPI_CSN_H(); /*禁止该SPI接口*/

return status;

}

这个函数的作用是向地址为reg的寄存器中写入大小为count的数组,数组的首地址为pBuf,需要注意的是,当读写多字节寄存器时,首先读写低字节再读写高字节。从寄存器读取多字节函数实现与此类似,本文不再赘述。

经验证,在上位机串口通信助手中成功显示所发数据,本系统可行。

4 结 语

本文介绍了nRF24L01芯片在Enhanced ShockBurst数据处理模式下的工作原理,详细介绍了如何根据它的SPI时序模拟SPI接口。设计了一种基于STM32,STC89C52MCU和nRF24L01芯片的近距离无线通信系统,经调试,STM32终端成功接收数据并通过串口成功地将数据发送给上位机。可以根据需要(有无SPI接口,通信距离远近等)对本系统的软件进行移植,只需做少量修改即可。需要注意,nRF24L01的工作电压是1.9~3.6 V,51单片机的[VCC]是5 V,因此需要电平转换,因设计简单,本文没有详细介绍。

注:本文通讯作者为程祥。

参考文献

[1] 时志云,盖建平,王代华,等.新型高速无线射频器件nRF24L01及其应用[J].国外电子元器件,2007(8):42?44.

[2] Nordic Semiconductor. nRF24L01 datasheet [R]. [S.l.]: Nordic Semiconductor, 2009.

[3] 朱慧彦,林林.基于MCU和nRF24L01的无线通信系统设计[J].电子科技,2012(4):81?83.

[4] 刘靖,陈在平,李其林.基于nRF24L01无线数字传输系统[J].天津理工大学学报,2007(3):38?40.

[5] 荚庆,王代华,张志杰.基于nRF24L01的无线数据传输系统[J].现代电子技术,2008,31(3):68?70.

[6] 卢明,刘黎辉.基于nRF24L01的数控机床无线手轮设计[J].现代电子技术,2013,36(7):103?106.

上一篇:基于Wigner?Hough的合成孔径雷达信号处理 下一篇:具有优越陷波选择性和带宽的超宽带缝隙天线