第十七章 金龙107——NRF24L01实验
17.1、NRF24L01简介:nRF24L01是一款新型单片射频收发器件无线模块,工作全球免申请2.4 GHz~2.5 GHz ISM频段,最大发射功率0dBm(1mW)。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。 主要特性: 1)支持六路通道的数据接收 2)低工作电压:1.9-3.6V低电压工作 3)高速率:2Mbps(软件设置1Mbps或2Mbps) 4)多点频:125频点,满足多点通信和调频通信需要(2400+RF_CH) 5)nRF24L01集成了所有与RF协议相关的高速信号处理部分 6)SPI接口可以方便和单片机进行通信 如上图,nRF24L01与单片机的接口,具体功能如下表描述 17.2、工作模式:nRF24L01有四种工作模式: 收发模式 配置模式 空闲模式 关机模式 数据发射:发射数据时,首先将nRF24L01配置为发射模式:接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接收节点地址TX_ADDR一致)。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX FIFO中数据保留以便再次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。 数据接收:接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。当接收方检测到有效的地址和CRC时,就将数据包存储在RX FIFO中,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。 17.3、nRF24L01读写时序:stm32通过SPI接口对nRF24L01进行配置,具体指令及寄存器请参考手册,其指令格式如下 命令字:由高位到低位(每字节) 数据字节:低字节到高字节,每一字节高位在前 任何一条新指令均由CSN 的由高到低的转换开始,下图为SPI操作及时序。 在写寄存器之前一定要进入待机模式或掉电模式。 读操作 写操作 17.4、程序说明:本次实验使用两块金龙107开发板(带nRF24L01无线模块)进行通信,板A为主动发射端,板B为接收板。 板A:初始化完成后,进入主循环通过无线模块发送数据“abcd”。 板B:初始化完成后进入循环等待接收,接收到数据后通过串口打印数据。 如下图是stm32与nRF24L01的接口描述,其中PB3、PB4和PB5分别为SPI3的SCK、MISO和MOSI引脚,PD3接CE,PA8接CSN,PB15接可屏蔽中断引脚,实验中需要将跳线帽JP13接23脚。 17.5 程序说明:stm32对nRF24L01的配置及读写代码如下: void Init_24L01(void) { uchar Channel=0x20; uchar Status; uchar CONFIG_data; NRF24L01_Configuration(); //IO口初始化 SPI_RW_Reg(WRITE_REGL + CONFIG,0x19);//屏蔽中断使能CRC接收模式 CONFIG_data = SPI_Read(CONFIG); printf("The CONFIG_data is 0x%x",CONFIG_data); SPI_RW_Reg(WRITE_REGL + EN_AA,0x00); //禁止自动应答 SPI_RW_Reg(WRITE_REGL + EN_RXADDR,0x01);//允许接收通道0 SPI_RW_Reg(WRITE_REGL + SETUP_AW,0x03); //接收发射地址5字节 SPI_RW_Reg(WRITE_REGL + SETUP_RETR,0x00);//禁止自动重发 SPI_RW_Reg(WRITE_REGL + RF_CH,Channel);//设置工作通道频率 SPI_RW_Reg(WRITE_REGL + RF_SETUP,0x07);//传输速率1Mbps、0dBm Status = SPI_Read(RF_SETUP); printf("The STATUS is 0x%x",Status); SPI_RW_Reg(WRITE_REGL + STATUS,0x70); //清空标志位 Status = SPI_Read(STATUS); printf("The STATUS is 0x%x",Status); SPI_Write_Buf(WRITE_REGL + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); //接收通道0地址 SPI_Write_Buf(WRITE_REGL + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); //发送地址 SPI_RW_Reg(WRITE_REGL + RX_PW_P0,0x04);//接收数据通道0有效数据宽度4字节 CSN=0; SPI_RW(0xE2); //清除RX FIFO寄存器 CSN=1; CSN=0; SPI_RW(0xE1); //清除TX FIFO寄存器 CSN=1;} 17.6. 实验现象:插上串口和nRF24L01,下载程序后,重新上电,打开串口调试助手(波特率115200),板A从串口打印出来“NRF24L01 Test!”,板B从串口打印出来“Receive data is:abcd”。
【17】金龙板NRF24L01.rar
(882.44 KB, 下载次数: 7)
|