1、广东顺德春暖花开自动化开发设计工作室 伍耀斌 NRF24L01 使用方法 一、模块引脚 二、电路原理图 广东顺德春暖花开自动化开发设计工作室 伍耀斌 三、操作流程 单片机需预留 5 个或 6 个端口给模块使用。分别为 CE、CSN、SCK、MOSI、MISO、IRQ。CE:芯片的模式控制线。在 CSN 为低的情况下,CE 协同 NRF24L01 的 CONFIG 寄存器共同决定 NRF24L01 的状态 CSN:芯片的片选线,CSN 为低电平芯片工作。SCK:芯片控制的时钟线(SPI 时钟)MOSI:芯片控制数据线(Master output slave input 主机出从机入)MISO:芯
2、片控制数据线(Master input slave output 主机入从机出)IRQ:中断信号。无线通信过程中MCU 主要是通过IRQ 与NRF24L01 进行通信。(可省略)3.1 发射:1)写Tx 节点的地址 TX_ADDR 2)写Rx 节点的地址(主要是为了使能Auto Ack)RX_ADDR_P0 3)写入需发送的数据 TxDate 4)使能AUTO ACK EN_AA 5)使能PIPE 0 EN_RXADDR 6)配置自动重发次数 SETUP_RETR 7)选择通信频率 RF_CH 8)配置发射参数(低噪放大器增益、发射功率、无线速率)RF_SETUP 9)选择通道0 有效数据宽度
3、 Rx_Pw_P0 10)配置24L01 的基本参数以及切换工作模式 CONFIG。void NRFSetTxMode(uchar*TxDate)/发送模式 CE=0;NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);/写寄存器指令+P0 地址使能指令+发送地址+地址宽度 NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);/为了应答接收设备,接收通道 0地址和发送地址相同 NRFWriteTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITD
4、H);/写入数据 TX_DATA_WITDH为数据长度 /*下面有关寄存器配置*/NRFWriteReg(W_REGISTER+EN_AA,0 x01);/使能接收通道 0 自动应答 NRFWriteReg(W_REGISTER+EN_RXADDR,0 x01);/使能接收通道 0 NRFWriteReg(W_REGISTER+SETUP_RETR,0 x0a);/自动重发延时等待 250us+86us,自动重发 10 次 NRFWriteReg(W_REGISTER+RF_CH,0 x40);/选择射频通道 0 x40 NRFWriteReg(W_REGISTER+RF_SETUP,0 x0
5、7);/数据传输率 1Mbps,发射功率 0dBm,低噪声放大器增益 NRFWriteReg(W_REGISTER+CONFIG,0 x0e);/CRC 使能,16 位 CRC 校验,上电 CE=1;delayms(5);/NRFDelay(5);/保持 10us 秒以上 广东顺德春暖花开自动化开发设计工作室 伍耀斌 3.2 接收:初始化步骤 24L01 相关寄存器 1)写Rx 节点的地址 RX_ADDR_P0 2)使能AUTO ACK EN_AA 3)使能PIPE 0 EN_RXADDR 4)选择通信频率 RF_CH 5)选择通道0 有效数据宽度 Rx_Pw_P0 6)配置发射参数(低噪放大
6、器增益、发射功率、无线速率)RF_SETUP 7)配置24L01 的基本参数以及切换工作模式 CONFIG。void NRFSetRXMode()CE=0;NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);/接收设备接收通道 0 使用和发送设备相同的发送地址 NRFWriteReg(W_REGISTER+EN_AA,0 x01);/使能接收通道 0 自动应答 NRFWriteReg(W_REGISTER+EN_RXADDR,0 x01);/使能接收通道 0 NRFWriteReg(W_REGISTER+RF_CH,0 x40)
7、;/选择射频通道 0 x40 NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);/接收通道 0 选择和发送通道相同有效数据宽度 NRFWriteReg(W_REGISTER+RF_SETUP,0 x07);/数据传输率 1Mbps,发射功率 0dBm,低噪声放大器增益 NRFWriteReg(W_REGISTER+CONFIG,0 x0f);/CRC 使能,16 位 CRC 校验,上电,接收模式 CE=1;delayms(1);/NRFDelay(5);四、程序说明 4.1 发射:/*PD3-20 脚-CE-模块芯片开启信号 激活 RX 或 TX 单
8、片机输出 PD2-19 脚-CSN-模块 SPI 片选信号 单片机输出 PC7-17 脚-SCK-模块 SPI 时钟信号 单片机输出 PC6-16 脚-MOSI-模块 SPI 输入信号 单片机输出 PC5-15 脚-MISO-模块 SPI 输出信号 单片机输入 PC4-14 脚-IRQ-模块可屏蔽中断信号 低电平有效 单片机输入*/#include#include uchar RevTempDate5;/最后一位用来存放结束标志 uchar TxAddr=0 x34,0 x43,0 x10,0 x10,0 x02;/发送地址/*状态标志*/uchar sta;/状态标志 广东顺德春暖花开自动化
9、开发设计工作室 伍耀斌/RX_DR=sta6;/TX_DS=sta5;PLC_BitState.BitState0.Bit.M4=1;/MAX_RT=sta4;struct PLC_BITSTATE /-union BITSTATE0 char all;struct BIT00 uchar M0:1;/uchar M1:1;/uchar M2:1;/uchar M3:1;/uchar MAX_RT:1;/不成功返回 ACK 信号,此为 1.不成功为 0 uchar TX_DS:1;/成功返回 ACK 信号,此为 1.不成功为 0 uchar RX_DR:1;/uchar M7:1;/Bit;B
10、itState0;PLC_BitState;/*SPI 时序函数*/uchar NRFSPI(uchar date)/*NRF24L01 初始化函数*/void NRF24L01Int()/*SPI 读寄存器一字节函数*/uchar NRFReadReg(uchar RegAddr)/*SPI 写寄存器一字节函数*/uchar NRFWriteReg(uchar RegAddr,uchar date)/*SPI 读取 RXFIFO 寄存器的值*/uchar NRFReadRxDate(uchar RegAddr,uchar*RxDate,uchar DateLen)/*SPI 写入 TXFIF
11、O 寄存器的值*/uchar NRFWriteTxDate(uchar RegAddr,uchar*TxDate,uchar DateLen)/*NRF 设置为发送模式并发送数据*/void NRFSetTxMode(uchar*TxDate)广东顺德春暖花开自动化开发设计工作室 伍耀斌 /*NRF 设置为接收模式并接收数据*/接收模式 void NRFSetRXMode()/*检测是否有接收到数据*/uchar CheckACK()/*判断是否接收收到数据,接到就从 RX 取出*/用于接收模式 uchar NRFRevDate(uchar*RevDate)/*端口配置*/void IO_co
12、nfig(void)原理:1、需要发射调用:NRFSetTxMode(TxDate1);/发送数组 1 (其中 TxDate1 为存放所发的数据)while(CheckACK();/检测是否发送完毕 2、void NRFSetTxMode(uchar*TxDate)调用到:uchar NRFWriteTxDate(uchar RegAddr,uchar*TxDate,uchar DateLen)写寄存器 TXFIFO uchar NRFWriteReg(uchar RegAddr,uchar date)写寄存器配置 广东顺德春暖花开自动化开发设计工作室 伍耀斌 4.2 接收:/*PD3-20
13、脚-CE-模块芯片开启信号 激活 RX 或 TX 单片机输出 PD2-19 脚-CSN-模块 SPI 片选信号 单片机输出 PC7-17 脚-SCK-模块 SPI 时钟信号 单片机输出 PC6-16 脚-MOSI-模块 SPI 输入信号 单片机输出 PC5-15 脚-MISO-模块 SPI 输出信号 单片机输入 PC4-14 脚-IRQ-模块可屏蔽中断信号 低电平有效 单片机输入*/#include#include uchar RevTempDate5;/最后一位用来存放结束标志 uchar TxAddr=0 x34,0 x43,0 x10,0 x10,0 x02;/发送地址/*状态标志*/u
14、char sta;/状态标志/RX_DR=sta6;/TX_DS=sta5;PLC_BitState.BitState0.Bit.M4=1;/MAX_RT=sta4;struct PLC_BITSTATE /-union BITSTATE0 char all;struct BIT00 uchar M0:1;/uchar M1:1;/uchar M2:1;/uchar M3:1;/uchar MAX_RT:1;/uchar TX_DS:1;/uchar RX_DR:1;/uchar M7:1;/Bit;BitState0;PLC_BitState;/*SPI 时序函数*/uchar NRFSPI
15、(uchar date)/*NRF24L01 初始化函数*/void NRF24L01Int()/*SPI 读寄存器一字节函数*/广东顺德春暖花开自动化开发设计工作室 伍耀斌 uchar NRFReadReg(uchar RegAddr)/*SPI 写寄存器一字节函数*/uchar NRFWriteReg(uchar RegAddr,uchar date)/*SPI 读取 RXFIFO 寄存器的值*/uchar NRFReadRxDate(uchar RegAddr,uchar*RxDate,uchar DateLen)/*SPI 写入 TXFIFO 寄存器的值*/uchar NRFWrite
16、TxDate(uchar RegAddr,uchar*TxDate,uchar DateLen)/寄存器地址/写入数据存放变量/读取数据长度/用于发送 /*NRF 设置为发送模式并发送数据*/void NRFSetTxMode(uchar*TxDate)/*NRF 设置为接收模式并接收数据*/接收模式 void NRFSetRXMode()/*检测是否有接收到数据*/void CheckACK()/用于发射模式接收应答信号 /*判断是否接收收到数据,接到就从 RX 取出*/用于接收模式 uchar NRFRevDate(uchar*RevDate)/*端口配置*/void IO_config(
17、void)GPIO_Init(GPIOD,GPIO_PIN_3,GPIO_MODE_OUT_PP_HIGH_FAST);/PB7 高速推挽输出高电平-CE HIGH GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_FAST);/PB6 高速推挽输出高电平-CSN(片选)GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_PP_HIGH_FAST);/PB5 高速推挽输出高电平-SCK(时钟)GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_OUT_PP_HIGH_FAST);/PB4 高速推
18、挽输出低电平-MOSI(数据输出)GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_IN_PU_NO_IT);/PB3 上拉输入无中断-MISO(数据输入)GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_IN_PU_NO_IT);/PB2 上拉输入无中断-IRQ /=/*接收数据*/void GetDate()广东顺德春暖花开自动化开发设计工作室 伍耀斌 /接收到的数据放在:RevTempDate0,RevTempDate1,RevTempDate2,RevTempDate3中.原理:1、主程序循环一直调用:NRFSetRXMode();/设置为接收模式 GetDate();/开始接受数 if(RevTempDate0=9)LED2=0;/RevTempDate0为所收到的数据 2、void NRFSetRXMode()里面调用到:uchar NRFWriteTxDate(uchar RegAddr,uchar*TxDate,uchar DateLen)写寄存器 TXFIFO uchar NRFWriteReg(uchar RegAddr,uchar date)写寄存器配置 GetDate();里面调用到:五、