NRF2401详细注释编程程序
无线模块2401调试方法(C51)

//*************************************SPI(nRF24L01)寄存器地址**************************************************** #define CONFIG #define EN_AA #define EN_RXADDR #define SETUP_AW #define SETUP_RETR #define RF_CH #define RF_SETUP #define STATUS #define OBSERVE_TX #define CD #define RX_ADDR_P0 #define RX_ADDR_P1 #define RX_ADDR_P2 #define RX_ADDR_P3 #define RX_ADDR_P4 #define RX_ADDR_P5 #define TX_ADDR #define RX_PW_P0 #define RX_PW_P1 #define RX_PW_P2 #define RX_PW_P3 #define RX_PW_P4 #define RX_PW_P5 #define FIFO_STATUS 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 // 配置收发状态,CRC 校验模式以及收发状态响应方式 // 自动应答功能设置 // 可用信道设置 // 收发地址宽度设置 // 自动重发功能设置 // 工作频率设置 // 发射速率、功耗功能设置 // 状态寄存器 // 发送监测功能 // 地址检测 // 频道 0 接收数据地址 // 频道 1 接收数据地址 // 频道 2 接收数据地址 // 频道 3 接收数据地址 // 频道 4 接收数据地址 // 频道 5 接收数据地址 // 发送地址寄存器 // 接收频道 0 接收数据长度 // 接收频道 0 接收数据长度 // 接收频道 0 接收数据长度 // 接收频道 0 接收数据长度 // 接收频道 0 接收数据长度 // 接收频道 0 接收数据长度 // FIFO 栈入栈出状态寄存器设置
nrf2401中文资料_数据手册_参数

NRF2401在51单片机上的接收与发送程序

//这是在网上收集的程序,版权归原作者所有NRF2401程序(接收部分)jxj2e1v8v 发表于2008-3-31 1:56:00#include <reg52.h>#include<intrins.h>// 常量定义#define uchar unsigned char#define uint unsigned int#define BYTE_BIT0 0x01#define BYTE_BIT1 0x02#define BYTE_BIT2 0x04#define BYTE_BIT3 0x08#define BYTE_BIT4 0x10#define BYTE_BIT5 0x20#define BYTE_BIT6 0x40#define BYTE_BIT7 0x80//---------------------------位变量定义----------------------------------------bdata uchar DATA_BUF; //用于ByteRead和ByteWrite 函数#define DATA7 ((DA TA_BUF&BYTE_BIT7)!=0)#define DATA0 ((DATA_BUF&BYTE_BIT0)!=0)uchar RxBuf[28];// ------------------------------<RF2401_Pins 对应引脚> -----------------------sbit PWR_UP = P1^0;sbit CE = P1^1;// sbit DR2 = P3^2; //暂时没有用到// sbit CLK2 = P1^2;// sbit OUT2 = P1^4;sbit CS = P1^3;sbit DR1 = P3^3;sbit CLK1 = P1^7;sbit DATA = P1^5;//sbit LED0 = P3^4;//sbit LED1 = P3^5;//sbit KEY0 = P3^0;//sbit KEY1 = P3^1;//-------------------------------------------------------------------------------unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; //发送地址//---------------------<nRF-Configuration-Register 配置信息>------------------------------//芯片测试用,无需修改#define TEST_2 0x8E // MSB D143-D136#define TEST_1 0x08 // D135~D128#define TEST_0 0x1c // D127~D120// 注意DATAx_W+ADDRx_W+CRC 的值必须小于256!单个数据包的大小必须小于32字节(256位)#define DATA2_W 0x10 //未用到--0x10=2字节//频道2发送/接受数据长度(单位:Bit)#define DATA1_W 0xE0 //28字节16 位//频道1发送/接受数据长度(单位:Bit)//频道2接收地址<-频道2未使用#define ADDR2_4 0x00#define ADDR2_3 0x1c#define ADDR2_2 0xcc#define ADDR2_1 0xcc#define ADDR2_0 0xcc// 频道1接收地址(当前模块地址) <-只是用频道1#define ADDR1_4 0x00#define ADDR1_3 0xcc#define ADDR1_2 0xcc#define ADDR1_1 0xcc#define ADDR1_0 0xcc//接收地址位置设置--CRC设置#define ADDR_W 0x10 //0x10 =2字节//发送/接收地址宽度(单位:Bit)#define CRC_L 0x1 //CRC模式0:8位1:16位#define CRC_EN 0x1 //CRC校验0:禁止1:启用//频道设置--发送方式设置--速率设置--频率设置#define RX2_EN 0x0 //双频道功能0:禁用1:启用#define CM 0x1 //0:Direct Mode 1: Shockburst Mode#define RFDR_SB 0x1 //传输速率0:250k 1: 1M (250k比1M传输距离远)#define XO_F 0x3 //16M D12 D11 D10 确定5种频率#define RF_PWR 0x3 //信号发射功率---0DB//#define RF_CH 0x2 //Channal 频率设置Channel=2400MHz+RF_CH*1.0MHz#define RXEN 0x1 //0:TX 1:RX//<将设置信息组合成每个字节的数据信息#define RFconfig_Bit0 TEST_2#define RFconfig_Bit1 TEST_1#define RFconfig_Bit2 TEST_0#define RFconfig_Bit3 DA TA2_W#define RFconfig_Bit4 DA TA1_W#define RFconfig_Bit5 ADDR2_4#define RFconfig_Bit6 ADDR2_3#define RFconfig_Bit7 ADDR2_2#define RFconfig_Bit8 ADDR2_1#define RFconfig_Bit9 ADDR2_0#define RFconfig_Bit10 ADDR1_4#define RFconfig_Bit11 ADDR1_3#define RFconfig_Bit12 ADDR1_2#define RFconfig_Bit13 ADDR1_1#define RFconfig_Bit14 ADDR1_0#define RFconfig_Bit15 (ADDR_W<<2|CRC_L<<1|CRC_EN)#define RFconfig_Bit16 (RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)#define RFconfig_Bit17 (RF_CH<<1|RXEN)//通过宏定义将18字节的寄存器参数按照各个功能分解,参照DATASHHETuchar code nRF2401_Conf[18]={RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,RFconfig_Bit3,RFconfig_Bit4,RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9, RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14, RFconfig_Bit15,RFconfig_Bit16,RFconfig_Bit17};//------------------------------------------函数申明------------------------------------------void Delay_us(uchar n);void DoClock();void Delay_ms(uchar n);unsigned char Spi_ByteRead(void);void Spi_ByteWrite(unsigned char send);void Config2401(void);void SetTxMode(void);void nRF2401_TxPacket(uchar TxBuf[]);//--------------------------------11.0592M晶振n=100 868us 左右------------------------------- void Delay_us(uchar n){uint i;for(i=0;i<n;i++);}//------------------------------------------ -----------------------------------------void Delay_ms(uchar n){unsigned int i,j,k;for(i=0;i<n;i++){for(k=0;k<5;k++){for(j=0;j<200;j++);}}}//--------------------------SPI读------------------------------------------ unsigned char Spi_ByteRead(void){unsigned char i = 0;for (i=0; i<8; i++){DATA_BUF = DA TA_BUF << 1;CLK1 = 1;DATA = 1; //设置为输入状态if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节{DA TA_BUF |= BYTE_BIT0;}else{DA TA_BUF &= ~BYTE_BIT0;}CLK1 = 0;}return DATA_BUF;}//----------------------------------SPI写----------------------------------------- void Spi_ByteWrite(unsigned char send){unsigned char i;DATA_BUF = send;CLK1 = 0;for (i=0; i<8; i++){if (DATA7) //总是发送最高位{DA TA = 1;}else{DA TA = 0;}CLK1 = 1;DATA_BUF = DA TA_BUF << 1;CLK1 = 0;}}//-----------------------------配置2401-------------------------------------------- void Config2401(void){uint i;uchar variable1;PWR_UP=1; //上电CE=0;CS=1; //使RF2401进入配置方式Delay_ms(3); //从上电到进入配置模式需要3ms的延时(最少)for(i=0;i<18;i++) //输入3个测试字节15个配置字节共18Byte{variable1=nRF2401_Conf[i];Spi_ByteWrite(variable1);}CS=0; //Disable CS -----standby modeDATA=0;Delay_us(100);}/*//--------------------------------设置为发送模式----------------------------void SetTxMode(void){//-------------------------------设置为配置模式---------------------------------- PWR_UP=1; //上电CE=0;CS=1; //进入配置模式Delay_us(100);DATA=0; //配置寄存器0字节RXEN 设置为0: 发送模式CLK1=1;CLK1=0;//----------------------------设置为Activemodes(TX)------------------------------ CS=0;CE=1; //set standby modeDelay_us(100);}//--------------------------------nRF 数据发送函数-------------------------------- void nRF2401_TxPacket(){int i;uchar variable2;CE=1;for(i=0;i<2;i++) //写入接受地址(按字节对齐){variable2=TxAddress[i];Spi_ByteWrite(variable2);}for(i=0;i<(28);i++) //写入接受地址(按字节对齐){variable2=TxBuf[i];Spi_ByteWrite(variable2);}CE=0; //CE配置低使发送有效Delay_us(100); //时钟信号高电平有效}*/void SetRxMode(void){PWR_UP=1; //上电CE=0;CS=1; //进入配置模式Delay_us(100);DATA=1; //配置寄存器0字节RXEN 设置为0: 发送模式CLK1=1;CLK1=0;//----------------------------设置为Activemodes(TX)------------------------------ CS=0;CE=1; //set standby modeDelay_us(100);}void nRF2401_RxPacket(){int i;DR1=1;if(DR1==1){for(i=0;i<(28);i++) //写入接受地址(按字节对齐){RxBuf[i]=Spi_ByteRead();}}CE=0; //CE配置低使发送有效Delay_us(100); //时钟信号高电平有效}//---------------------------串口初始化----------------------------------void StartUART( void ){ //波特率4800SCON = 0x50;TMOD = 0x20;TH1 = 0xFA;TL1 = 0xFA;PCON = 0x00;TR1 = 1;}//--------------------------串口接收函数---------------------------------- void R_S_Byte(uchar R_Byte){SBUF = R_Byte;while( TI == 0 ); //查询法TI = 0;}//------------------------------------主函数--------------------------------------- main(){uchar i;Config2401();Delay_us(100);StartUART();while(1){SetRxMode();nRF2401_RxPacket();for(i=0;i<28;i++){R_S_Byte( RxBuf[i]);}}}NRF2401程序(发送部分)jxj2e1v8v 发表于2008-3-31 1:53:00#include <reg52.h>#include<intrins.h>// 常量定义#define uchar unsigned char#define uint unsigned int#define BYTE_BIT0 0x01#define BYTE_BIT1 0x02#define BYTE_BIT3 0x08#define BYTE_BIT4 0x10#define BYTE_BIT5 0x20#define BYTE_BIT6 0x40#define BYTE_BIT7 0x80//---------------------------位变量定义----------------------------------------bdata uchar DATA_BUF; //用于ByteRead和ByteWrite 函数#define DATA7 ((DA TA_BUF&BYTE_BIT7)!=0)#define DATA0 ((DATA_BUF&BYTE_BIT0)!=0)uchar TxBuf[28]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,};// ------------------------------<RF2401_Pins 对应引脚> -----------------------sbit PWR_UP = P1^0;sbit CE = P1^1;// sbit DR2 = P3^2; //暂时没有用到// sbit CLK2 = P1^2;// sbit OUT2 = P1^4;sbit CS = P1^3;sbit DR1 = P3^3;sbit CLK1 = P1^7;sbit DATA = P1^5;////sbit LED0 = P3^4;//sbit LED1 = P3^5;//sbit KEY0 = P3^0;//sbit KEY1 = P3^1;//-------------------------------------------------------------------------------unsigned char TxAddress[4]={0xcc,0xcc,0xcc,0xcc}; //发送地址//---------------------<nRF-Configuration-Register 配置信息>------------------------------//芯片测试用,无需修改#define TEST_2 0x8E // MSB D143-D136#define TEST_1 0x08 // D135~D128#define TEST_0 0x1c // D127~D120// 注意DATAx_W+ADDRx_W+CRC 的值必须小于256!单个数据包的大小必须小于32字节(256位)#define DATA2_W 0x10 //未用到--0x10=2字节//频道2发送/接受数据长度(单位:Bit)#define DATA1_W 0xE0 //28字节16 位//频道1发送/接受数据长度(单位:Bit)//频道2接收地址<-频道2未使用#define ADDR2_4 0x00#define ADDR2_2 0xcc#define ADDR2_1 0xcc#define ADDR2_0 0xcc// 频道1接收地址(当前模块地址) <-只是用频道1#define ADDR1_4 0x00#define ADDR1_3 0xcc#define ADDR1_2 0xcc#define ADDR1_1 0xcc#define ADDR1_0 0xcc//接收地址位置设置--CRC设置#define ADDR_W 0x10 //0x10 =2字节//发送/接收地址宽度(单位:Bit)#define CRC_L 0x1 //CRC模式0:8位1:16位#define CRC_EN 0x1 //CRC校验0:禁止1:启用//频道设置--发送方式设置--速率设置--频率设置#define RX2_EN 0x0 //双频道功能0:禁用1:启用#define CM 0x1 //0:Direct Mode 1: Shockburst Mode#define RFDR_SB 0x1 //传输速率0:250k 1: 1M (250k比1M传输距离远) #define XO_F 0x3 //16M D12 D11 D10 确定5种频率#define RF_PWR 0x3 //信号发射功率---0DB//#define RF_CH 0x2 //Channal 频率设置Channel=2400MHz+RF_CH*1.0MHz#define RXEN 0x0 //0:TX 1:RX//<将设置信息组合成每个字节的数据信息#define RFconfig_Bit0 TEST_2#define RFconfig_Bit1 TEST_1#define RFconfig_Bit2 TEST_0#define RFconfig_Bit3 DA TA2_W#define RFconfig_Bit4 DA TA1_W#define RFconfig_Bit5 ADDR2_4#define RFconfig_Bit6 ADDR2_3#define RFconfig_Bit7 ADDR2_2#define RFconfig_Bit8 ADDR2_1#define RFconfig_Bit9 ADDR2_0#define RFconfig_Bit10 ADDR1_4#define RFconfig_Bit11 ADDR1_3#define RFconfig_Bit12 ADDR1_2#define RFconfig_Bit13 ADDR1_1#define RFconfig_Bit14 ADDR1_0#define RFconfig_Bit15 (ADDR_W<<2|CRC_L<<1|CRC_EN)#define RFconfig_Bit16 (RX2_EN<<7|CM<<6|RFDR_SB<<5|XO_F<<2|RF_PWR)#define RFconfig_Bit17 (RF_CH<<1|RXEN)//通过宏定义将18字节的寄存器参数按照各个功能分解,参照DATASHHET uchar code nRF2401_Conf[18]={RFconfig_Bit0,RFconfig_Bit1,RFconfig_Bit2,RFconfig_Bit3,RFconfig_Bit4,RFconfig_Bit5,RFconfig_Bit6,RFconfig_Bit7,RFconfig_Bit8,RFconfig_Bit9, RFconfig_Bit10,RFconfig_Bit11,RFconfig_Bit12,RFconfig_Bit13,RFconfig_Bit14, RFconfig_Bit15,RFconfig_Bit16,RFconfig_Bit17};//------------------------------------------函数申明------------------------------------------void Delay_us(uchar n);void DoClock();void Delay_ms(uchar n);unsigned char Spi_ByteRead(void);void Spi_ByteWrite(unsigned char send);void Config2401(void);void SetTxMode(void);void nRF2401_TxPacket(uchar TxBuf[]);//--------------------------------11.0592M晶振n=100 868us 左右------------------------------- void Delay_us(uchar n){uint i;for(i=0;i<n;i++);}//------------------------------------------ -----------------------------------------void Delay_ms(uchar n){unsigned int i,j,k;for(i=0;i<n;i++){for(k=0;k<5;k++){for(j=0;j<200;j++);}}}/*//--------------------------SPI读------------------------------------------unsigned char Spi_ByteRead(void){unsigned char i = 0;for (i=0; i<8; i++){DATA_BUF = DA TA_BUF << 1;CLK1 = 1;DATA = 1; //设置为输入状态if (DATA) //读取最高位,保存至最末尾,通过左移位完成整个字节{DA TA_BUF |= BYTE_BIT0;}else{DA TA_BUF &= ~BYTE_BIT0;}CLK1 = 0;}return DATA_BUF;}*///----------------------------------SPI写----------------------------------------- void Spi_ByteWrite(unsigned char send){unsigned char i;DATA_BUF = send;CLK1 = 0;for (i=0; i<8; i++){if (DATA7) //总是发送最高位{DA TA = 1;}else{DA TA = 0;}CLK1 = 1;DATA_BUF = DA TA_BUF << 1;CLK1 = 0;}}//-----------------------------配置2401-------------------------------------------- void Config2401(void){uint i;uchar variable1;PWR_UP=1; //上电CE=0;CS=1; //使RF2401进入配置方式Delay_ms(3); //从上电到进入配置模式需要3ms的延时(最少)for(i=0;i<18;i++) //输入3个测试字节15个配置字节共18Byte{variable1=nRF2401_Conf[i];Spi_ByteWrite(variable1);}CS=0; //Disable CS -----standby modeDATA=0;Delay_us(100);}//--------------------------------设置为发送模式----------------------------void SetTxMode(void){//-------------------------------设置为配置模式---------------------------------- PWR_UP=1; //上电CE=0;CS=1; //进入配置模式Delay_us(100);DATA=0; //配置寄存器0字节RXEN 设置为0: 发送模式CLK1=1;CLK1=0;//----------------------------设置为Activemodes(TX)------------------------------ CS=0;CE=1; //set standby modeDelay_us(100);}//--------------------------------nRF 数据发送函数-------------------------------- void nRF2401_TxPacket(){int i;uchar variable2;CE=1;for(i=0;i<2;i++) //写入接受地址(按字节对齐){variable2=TxAddress[i];Spi_ByteWrite(variable2);}for(i=0;i<(28);i++) //写入接受地址(按字节对齐){variable2=TxBuf[i];Spi_ByteWrite(variable2);}CE=0; //CE配置低使发送有效Delay_us(100); //时钟信号高电平有效}//------------------------------------主函数--------------------------------------- main(){Config2401();while(1){nRF2401_TxPacket();SetTxMode();}}。
nrf2401编程指南

说明 MCU 通过 MOSI 输出数据 同时通过 CLK1 送出 SPI 时钟信号 从 MISO 读入数据 有两个 10K 电阻隔离 MOSI 送出的数据不会影响 nRF2401 输出的数据
因为图中
软件编程 流程与上面 I/O 直接连接方式相同 读写 nRF2401 子程序
下面给出带 51 内核的 P89LPC913 单片机的 SPI 读写子程序 供参考 /********************************************************/ 名 称 Spi_Init 功 能 P89LPC913 单片机 SPI 接口初始化 C 语言子程序 入口参数 无 出口参数 无 影响资源 无 /********************************************************/ sfr SPSTAT = 0xE1; sfr SPCTL = 0xE2; sfr SPDAT = 0xE3; sfr IEN1 = 0xE8; sbit ESPI = IEN1^3 ; void Spi_Init(void) { SPCTL =0xd1; //bit7 :SSIG =1 忽略 SS 信号 // bit6 :SPEN=1 ,允许 SPI //bit5 :DROD=0 高位在前 //bit4 :MASTER =1 主模式 //bit3 :CPOL=0 , SPI_CLK 空闲时为低电平 //bit2 :CPHA =0 , 前时钟上升沿驱动输出及采样方式 //bit1~0 :01 CCLK/16 SPI 时钟频率 1MHz max
COPYRIGHT ©2005 ALL RIGHTS RESERVED 迅通科技
TEL: (010)64390486
http://:
NRF2401+模块说明书

答:一款原产台湾,一款原产品挪威,随着众多 IC 晶圆厂自己无线 IC 的 推出,兼容模块的价格从 2008 年的 20 元左右一直跌落到目前的 4.5,利润由当 初的 10 元降到现在的 0.5 元以下,其中挪威版的出的最早,价格虽然猛降,但 是始终拼不过台产芯片。
时也减小了整个系统的平均工作电流。 在 Enhanced ShockBurstTM 收发模式下, NRF24L01 自动处理字头 和 CRC 校验码。在接收数据时,自动把字头和 CRC 校验码移去。在送 数据时,自动加上字头和 CRC 校验码,在发送模式下,置 CE 为高,至 少 10us,将时发送过程完成后。 4.1.1.1 Enhanced ShockBurstTM 发射流程 A. 把接收机的地址和要发送的数据按时序送入 NRF24L01; B. 配置 CONFIG 寄存器,使之进入发送模式。C. 微控制器把 CE 置高 (至少 10us),激 发 NRF24L01 进行 Enhanced ShockBurstTM 发射; D. N24L01 的 Enhanced ShockBurstTM 发射(1) 给射频前端供电; (2) 射频数据打包(加字头、CRC 校验码); (3) 高速发射数据包; (4) 发射完成,NRF24L01 进入空闲状态。4.1.1.2 Enhanced ShockBurstTM 接收流程 A. 配置本机地址和要接收的数据包大小;B. 配置 CONFIG 寄存器,使之进入接收模式,把 CE 置高。 C. 130us 后,NRF24L01 进入监视状态,等待数据包的到来; D.收到 正确的数据包(正确的地址和 CRC 校验码),NRF2401 自动把字头、地址
最新-系统级RF芯片nRF24E1收发原理与应用编程 精品

系统级RF芯片nRF24E1收发原理与应用编程摘要从应用的角度出发,阐述系统级收发芯片241的口控制方法和工作过程;分析241的收发方式;详细介绍技术、技术和应用中器件的配置方法并通过代码说明实际应用中的编程方法。
关键词241射频无线通信配置引言241收发器是推出的系统级射频芯片,采用先进的018μ工艺、6×6的36引脚封装,以240芯片结构为基础,将射频率、8051、9输入10位、125通道、、、、、全部集成到单芯片中,是目前世界首次推出的、全球24通用的、完事的低成本射频系统级芯片。
由于241片内集成了模块,在使用中,只需要一片241和少数的外围元件就能完成射频收发功能,因此,大大减少了系统的体积。
使用241时,必须进行相应的配置工作。
下面,详细讲述241的收发原理和编程方法,以供读者设计时参考。
有关241的介绍请见2019年第6期。
1口241收发器的收发任务由口控制。
口使用标准8051中的2口地址。
由于射频收发器是片内置的,并不是双向工作。
为了满足射频收发子系统的需要,口的默认值与标准8051的2默认值也不一样。
收发器由特殊功能豁口中的00和_03控制。
_=00时,没用;_=01时,连接到1口;_=10时,连到第一个2401频道;_=11时,连接到第二个2401频道。
豁口的各个位如图1所示。
在241头文件中,所定义的各个位的名字与图1中一样。
1用口控制收发器用芯片内嵌的口控制收发器的操作非常方便。
如配置和接收或发送。
2复位时口的状态复位引脚为高电平时无论是时钟是否有效,控制2401收发子系统的输出位默认为3=0,6=0,7_=1。
程序运行后,保持默认值,直到程序通过寄存器改变各位的值。
范文先生网收集整理2收发方式通过_、和三个控制引脚,可以设置2401。
xunzai_NRF2401中文资料,NRF2401中文数据手册

2.4GHz射频收发芯片nRF2401及其应用摘要:本文介绍了工作于2.4GHz ISM频段的射频收发芯片nRF2401的芯片结构、引脚功能、工作模式、接收与发送的工作流程,详细描述了nRF2401的器件配置,给出了应用电路图,分析了PCB设计时应该注意的问题,最后对全文进行了总结。
关键词:nRF2401;射频;无线通信;收发芯片1.引言nRF2401是单片射频收发芯片,工作于2.4~2.5GHz ISM频段,芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。
芯片能耗非常低,以-5dBm的功率发射时,工作电流只有10.5mA,接收时工作电流只有18mA,多种低功率工作模式,节能设计更方便。
其DuoCeiverTM技术使nRF2401可以使用同一天线,同时接收两个不同频道的数据。
nRF2401适用于多种无线通信的场合,如无线数据传输系统、无线鼠标、遥控开锁、遥控玩具等。
2.芯片结构、引脚说明2.1芯片结构nRF2401内置地址解码器、先入先出堆栈区、解调处理器、时钟处理器、GFSK滤波器、低噪声放大器、频率合成器,功率放大器等功能模块,需要很少的外围元件,因此使用起来非常方便。
QFN24引脚封装,外形尺寸只有5×5mm。
nRF2401的功能模块如图1所示。
图2nRF2401引脚图2.2引脚说明表1:nRF2401引脚(附:此处引脚11和12有误。
2006.6.30)3.工作模式nRF2401有工作模式有四种:收发模式、配置模式、空闲模式和关机模式。
nRF2401的工作模式由PWR_UP、CE、TX_ EN和CS三个引脚决定,详见表2。
表2:nRF2401工作模式3.1收发模式nRF2401的收发模式有ShockBurstTM收发模式和直接收发模式两种,收发模式由器件配置字决定,具体配置将在器件配置部分详细介绍。
3.1.1ShockBurstTM收发模式ShockBurstTM收发模式下,使用片内的先入先出堆栈区,数据低速从微控制器送入,但高速(1Mbps)发射,这样可以尽量节能,因此,使用低速的微控制器也能得到很高的射频数据发射速率。
NRF2401详细注释编程程序

N R F2401详细注释编程程序(总6页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March#include <>#include <>typedef unsigned char uchar;typedef unsigned char uint;SCK = 1;uchar |= MISO; then set SCK low again}return(uchar); .SPI_RW(reg);reg_val = SPI_RW(0); then read registervalueCSN = 1; and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar}/****************************************************************************** **********************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************** **********************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; // Set CSN low, init SPI tranactionstatus = SPI_RW(reg); // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr] = SPI_RW(0); //CSN = 1;return(status); // return nRF24L01 status uchar}/****************************************************************************** ***************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/****************************************************************************** ***************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; //SPI使能status = SPI_RW(reg);for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //SPI_RW(*pBuf++);CSN = 1; //关闭SPIreturn(status); //}/****************************************************************************** **********************//*函数:void SetRX_Mode(void)/*功能:数据接收配置**********************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收CE = 1;inerDelay_us(130);}/****************************************************************************** ************************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/****************************************************************************** ************************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}*****************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/****************************************************************************** ****************************/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}//************************************主函数************************************************************void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; //unsigned char RxBuf[20]={0};init_NRF24L01() ;led1=1;led2=1;P0=0x00;TxBuf[1] = 1 ;TxBuf[2] = 1 ;nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataDelay(6000);P0=0xBF;while(1){if(KEY1 ==0 ){TxBuf[1] = 1 ;tf = 1 ;led1=0;Delay(120);led1=1;Delay(120);}if(KEY2 ==0 ){TxBuf[2] =1 ;tf = 1 ;led2=0;Delay(120);led2=1;Delay(120);}if (tf==1){nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data TxBuf[1] = 0x00;TxBuf[2] = 0x00;tf=0;Delay(1000);}SetRX_Mode();RxBuf[1] = 0x00;RxBuf[2] = 0x00;Delay(1000);nRF24L01_RxPacket(RxBuf); if(RxBuf[1]|RxBuf[2]){if( RxBuf[1]==1){led1=0;}if( RxBuf[2]==1){led2=0;}Delay(6000); //old is '1000' }RxBuf[1] = 0x00;RxBuf[2] = 0x00;led1=1;led2=1;}}。
nrf2401

nrf2401介绍nrf2401是一款低功耗无线通信模块,采用2.4GHz频段进行通信。
该模块非常适用于需要远距离无线通信的应用,如物联网设备、无线传感器网络、遥控器等。
特性• 2.4GHz全向射频模块•内置射频前端和调制解调器•最大传输距离可达100米•工作频率范围为2.400-2.525GHz•最大发射功率为0dBm•支持多通道通信•低功耗设计,适合电池供电设备•强大的抗干扰能力•简单易用的SPI接口硬件规格•工作电压:3.3V•工作温度范围:-40°C 到 +85°C•尺寸:15mm x 29mm连接方式nrf2401模块采用SPI接口进行与主控芯片的通信。
需要连接如下几个引脚:•MOSI:主控芯片的SPI信号输出引脚•MISO:主控芯片的SPI信号输入引脚•SCK:主控芯片的SPI时钟引脚•CSN:片选引脚,用于使能模块•CE:片选引脚,用于控制模块的工作模式应用示例以下是一个基本的nrf2401模块应用示例:```c #include <SPI.h>// 定义连接nrf2401模块的引脚 #define MOSI 11 #define MISO 12 #define SCK 13 #define CSN 10 #define CE 9void setup() { SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV4);pinMode(CSN, OUTPUT); digitalWrite(CSN, HIGH);pinMode(CE, OUTPUT); digitalWrite(CE, LOW); }void loop() { // 选择通信通道 selectChannel(2);// 发送数据 sendData(。
nRF2401的C51驱动

#define RFConfig_Byte16
(RX2_EN7 CM6 RFDR_SB5 XO_F 2 RF_PWR)
#define RFConfig_Byte17
(RF_CH1 RXEN)
-----------------------------------------------------------通过宏定义将18字节的寄存器参数按照各个功能分解,以便于参数的调整 unsigned char code nRF2401_Conf[18] ={
0x10 0x1
0x1
2字节
接收地址宽度(单位 Bit)
CRC 模式 08位
116
CRC 校验启用
#define RX2_EN #define CM #define RFDR_SB #define XO_F
0x0 0x1 0x0
0x3
双频道功能启用
0Direct mode
1ShockBurst mode
返回值 0没有接收到数据
1接收到数据
16M 晶振 600us 左右 void Delay100(void) {
unsigned int i; for(i=0;i100;i++); }
void Delay(uchar n) {
uint i; while(n--) for(i=0;i80;i++); }
Date 2007-3-12 Update 2007-9-8
这是我购买在 nRF2401时从开发商中得到的代码。我已经验证过。 供大家学习用,只要修改下代码就可以应用到其他的单片机。 这个程序是一个半双工的通信模式.
#i nclude reg51.h 常量定义
MSP430nrf2401代码,第一次好好的分析

MSP430nrf2401代码,第一次好好的分析MSP430+nrf2401代码,第一次好好的分析分类: C 2010-07-02 23:14 417人阅读评论(6) 收藏举报画外音:Windows Live Writer客户端连不到csdn的服务端,只好网页写了。
但是……搜狗输入法在chrome浏览器里面居然不能用搜狗输入法在bolg编辑框里面输入中文,看来只好下载Google输入法用了。
看来离Google人更近一步了。
正事开始了。
看陌生代码还是source insight方便,而且刚开始用没多久,还处于蜜月期,总觉得这工具相当不错的啦。
当然,Linux平台还是vim+ctags用起来爽。
调用关系显示的很清楚,只是屏幕小了点,看着确实少了点,上网本,就将就点吧。
两个单片机,两个文件代码。
第一件事就是找main函数。
呃,main函数放在最后,跟个人习惯很不一样。
[cpp] view plaincopy?1.void main(void)2.{3.WDTCTL=WDTPW+WDTHOLD;4._DINT();5.Init_Port1();6.IO_Init();7.LCD_Init();8.CLEAR();9.……10.}第一件事是杀狗,嗯嗯,以后一直要记得。
先禁止中断,然后把该初始化的初始化好,单片机才能好好工作么~然后是端口和芯片的初始化,由于功能比较单一,只要三个初始化函数就好了。
然后是显示开机界面的显示,液晶屏显示还是很不错的[c-sharp] view plaincopy?1.key11='M';2.// LCDL='安';3.//汉字显示示例4.writechinese(0x80,"XX大学");5.writechinese(0x90,"XX学院");6.writechinese(0x88,"无线监测模拟装置");7.Delayus(100000);8.CLEAR();9.writechinese(0x80,"调试接收模式");10.//writechinese(0x90,"1-单独探测节点");11.//writechinese(0x88,"2-轮巡模式");12.keyflg=0;13.bostart=0x00;14.boflg=0x00;15.key_Init();顺便设置了一下初始参数和键盘接口,下面就是设置无线接收模块的设置(根据函数名猜功能,毕竟第一步是把main函数看完)[c-sharp] view plaincopy?1.Init_nRF24L01_IO();2.nRF24L01_RX_MODE();3.nRF24L01_Set_Rx_Address(nRF24L01_W_REGISTER+nRF24L01_RX_ADDR_P0,Rx_Address,5);4.nRF24L01_Flush_RX_FIFO();5.nRF24L01_CE_1;6._EINT();IO接口设置好,无线模块模式设置好,再把接收的内存区设置好,然后开启中断。
简单的NRF2401A单工通信学习笔记

简单的NRF2401A单工通信学习笔记PIAE GROUP 的CAN 总线学习板除了让我们这群菜鸟学习CAN 总线外,还设计了与NRF2401 无线模块的接口电路。
关于无线模块,在做毕设的时候就接触过,那时用的是浦城公司的PT2262/PT2276 这样一对无线编码收发模块,由于时间仓促,当时没怎么玩,只是拿来和单片机做了下测试,最后并没有和程序联调,挺遗憾的,这下弄来NRF2401 该好好玩玩了。
当时PT2262 的编码原理还在Modelsim 上仿真了,感觉PT2262 的控制还是比较傻瓜型的,就是一个控制端,四个(六个)数据端,是并行传输的。
当控制端置位后就把数据端的数据编码发送到PT2272 接收。
PT2262 有一个接收状态端口接单片机的中断口,这样就可以响应并接收数据。
而NRF2401 的控制可不是这么简单,它的学习最精髓的地方就是18 个配置字的设置。
通过这些配置字的设置,决定了NRF2401 的工作方式,它与CPU 的通信是SPI 方式,也就是只要一个数据线和一个时钟线就可以完成。
另外,PT2262/2272 是单工通信,而两个NRF2401 是可以互发数据的。
今天算是入了门,弄了个最简单的实验。
上电后A 节点数码管显示0,每按下一次中断按键数码管显示加一,同时A 节点不断的发送数据到B 节点。
B 节点在数码管显示接收到的数据。
先说说A 节点发送部分的程序。
主函数如下:void main(void){CPU_init(); //初始化CPUNRF2401_init(); //初始化NRF2401Awhile(1)。
NRF2401详细注释编程程序

#include <reg52.h>#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;//****************************************NRF24L01端口定义***************************************sbit MISO =P1^5;sbit MOSI =P1^4;sbit SCK =P1^3;sbit CE =P1^1;sbit CSN =P1^2;sbit IRQ =P1^6;//************************************按键***************************************************sbit KEY1=P2^6;sbit KEY2=P2^5;//************************************数码管位选*********************************************sbit led1=P2^4;sbit led2=P3^5;//*********************************************NRF24L01*************************************#define TX_ADR_WIDTH 5 // 5 uints TX address width#define RX_ADR_WIDTH 5 // 5 uints RX address width#define TX_PLOAD_WIDTH 20 // 20 uints TX payload#define RX_PLOAD_WIDTH 20 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置//************************************************************************************** void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);//*****************************************长延时***************************************** void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}//****************************************************************************************** uint bdata sta; //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/****************************************************************************************** /*延时函数/******************************************************************************************/void inerDelay_us(unsigned char n){for(;n>0;n--)_nop_();}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){inerDelay_us(100);CE=0; // chip enableCSN=1; // Spi disableSCK=0; //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/**************************************************************************************************** /*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/****************************************************************************************************/ uint SPI_RW(uint uchar){uint bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSIuchar = (uchar << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..uchar |= MISO; // capture current MISO bitSCK = 0; // ..then set SCK low again}return(uchar); // return read uchar}/**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/****************************************************************************************************/ uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; // CSN low, initialize SPI communication...SPI_RW(reg); // Select register to read from..reg_val = SPI_RW(0); // ..then read registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value/****************************************************************************************************/ /*功能:NRF24L01读写寄存器函数/****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value){uint status;CSN = 0; // CSN low, init SPI transactionstatus = SPI_RW(reg); // select registerSPI_RW(value); // ..and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar}/****************************************************************************************************/ /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; // Set CSN low, init SPI tranactionstatus = SPI_RW(reg); // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr] = SPI_RW(0); //CSN = 1;return(status); // return nRF24L01 status uchar}/**************************************************************************************************** *****/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/**************************************************************************************************** *****/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; //SPI使能status = SPI_RW(reg);for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //SPI_RW(*pBuf++);CSN = 1; //关闭SPIreturn(status); //}/****************************************************************************************************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/****************************************************************************************************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收CE = 1;inerDelay_us(130);}/**************************************************************************************************** **//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/**************************************************************************************************** **/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT 都置高为1,通过写1来清楚中断标志return revale;}/**************************************************************************************************** *******/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送tx_buf中数据/**************************************************************************************************** ******/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}//************************************主函数************************************************************void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; //unsigned char RxBuf[20]={0};init_NRF24L01() ;led1=1;led2=1;P0=0x00;TxBuf[1] = 1 ;TxBuf[2] = 1 ;nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataDelay(6000);P0=0xBF;while(1){if(KEY1 ==0 ){TxBuf[1] = 1 ;tf = 1 ;led1=0;Delay(120);led1=1;Delay(120);}if(KEY2 ==0 ){TxBuf[2] =1 ;tf = 1 ;led2=0;Delay(120);led2=1;Delay(120);}if (tf==1){nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data TxBuf[1] = 0x00;TxBuf[2] = 0x00;tf=0;Delay(1000);}SetRX_Mode();RxBuf[1] = 0x00;RxBuf[2] = 0x00;Delay(1000);nRF24L01_RxPacket(RxBuf);..if(RxBuf[1]|RxBuf[2]){if( RxBuf[1]==1){led1=0;}if( RxBuf[2]==1){led2=0;}Delay(6000); //old is '1000' }RxBuf[1] = 0x00;RxBuf[2] = 0x00;led1=1;led2=1;} }。
NRF2401使用详解

基于NRF2401和MSP430F149实现无线通信一、实验目的:1、掌握无线通信模块NRF2401的使用方法,学会用此模块实现数据传输;2、进一步了解MSP430F149单片机的编程语言和环境。
二、实验功能:本实验完成无线通信功能,具体是通过NRF2401实现一个发送数据一个接受数据,发送端实现0~99循环发送,接收端接受数据并显示在数码管上。
注意:由于NRF2401价格不菲且易坏,所以将此模块插入到最小系统板上的插槽时应注意师父查反,正确的方向是天线端向外,且插拔时一定要断电。
三、实验原理:NRF2401是单片射频收发一体芯片,工作于2.4—2.5GHz ISM频段,适用于多种无线通信场合,如无线遥控器、无线鼠标等,且传输数据稳定,这种无线通信解决方案适合传输距离较近的无线控制项目,它只需要和处理器配合使用便能实现可靠的数据传递。
下面详细介绍如何运用MSP430单片机控制NRF2401完成无线通信。
1、RT2411模块按照设计流程,应该是根据NRF2401的datasheet搭建硬件电路,但是为了使用方便,我们使用了模块电路RT2411,RT2411是NRF2401的典型应用电路(如图1所示),使用此模块电路的好处是我们只需要将各个引脚连到单片机对应管脚,配合正确的程序就可实现无线通信功能。
相关的两个文档是《NRF2401A..pdf》和《RT2411使用手册》,尤其要注意RT2411模块价格昂贵且容易损坏,使用前一定要认真阅读《RT2411使用手册》第二页的五个注意事项,要尽量避免由于使用不当造成芯片损坏。
图1. RT2411模块实物图(左)和原理图(右)2、实验说明和硬件连接我们将做一个简单实验,由发送机连续循环发送数字1-99,接收机接收数据并将其显示到数码管上,这样可以看到实验效果:接收机数码管上循环显示数值1-99。
发送机和接收机都是由一块MSP430F149最小系统板和一个RT2411模块组成,共需两套MSP430F149最小系统板和两个RT2411模块。
nRF2401无线模块产品说明书

3.1 配置文件 ..................................................................................... 4 3.2 驱动文件 ..................................................................................... 6
2. 硬 件 模 块 说 明
nRF2401 无线模块产品说明书
图 1 nRF2401 丝印图
2.1 NRF2401 及其外围电路
nRF2401 及其外围电路如图 2 所示,包括 nRF2401 芯片部分、稳压部分、晶振部分、天线部分。电 压 VDD 为芯片提供工作电压;晶振部分包括 Y1、C11、C12,晶振 Y1 允许值为:4MHz、8MHz、12MHz、 16MHz,如果需要 1Mbps 的通信速率,则必须选择 16MHz 晶振。天线部分包括电感 L1、L2、L3(板子 自身天线)或者 L1、L3、ANT2(外接天线),用来将 nRF2401 芯片 ANT1、ANT2 管脚产生的 2.4G 电平 信号转为电磁波信号,或者将电磁波信号转换为电平信号输入芯片的 ANT1、ANT2 管脚。
R3 330 PWR_UP
VDD
CE CLK2 DATA2 CS
R5 330 R6 330 R7 330 R8 330
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <reg52.h>#include <intrins.h>typedef unsigned char uchar;typedef unsigned char uint;//****************************************NRF24L01端口定义***************************************sbit MISO =P1^5;sbit MOSI =P1^4;sbit SCK =P1^3;sbit CE =P1^1;sbit CSN =P1^2;sbit IRQ =P1^6;//************************************按键***************************************************sbit KEY1=P2^6;sbit KEY2=P2^5;//************************************数码管位选*********************************************sbit led1=P2^4;sbit led2=P3^5;//*********************************************NRF24L01*************************************#define TX_ADR_WIDTH 5 // 5 uints TX address width#define RX_ADR_WIDTH 5 // 5 uints RX address width#define TX_PLOAD_WIDTH 20 // 20 uints TX payload#define RX_PLOAD_WIDTH 20 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留//*************************************SPI(nRF24L01)寄存器地址****************************************************#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置//************************************************************************************** void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);//*****************************************长延时***************************************** void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}//****************************************************************************************** uint bdata sta; //状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;/****************************************************************************************** /*延时函数/******************************************************************************************/void inerDelay_us(unsigned char n){for(;n>0;n--)_nop_();}//****************************************************************************************/*NRF24L01初始化//***************************************************************************************/void init_NRF24L01(void){inerDelay_us(100);CE=0; // chip enableCSN=1; // Spi disableSCK=0; //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/**************************************************************************************************** /*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/****************************************************************************************************/ uint SPI_RW(uint uchar){uint bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit{MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSIuchar = (uchar << 1); // shift next bit into MSB..SCK = 1; // Set SCK high..uchar |= MISO; // capture current MISO bitSCK = 0; // ..then set SCK low again}return(uchar); // return read uchar}/**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/****************************************************************************************************/ uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; // CSN low, initialize SPI communication...SPI_RW(reg); // Select register to read from..reg_val = SPI_RW(0); // ..then read registervalueCSN = 1; // CSN high, terminate SPI communicationreturn(reg_val); // return register value/****************************************************************************************************/ /*功能:NRF24L01读写寄存器函数/****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value){uint status;CSN = 0; // CSN low, init SPI transactionstatus = SPI_RW(reg); // select registerSPI_RW(value); // ..and write value to it..CSN = 1; // CSN high againreturn(status); // return nRF24L01 status uchar}/****************************************************************************************************/ /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/****************************************************************************************************/ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; // Set CSN low, init SPI tranactionstatus = SPI_RW(reg); // Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr] = SPI_RW(0); //CSN = 1;return(status); // return nRF24L01 status uchar}/**************************************************************************************************** *****/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/**************************************************************************************************** *****/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,uchar_ctr;CSN = 0; //SPI使能status = SPI_RW(reg);for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //SPI_RW(*pBuf++);CSN = 1; //关闭SPIreturn(status); //}/****************************************************************************************************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/****************************************************************************************************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收CE = 1;inerDelay_us(130);}/**************************************************************************************************** **//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/**************************************************************************************************** **/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT 都置高为1,通过写1来清楚中断标志return revale;}/**************************************************************************************************** *******/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送tx_buf中数据/**************************************************************************************************** ******/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}//************************************主函数************************************************************void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; //unsigned char RxBuf[20]={0};init_NRF24L01() ;led1=1;led2=1;P0=0x00;TxBuf[1] = 1 ;TxBuf[2] = 1 ;nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer dataDelay(6000);P0=0xBF;while(1){if(KEY1 ==0 ){TxBuf[1] = 1 ;tf = 1 ;led1=0;Delay(120);led1=1;Delay(120);}if(KEY2 ==0 ){TxBuf[2] =1 ;tf = 1 ;led2=0;Delay(120);led2=1;Delay(120);}if (tf==1){nRF24L01_TxPacket(TxBuf); // Transmit Tx buffer data TxBuf[1] = 0x00;TxBuf[2] = 0x00;tf=0;Delay(1000);}SetRX_Mode();RxBuf[1] = 0x00;RxBuf[2] = 0x00;Delay(1000);nRF24L01_RxPacket(RxBuf);if(RxBuf[1]|RxBuf[2]){if( RxBuf[1]==1){led1=0;}if( RxBuf[2]==1){led2=0;}Delay(6000); //old is '1000' }RxBuf[1] = 0x00;RxBuf[2] = 0x00;led1=1;led2=1;}}。