1、什么是nRF24L01
nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。有着极低的电流消耗。 无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。
nRF24L01与5V单片机的连接通过SPI接口进行通讯,输出功率频道选择和协议的设置可以通过SPI 接口进行设置,几乎可以连接到各种单片机芯片,并完成无线数据传送工作。
2、接口电路
VCC脚接电压范围1.9V~3.6V,超过3.6V将会烧毁模块。一般电压3.3V左右。除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。
nRF24L01无线模块 nRF24L01芯片
3、引脚说明
通过以下六个引脚,便可实现模块的所有功能: (1)MOSI:主器件数据输出,从器件数据输入 (2)MISO:主器件数据输入,从器件数据输出 (3)SCLK:时钟信号,由主器件产生 (4) CSN :从器件使能信号(片选线) (5)CE:芯片使能,使能器件的发送模式或者接收模式。高电平有效,在发送和接收过程中都要将这个引脚拉高, (6)IRQ:中断信号线,中断输出。低电平有效,中断时变为低电平,在以下三种情况变低:Tx FIFO 发完并且收到ACK(使能ACK情况下)、Rx FIFO收到数据、达到最大重发次数。
通过 SPI 接口,可激活在数据寄存器 FIFO 中的数据,或者通过 SPI 命令访问寄存器。 在待机或掉电模式下,单片机通过 SPI 接口配置模块; 在发射或接收模式下,单片机通过 SPI 接口接收或发射数据。
4、工作模式:
工作模式由 CE 和 PWR_UP (CONFIG寄存器第1位)、 PRIM_RX(CONFIG寄存器第0位) 两寄存器共同操纵: 也可以理解为NRF2401有工作模式有四种: 收发模式,配置模式,空闲模式,关机模式
收发模式有Enhanced ShockBurstTM收发模式、ShockBurstTM收发模式和直接收发模式三种。只有Enhanced ShockBurstTM收发模式支持自动ACK和自动重发,开启自动ACK,则默认选择Enhanced模式。
Enhanced ShockBurstTM收发模式(常用) NRF24L01自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,在发送模式下,置CE为高,至少10us,将使能发送过程。 ShockBurstTM收发模式 发送方要求终端设备在接收到数据后有应答信号,以便发送方检测有无数据丢失,一旦丢失则重发数据。数据重发设置寄存器可设置其重发次数及在未收到应答信号后等待重发的时间。 直接收发模式 工作在该模式下的nRF2401 就像传统的射频器件一样。数据必须是在传输频率为1Mbps、250kbps 或者低频状态进行设定,以保证接收机能探测到信号。
在接收模式下,最多可以接收6路不同的数据。每一个数据通道使用不同的地址,但是共用相同的频道。也就是说6 个不同的NRF24L01设置为发送模式后可以与同一个设置为接收模式的NRF24L01 进行通讯,而设置为接收模式的NRF24L01可以对这6个发射端进行识别。 数据通道0是唯一的一个可以配置为40位自身地址的数据通道;而数据通道1~5 都为8位自身地址和32位公用地址(由通道1设置)。所有的数据通道都可以设置为Enhanced ShockBurst 模式。
在接收端,确认收到数据后记录地址,并以此地址为目标地址发送应答信号。在发送端,通道0被用作接收应答信号,因此通道0的接收地址要与发送地址端地址相等,以确保接收到正确的应答信号。 配置模式 15 字节的配置字会在配置模式时下载到nRF2401 中,CE为0才能配置。 空闲模式(睡眠/待机模式):用来减小平均电流的损耗,在该模式下,晶体振荡器处于部分工作状态,电流损耗由晶体振荡器频率决定。在待机模式期间,寄存器配置字内容保持不变。 掉电模式:nRF20L01 各功能关闭,保持电流消耗最小。该模式下,nRF24L01 停止工作,当设备达不到最小的电流损耗或最大电量枯竭时,设备就会进入掉电模式。
5、发送
Enhanced ShockBurstTM发送流程 1.把地址和要发送的数据按时序送入NRF24L01; 2.配置CONFIG寄存器,使之进入发送模式; 3.微控制器把CE置高(至少10us),激发Enhanced ShockBurstTM发射; 4.Enhanced ShockBurstTM发射: ①给射频前端供电; ②射频数据打包(加字头、CRC校验码); ③高速发射数据包; ④发射完成,NRF24L01进入空闲状态。
Enhanced ShockBurstTM发送模式初始化 发射模式Tx模式初始化过程 1))写Tx节点的地址 TX_ADDR 2)写Rx节点的地址RX_ADDR_P0(主要是为了使能 Auto Ack) 3)使能AUTO ACK EN_AA 4)使能PIPE 0 EN_RXADDR 5)配置自动重发次数SETUP_RETR 6)选择通信频率RF_CH。频率计算公式:2400+RF_CH (Mhz) 7)配置发射参数RF_SETUP(低噪放大器增益、发射功率、无线速率) 8 )选择通道0有效数据宽度Rx_Pw_P0 9)配置24L01的基本参数以及切换工作模式CONFIG。
6、接收
Enhanced ShockBurstTM接收流程 1.配置接收地址和要接收的数据包大小; 2.配置CONFIG寄存器,使之进入接收模式,把CE置高; 3. 130us后,NRF24LO1进入监视状态,等待数据包的到来; 4.当接收到正确的数据包(正确的地址和CRC校验码),NRF2401自动把字头、地址和CRC校验位移去; 5.NRF24LO1通过把STATUS寄存器的RX_DR置位(STATUS一般引起微控制器中断)通知微控制器; 6.微控制器把数据从FIFO读出(0X61指令); 7.所有数据读取完毕后,可以清除STATUS寄存器。进入四种主要的模式之—。
Enhanced ShockBurstTM接收模式初始化 1)写Rx节点的地址RX_ADDR_P0 2)使能AUTO ACK EN_AA 3)使能PIPE 0 EN_RXADDR 4)选择通信频率RF_CH 5)选择通道0有效数据宽度RX_PW_P0 6)配置发射参数RF_SETUP(低噪放大器增益、发射功率、无线速率) 7)配置24L01的基本参数以及切换工作模式CONFIG。
7、SPI指令
所有的 SPI 指令均在当 CSN 由低到高开始跳变时执行;从 MOSI 写命令的同时, MISO实时返回 24L01 的状态值; SPI 指令由命令字节和数据字节两部分组成。
8、寄存器内容及说明
在写寄存器之前,一定要进入待机模式或掉电模式。
9、主要函数
初始化NRF24L01到TX模式
void NRF24L01_TX_Mode(void)
{
NRF2401_CSN_HIGH;
Delay_us(10);
NRF2401_SCK_LOW;
SPI_Write_Buf(NRF24L01_WRITE_REG + TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,TxBuf,TX_PLOAD_WIDTH);
SPI_RW_Reg(FLUSH_TX,0xFF);
SPI_RW_Reg(NRF24L01_WRITE_REG + STATUS,0X70);
SPI_RW_Reg(NRF24L01_WRITE_REG + EN_AA, 0x00);
SPI_RW_Reg(NRF24L01_WRITE_REG + EN_RXADDR, 0x01);
SPI_RW_Reg(NRF24L01_WRITE_REG + SETUP_RETR, 0x00);
SPI_RW_Reg(NRF24L01_WRITE_REG + RF_CH, 0x00);
SPI_RW_Reg(NRF24L01_WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0E);
EXTI_ClearITPendingBit(EXTI_Line8);
NRF2401_CE_HIGH;
Delay_us(130);
}
初始化NRF24L01到RX模式
void NRF24L01_RX_Mode(void)
{
NRF2401_CSN_HIGH;
Delay_us(10);
NRF2401_SCK_LOW;
SPI_Write_Buf(NRF24L01_WRITE_REG + TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);
SPI_RW_Reg(FLUSH_RX,0xFF);
SPI_RW_Reg(NRF24L01_WRITE_REG + EN_AA, 0x00);
SPI_RW_Reg(NRF24L01_WRITE_REG + EN_RXADDR, 0x01);
SPI_RW_Reg(NRF24L01_WRITE_REG + RF_CH, 0x00);
SPI_RW_Reg(NRF24L01_WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_RW_Reg(NRF24L01_WRITE_REG + RF_SETUP, 0x07);
SPI_RW_Reg(NRF24L01_WRITE_REG + CONFIG, 0x0f);
NRF2401_CE_HIGH;
Delay_us(130);
}
发送数据函数
unsigned char NRF24L01_TxPacket(u8 *tx_buf)
{
u8 sta;
EXTI->IMR&=~(EXTI_Line8);
NRF2401_CE_LOW;
SPI_Write_Buf(NRF24L01_WRITE_REG + RX_ADDR_P0,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
NRF2401_CE_HIGH;
Delay_us(10);
while(GPIO_ReadInputDataBit(NRF2401_IRQ_PORT,NRF2401_IRQ_PIN));
sta = SPI_Read(STATUS);
SPI_RW_Reg(FLUSH_TX,0xff);
SPI_RW_Reg(NRF24L01_WRITE_REG + STATUS, sta);
if(sta&STATUS_MAX)
{
SPI_RW_Reg(FLUSH_TX,0xff);
EXTI->IMR|=EXTI_Line8;
return STATUS_MAX;
}
if(sta&STATUS_TX)
{
EXTI->IMR|=EXTI_Line8;
return STATUS_TX;
}
EXTI->IMR|=EXTI_Line8;
return 0xff;
}
接收数据函数
unsigned char NRF24L01_RxPacket(u8 *rx_buf)
{
u8 revale=0,sta=0;
sta=SPI_Read(STATUS);
if(sta&STATUS_RX)
{
NRF2401_CE_LOW ;
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
revale =1;
SPI_RW_Reg(NRF24L01_WRITE_REG+STATUS,sta);
SPI_RW_Reg(FLUSH_RX,0xff);
NRF2401_CE_HIGH;
}
return revale;
}
此外,还应有系统的初始化,主要有GPIO初始化,SPI初始化,NRF24L01中断初始化。
在GPIO初始化中,需要注意各引脚的工作模式: SPI时钟,设置为复用推挽输出 SPI输出引脚(SOMI),设置为复用推挽输出 SPI输入引脚(SOMO),设置为悬浮输入 CS、CE引脚,使用软件控制,所以直接设置成推挽输出
|