NRF24LE1 NRF24LU1编程器下载器使用说明
nRF24L01 无线模块 说明书

nRF24L01 无线模块用户手册目录产品概述 (3)基本特性 (3)引脚接口说明 (4)模块尺寸 (6)nRF2401工作模式 (7)Enhanced ShockBurstTM收发模式 (7)Enhanced ShockBurstTM数据发送流程 (8)空闲模式 (9)关机模式 (9)nRF24L01模块参数设置 (9)主要参数设置 (10)程序设计分析 (10)nRF24L01初始化 (10)nRF24L01SPI写操作 (11)nRF24L01 SPI读操作 (11)nRF24L01写寄存器函数 (12)nRF24L01连续读多个寄存器函数 (12)nRF24L01连续写多个寄存器函数 (12)nRF24L01接收模式设置 (13)nRF24L01接收数据流程 (13)nRF24L01发送数据流程 (13)无线应用注意事项 (14)我们的承诺 (15)产品概述nRF24L01是挪威NordicVLSI公司出品的一款新型射频收发器件,采用4 mm×4 mm QFN20封装;nRF24L01工作在ISM频段:2.4~2.524 GHz。
且内置频率合成器、功率放大器、晶体振荡器、调制器等功能,并融合增强型ShockBurst技术,其中地址、输出功率和通信频道可通过程序进行配置,适合用于多机通信。
nRF24L01功耗很低,在以-6 dBm的功率发射时,工作电流也只有9 mA;而对应接收机的工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。
nRF24L01在业界领先的低功耗特点使其特别适合采用钮扣电池供电的2.4G应用,整个解决方案包括链路层和MultiCeiver功能提供了比现有的 nRF24XX 更多的功能和更低的电源消耗,与目前的蓝牙技术相比在提供更高速率的同时,而只需花更小的功耗基本特性(1) 2.4Ghz全球开放ISM 频段免许可证使用(2) 最高工作速率2Mbps,高效GFSK调制,抗干扰能力强(3) 125频道,满足多点通信和跳频通信需要(4) 内置硬件CRC 检错和点对多点通信地址控制(5) 低功耗1.9 - 3.6V 工作,适合电池供电应用(6) 待机模式下状态为22uA;掉电模式下为900nA(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便(8) 内置专门稳压电路,即使开关电源也有很好的通信效果(9) 标准DIP间距接口,便于嵌入式应用(10)具有自动应答机制,和CRC校验,数据通讯稳定可靠。
NRF24L01通道使用(DOC)

网上面关于多通道通信的好多资源都可以去共享,我也下了好多去调试,结果发现基本上都是调不通的。
其实这个归根到底还是一个地址匹配问题,通道0和1还好说,它是默认开启的,一般没问题,但通道2至5,通道如何匹配,数据手册上也只是说地址要匹配,到底要怎么做它没讲。
下面什么都不说了,直接上程序,这是用PIC16F877A来控制的,我会把要注意的重点标记出来,当然主要是多通道地址匹配的,其它的我就不多说了自己领悟。
接收部分:#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F88X单片机的头文件__CONFIG(XT&WDTDIS&LVPDIS&BORDIS); //定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程,禁止欠压复位#define u8 unsigned char#define u16 unsigned int#define BUZZER RB1u8 i=0,a=0,data[13]=0;#define NRF24L01_MISO RC4#define NRF24L01_MOSI RC5 //输出#define NRF24L01_SCK RC3 //输出#define NRF24L01_CE RC0 //使能控制设为输出#define NRF24L01_CSN RC2 //片选控制设为输出#define NRF24L01_IRQ RC1 //中断标志设为输入#define RS RE0#define RW RE1#define E RE2unsigned char SPIx_ReadWriteByte(unsigned char byte){unsigned char data;SSPBUF=byte;do{;}while(SSPIF==0);SSPIF=0;data=SSPBUF;return(data); // return read byte}//24L01操作线//#define NRF24L01_CE PAout(4) //24L01片选信号//#define NRF24L01_CSN PCout(4) //SPI片选信号//#define NRF24L01_IRQ PCin(5) //IRQ主机数据输入#define READ_REG 0x00 //读配置寄存器,低5位为寄存器地址#define WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址#define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节#define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字节#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.#define pop 0xFF //空操作,可以用来读状态寄存器//SPI(NRF24L01)寄存器地址#define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能#define EN_AA 0x01 //使能自动应答功能bit0~5,对应通道0~5#define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5#define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;#define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时250*x+86us#define RF_CH 0x05 //RF通道,bit6:0,工作通道频率;#define RF_SETUP 0x06 //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益#define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发//bit5:数据发送完成中断;bit6:接收数据中断;#define MAX_TX 0x10 //达到最大发送次数中断#define TX_OK 0x20 //TX发送完成中断#define RX_OK 0x40 //接收到数据中断#define OBSERVE_TX 0x08 //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器#define CD 0x09 //载波检测寄存器,bit0,载波检测;#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法#define FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RXFIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;///////////////////////////////////////////////////// /////////////////////////////////////////24L01发送接收数据宽度定义#define TX_ADR_WIDTH 5 //5字节的地址宽度#define RX_ADR_WIDTH 5 //5字节的地址宽度#define TX_PLOAD_WIDTH 32 //20字节的用户数据宽度#define RX_PLOAD_WIDTH 32 //20字节的用户数据宽度void NRF24L01_Init(void);//初始化void RX_Mode(void);//配置为接收模式void TX_Mode(void);//配置为发送模式u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//写数据区u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);//读数据区u8 NRF24L01_Read_Reg(u8 reg);//读寄存器u8 NRF24L01_Write_Reg(u8 reg, u8 value);//写寄存器u8 NRF24L01_Check(void);//检查24L01是否存在u8 NRF24L01_TxPacket(u8 *txbuf);//发送一个包的数据u8 NRF24L01_RxPacket(u8 *rxbuf);//接收一个包的数据const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x0 1}; //本地发送地址const u8 RX_ADDRESS0[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0 x01}; //接收0通道地址const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0xc2,0xc2,0xc2,0xc2,0x c1}; //接收1通道地址const u8 RX_ADDRESS2[1]={0xb3}; //接收2通道地址const u8 RX_ADDRESS3[1]={0xa5}; //接收3通道地址const u8 RX_ADDRESS4[1]={0x35}; //接收4通道地址const u8 RX_ADDRESS5[1]={0x8f}; //接收5通道地址/********************************************/void delay1(unsigned char n){unsigned int m;for(;n>0;n--)for(m=0;m<100;m++){asm("NOP");}}void lcd_busy(){TRISD7=1; /*1602上DB7=1表明总线忙,同时RS=0 选择指令寄存器,RSS=1是选择数据寄存器*/RS=0;RW=1;E=1;while(RD7==1);E=0;TRISD7=0;}void lcd_write_commend(unsigned char u){lcd_busy();RS=0;RW=0;PORTD=u;E=1;asm("NOP");E=0;}void lcd_write_data(unsigned char k){lcd_busy();RS=1;RW=0;PORTD=k;E=1;asm("NOP");E=0;}void lcd_1602_ddram_add(u8 x,u8 y)//x是列,y是行,ddram是字符显示的地址{if(y==1){lcd_write_commend(0x80+x);}if(y==2){lcd_write_commend(0xc0+x);}}void lcd_disp(unsigned char x,unsigned char y,unsigned char l){x&=0x0f;//列地址限制在0-15y&=0x01;if(y==0x00)lcd_write_commend(x|0x80); //第一行的列地址写入elselcd_write_commend((x+0x40)|0x80); //第二行的列地址写入lcd_write_data(l+0x30);}void lcd_1602_display_shu(u8 num,u16 shu,u8 x,u8 y)//在液晶的任何位置显示五位内的数字{u8 wan,qian,bai,shi,ge;if(num>=1) ge=shu%10;if(num>=2) shi=shu%100/10;if(num>=3) bai=shu%1000/100;if(num>=4) qian=shu%10000/1000; if(num==5) wan=shu/10000;lcd_1602_ddram_add(x,y);if(num==1)lcd_write_data(ge|0x30);if(num==2){lcd_write_data(shi|0x30);lcd_write_data(ge|0x30);}if(num==3){lcd_write_data(bai|0x30);lcd_write_data(shi|0x30);lcd_write_data(ge|0x30);}if(num==4){lcd_write_data(qian|0x30);lcd_write_data(bai|0x30);lcd_write_data(shi|0x30);lcd_write_data(ge|0x30);}if(num==5){lcd_write_data(wan|0x30);lcd_write_data(qian|0x30);lcd_write_data(bai|0x30);lcd_write_data(shi|0x30);lcd_write_data(ge|0x30);}}void init_1602(){TRISD=0x00;TRISE=0x00;ADCON1=0X82;PORTE=0;PORTD=0;lcd_write_commend(0x38); /*这里的设置是更具需要,选择1602的各项配置,1602共有11条指令*/delay1(100);lcd_write_commend(0x38); /*这里的设置是更具需要,选择1602的各项配置,1602共有11条指令*/delay1(100);lcd_write_commend(0x38); /*这里的设置是更具需要,选择1602的各项配置,1602共有11条指令*/delay1(100);lcd_write_commend(0x38); //8位数据,双列,5*7字形lcd_write_commend(0x08);//显示功能关,无光标lcd_write_commend(0x01);//清屏指令lcd_write_commend(0x06);//写入新的数据后,光标右移,显示屏不移动lcd_write_commend(0x0c);//显示功能开,无光标,}/**********************汉字显示的代码******************************/const u8 hz1[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x11,0x1F};//日const u8 hz2[]={0x0F,0x09,0x0F,0x09,0x0F,0x09,0x09,0x13};//月const u8 hz3[]={0x04,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02};//年const u8 hz4[]={0x1F,0x1F,0x04,0x04,0x04,0x04,0x1F,0x1F};//工const u8 hz5[]={0x0E,0x0A,0x0E,0x1F,0x04,0x07,0x03,0x01};//号void CGRAM(const u8 *hz,const u8 temp) //自定义字符存储{u8 i;for(i=0;i<8;i++){lcd_write_commend(temp+i);lcd_write_data(*(hz+i));}}/*******************************************///SPI写寄存器//reg:指定寄存器地址//value:写入的值u8 NRF24L01_Write_Reg(u8 reg,u8 value){u8 status;NRF24L01_CSN=0; //使能SPI传输status =SPIx_ReadWriteByte(reg);//发送寄存器号SPIx_ReadWriteByte(value); //写入寄存器的值NRF24L01_CSN=1; //禁止SPI传输return(status); //返回状态值}//读取SPI寄存器值//reg:要读的寄存器u8 NRF24L01_Read_Reg(u8 reg){u8 reg_val;NRF24L01_CSN = 0; //使能SPI传输SPIx_ReadWriteByte(reg); //发送寄存器号reg_val=SPIx_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN = 1; //禁止SPI传输return(reg_val); //返回状态值}//在指定位置读出指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len){u8 status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status=SPIx_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPIx_Rea dWriteByte(0XFF);//读出数据NRF24L01_CSN=1; //关闭SPI传输return status; //返回读到的状态值}//在指定位置写指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len){u8 status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status = SPIx_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPIx_ReadWriteByte(*pBuf++); //写入数据NRF24L01_CSN = 1; //关闭SPI传输return status; //返回读到的状态值}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:0,接收完成;其他,错误代码u8 NRF24L01_RxPacket(u8 *rxbuf){u8 sta;//SPIx_SetSpeed(SPI_SPEED_8); //spi速度为9Mhz (24L01的最大SPI时钟为10Mhz)sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&RX_OK)//接收到数据{NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WID TH);//读取数据NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器return 0;}return 1;//没收到任何数据}//该函数初始化NRF24L01到RX模式//设置RX地址,写RX数据宽度,选择RF频道,波特率和LNA HCURR //当CE变高后,即进入RX模式,并可以接收数据了void RX_Mode(void){NRF24L01_CE=0;NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)TX_ ADDRESS,RX_ADR_WIDTH);//接收设备接收通道0使用和发送设备相同的发送地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P1,(u8*)RX_ ADDRESS1,RX_ADR_WIDTH);//接收设备接收通道1使用和发送设备相同的发送地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P2,(u8*)RX_ ADDRESS2,1);//接收设备接收通道2使用和发送设备相同的发送地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P3,(u8*)RX_ ADDRESS3,1);//接收设备接收通道3使用和发送设备相同的发送地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P4,(u8*)RX_ ADDRESS4,1);//接收设备接收通道4使用和发送设备相同的发送地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P5,(u8*)RX_ ADDRESS5,1);//接收设备接收通道5使用和发送设备相同的发送地址NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x3f);//使能通道0到5的自动应答NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x3f);//使能通道0到5的接收地址NRF24L01_Write_Reg(WRITE_REG+RF_CH,40); //设置RF通信频率NRF24L01_Write_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_ WIDTH);//选择通道0的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RX_PW_P1,RX_PLOAD_ WIDTH);//选择通道1的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RX_PW_P2,RX_PLOAD_ WIDTH);//选择通道2的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RX_PW_P3,RX_PLOAD_ WIDTH);//选择通道3的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RX_PW_P4,RX_PLOAD_ WIDTH);//选择通道4的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RX_PW_P5,RX_PLOAD_ WIDTH);//选择通道5的有效数据宽度NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f);//设置TX发射参数,0db增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式NRF24L01_CE = 1; //CE为高,进入接收模式}void delay(unsigned int m){unsigned int n;n=m;for(;n>0;n--)NOP();}void spi_init(){TRISC=0x13;SSPSTAT=0xc0;SSPCON=0x20;}void INT1(){TRISB=0x00;PORTB=0xfc;INTEDG = 1;INTF = 0;INTE = 1;GIE = 1;}void main(){u8 x=3;spi_init();init_1602();INT1();NRF24L01_CE=0;// chip enableNRF24L01_CSN=1;// Spi disable//NRF24L01_SCK=0;// Spi clock line init highCGRAM(hz1,0x40);CGRAM(hz2,0x48);CGRAM(hz3,0x50);CGRAM(hz4,0x58);CGRAM(hz5,0x60);//将这五个字写到1602用户自定义CGRAM中while(1){RX_Mode();NOP();if(NRF24L01_RxPacket(data)==0){lcd_write_commend(0x80);//第一行第一个字lcd_write_data(0x52);//显示接收的字母Rlcd_1602_display_shu(4,2013,x,1);//显示4位数的年份lcd_write_data(2); //显示汉字年lcd_1602_display_shu(2,8,x+5,1);//显示月份lcd_write_data(1); //显示汉字月lcd_1602_display_shu(2,7,x+8,1);//显示日期lcd_write_data(0); //显示汉字日lcd_write_commend(0xc0);//第二行显示lcd_write_data(3); //显示汉字工lcd_write_data(4); //显示汉字号lcd_write_commend(0xc0|0x02);//隔两格lcd_write_data(0x3A);//显示封号for(i=0;i<13;i++)//显示工人编号{lcd_disp(i+3,1,data[i]);}if(data[12]==1)RB0=1;elseRB0=0;}}}void interrupt ISR(void) {u16 y;if(INTF == 1){INTF = 0;asm("NOP");for(y=0;y<4000;y++){BUZZER=1;delay(20);BUZZER=0;}}}发送部分:#include <pic.h> //调用头文件,可以去PICC软件下去查找PIC16F88X单片机的头文件__CONFIG(XT&WDTDIS&LVPDIS&BORDIS); //定义配置字,晶振类型:XT,关闭开门狗,禁止低电压编程,禁止欠压复位#define u8 unsigned char#define u16 unsigned int#define key RB0u8 test[13]={2,0,1,2,5,8,0,8,0,2,1,5};u16 i=0;#define NRF24L01_MISO RC4#define NRF24L01_MOSI RC5 //输出#define NRF24L01_SCK RC3 //输出#define NRF24L01_CE RC0 //使能控制设为输出#define NRF24L01_CSN RC2 //片选控制设为输出#define NRF24L01_IRQ RC1 //中断标志设为输入*/#define RS RE0 //数据/命令选择#define RW RE1 //读/写选择#define E RE2 //使能信号unsigned char SPIx_ReadWriteByte(unsigned char byte){unsigned char data;SSPBUF=byte;do{;}while(SSPIF==0);SSPIF=0;data=SSPBUF;return(data); // return read byte}#define READ_REG 0x00 //读配置寄存器,低5位为寄存器地址#define WRITE_REG 0x20 //写配置寄存器,低5位为寄存器地址#define RD_RX_PLOAD 0x61 //读RX有效数据,1~32字节#define WR_TX_PLOAD 0xA0 //写TX有效数据,1~32字#define FLUSH_TX 0xE1 //清除TX FIFO寄存器.发射模式下用#define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用#define REUSE_TX_PL 0xE3 //重新使用上一包数据,CE为高,数据包被不断发送.#define pop 0xFF //空操作,可以用来读状态寄存器//SPI(NRF24L01)寄存器地址#define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0发射模式;bit1:电选择;bit2:CRC模式;bit3:CRC使能;//bit4:中断MAX_RT(达到最大重发次数中断)使能;bit5:中断TX_DS使能;bit6:中断RX_DR使能#define EN_AA 0x01 //使能自动应答功能bit0~5,对应通道0~5#define EN_RXADDR 0x02 //接收地址允许,bit0~5,对应通道0~5#define SETUP_AW 0x03 //设置地址宽度(所有数据通道):bit1,0:00,3字节;01,4字节;02,5字节;#define SETUP_RETR 0x04 //建立自动重发;bit3:0,自动重发计数器;bit7:4,自动重发延时250*x+86us#define RF_CH 0x05 //RF通道,bit6:0,工作通道频#define RF_SETUP 0x06 //RF寄存器;bit3:传输速率(0:1Mbps,1:2Mbps);bit2:1,发射功率;bit0:低噪声放大器增益#define STATUS 0x07 //状态寄存器;bit0:TX FIFO满标志;bit3:1,接收数据通道号(最大:6);bit4,达到最多次重发//bit5:数据发送完成中断;bit6:接收数据中断;#define MAX_TX 0x10 //达到最大发送次数中断#define TX_OK 0x20 //TX发送完成中断#define RX_OK 0x40 //接收到数据中断#define OBSERVE_TX 0x08 //发送检测寄存器,bit7:4,数据包丢失计数器;bit3:0,重发计数器#define CD 0x09 //载波检测寄存器,bit0,载波检测;#define RX_ADDR_P0 0x0A //数据通道0接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P1 0x0B //数据通道1接收地址,最大长度5个字节,低字节在前#define RX_ADDR_P2 0x0C //数据通道2接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P3 0x0D //数据通道3接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P4 0x0E //数据通道4接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define RX_ADDR_P5 0x0F //数据通道5接收地址,最低字节可设置,高字节,必须同RX_ADDR_P1[39:8]相等;#define TX_ADDR 0x10 //发送地址(低字节在前),ShockBurstTM模式下,RX_ADDR_P0与此地址相等#define RX_PW_P0 0x11 //接收数据通道0有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P1 0x12 //接收数据通道1有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P2 0x13 //接收数据通道2有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P3 0x14 //接收数据通道3有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P4 0x15 //接收数据通道4有效数据宽度(1~32字节),设置为0则非法#define RX_PW_P5 0x16 //接收数据通道5有效数据宽度(1~32字节),设置为0则非法#define FIFO_STATUS 0x17 //FIFO状态寄存器;bit0,RX FIFO寄存器空标志;bit1,RX FIFO满标志;bit2,3,保留//bit4,TX FIFO空标志;bit5,TX FIFO满标志;bit6,1,循环发送上一数据包.0,不循环;///////////////////////////////////////////////////// ///////////////////////////////////////////////////////24L01发送接收数据宽度定义#define TX_ADR_WIDTH 5 //5字节的地址宽度#define RX_ADR_WIDTH 5 //5字节的地址宽度#define TX_PLOAD_WIDTH 32 //20字节的用户数据宽度#define RX_PLOAD_WIDTH 32 //20字节的用户数据宽度void NRF24L01_Init(void);//初始化void RX_Mode(void);//配置为接收模式void TX_Mode(void);//配置为发送模式u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//写数据区u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s);//读数据区u8 NRF24L01_Read_Reg(u8 reg);//读寄存器u8 NRF24L01_Write_Reg(u8 reg, u8 value);//写寄存器u8 NRF24L01_Check(void);//检查24L01是否存在u8 NRF24L01_TxPacket(u8 *txbuf);//发送一个包的数据u8 NRF24L01_RxPacket(u8 *rxbuf);//接收一个包的数据//下面这里就是重点啦,看看我用线条标出的是32位公用的地址,红色部分是低八位,注意位置啊啊啊啊啊啊const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x35,0xc2,0xc2,0xc2,0xc 1}; //发送地址const u8 RX_ADDRESS0[RX_ADR_WIDTH]={0x35,0xc2,0xc2,0xc2,0x c1}; //接收3通道地址,就以通道3为例,其它都一个样//SPI写寄存器//reg:指定寄存器地址//value:写入的值u8 NRF24L01_Write_Reg(u8 reg,u8 value){u8 status;NRF24L01_CSN=0; //使能SPI传输status =SPIx_ReadWriteByte(reg);//发送寄存器号SPIx_ReadWriteByte(value); //写入寄存器的值NRF24L01_CSN=1; //禁止SPI传输return(status); //返回状态值}//读取SPI寄存器值//reg:要读的寄存器u8 NRF24L01_Read_Reg(u8 reg){u8 reg_val;NRF24L01_CSN = 0; //使能SPI传输SPIx_ReadWriteByte(reg); //发送寄存器号reg_val=SPIx_ReadWriteByte(0XFF);//读取寄存器内容NRF24L01_CSN = 1; //禁止SPI传输return(reg_val); //返回状态值}//在指定位置读出指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len){u8 status,u8_ctr;NRF24L01_CSN =0; //使能SPI传输status=SPIx_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPIx_ReadWriteByte(0XFF);//读出数据NRF24L01_CSN=1; //关闭SPI传输return status; //返回读到的状态值}//在指定位置写指定长度的数据//reg:寄存器(位置)//*pBuf:数据指针//len:数据长度//返回值,此次读到的状态寄存器值u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len){u8 status,u8_ctr;NRF24L01_CSN = 0; //使能SPI传输status = SPIx_ReadWriteByte(reg);//发送寄存器值(位置),并读取状态值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPIx_ReadWriteByte(*pBuf++); //写入数据NRF24L01_CSN = 1; //关闭SPI传输return status; //返回读到的状态值}void delay(unsigned int n){for(;n>0;n--)NOP();}//启动NRF24L01发送一次数据//txbuf:待发送数据首地址//返回值:发送完成状况u8 NRF24L01_TxPacket(u8 *txbuf){u8 sta;//SPIx_SetSpeed(SPI_SPEED_8);//spi速度为9Mhz (24L01的最大SPI时钟为10Mhz)NRF24L01_CE=0; NRF24L01_IRQ=0;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WID TH);//写数据到TX BUF 32个字节delay(5000);NRF24L01_CE=1;//启动发送delay(5000);while(NRF24L01_IRQ!=0);//等待发送完成sta=NRF24L01_Read_Reg(STATUS); //读取状态寄存器的值NRF24L01_Write_Reg(WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中断标志if(sta&MAX_TX)//达到最大重发次数{NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器return MAX_TX;}if(sta&TX_OK)//发送完成{return TX_OK;}elsereturn 0xff;//其他原因发送失败}//该函数初始化NRF24L01到TX模式//设置TX地址,写TX数据宽度,设置RX自动应答的地址,填充TX发送数据,选择RF频道,波特率和LNA HCURR//PWR_UP,CRC使能//当CE变高后,即进入RX模式,并可以接收数据了//CE为高大于10us,则启动发送.void TX_Mode(void){NRF24L01_CE=0;NRF24L01_Write_Buf(WRITE_REG+TX_ADDR,(u8*)TX_ADD RESS,TX_ADR_WIDTH);//写TX节点地址NRF24L01_Write_Buf(WRITE_REG+RX_ADDR_P0,(u8*)RX_ ADDRESS0,RX_ADR_WIDTH); //设置RX节点地址,主要为了使能ACK,TX_ADDRESS和RX_ADDRESS0一定要一致,不然就调不通的NRF24L01_Write_Reg(WRITE_REG+EN_AA,0x01);//使能通道0的自动应答NRF24L01_Write_Reg(WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址NRF24L01_Write_Reg(WRITE_REG+SETUP_RETR,0x1a);//设置自动重发间隔时间:500us + 86us;最大自动重发次数:10次NRF24L01_Write_Reg(WRITE_REG+RF_CH,40);//设置RF通道为40NRF24L01_Write_Reg(WRITE_REG+RF_SETUP,0x0f); //设置TX发射参数,0db增益,2Mbps,低噪声增益开启NRF24L01_Write_Reg(WRITE_REG+CONFIG,0x0e);//配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断NRF24L01_CE=1;//CE为高,10us后启动发送NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}void delay1(unsigned int n){unsigned int m;for(;n>0;n--)for(m=0;m<100;m++){asm("NOP");}}void read_1602_bz()//测忙{TRISD7=1;RS=0;RW=1;E=1;while(RD7==1);E=0;TRISD7=0;}void write_1602_dat(u8 data_1)//写数据{read_1602_bz();RS=1;RW=0;PORTD=data_1;delay(5);E=1;delay(5);E=0;}void write_1602_com(u8 com)//写指令{read_1602_bz();RS=0;RW=0;PORTD=com;delay(5);E=1;delay(5);E=0;}void lcd_1602_ddram_add(u8 x,u8 y)//x是列,y是行,ddram是字符显示的地址{if(y==1){write_1602_com(0x80+x);}if(y==2){write_1602_com(0xc0+x);}}void lcd_disp(unsigned char x,unsigned char y,unsigned charl){x&=0x0f;//列地址限制在0-15y&=0x01;if(y==0x00)write_1602_com(x|0x80); //第一行的列地址写入elsewrite_1602_com((x+0x40)|0x80); //第二行的列地址写入write_1602_dat(l+0x30);}void lcd_1602_display_shu(u8 num,u16 shu,u8 x,u8 y)//在液晶的任何位置显示五位内的数字{u8 wan,qian,bai,shi,ge;if(num>=1) ge=shu%10;if(num>=2) shi=shu%100/10;if(num>=3) bai=shu%1000/100;if(num>=4) qian=shu%10000/1000;if(num==5) wan=shu/10000;lcd_1602_ddram_add(x,y);if(num==1)if(num==2){write_1602_dat(shi|0x30); write_1602_dat(ge|0x30); }if(num==3){write_1602_dat(bai|0x30); write_1602_dat(shi|0x30); write_1602_dat(ge|0x30); }if(num==4){write_1602_dat(qian|0x30); write_1602_dat(bai|0x30); write_1602_dat(shi|0x30); write_1602_dat(ge|0x30); }if(num==5){write_1602_dat(wan|0x30);write_1602_dat(bai|0x30);write_1602_dat(shi|0x30);write_1602_dat(ge|0x30);}}/**********************汉字显示的代码******************************/const u8 hz1[]={0x1F,0x11,0x11,0x1F,0x11,0x11,0x11,0x1F};//日const u8 hz2[]={0x0F,0x09,0x0F,0x09,0x0F,0x09,0x09,0x13};//月const u8 hz3[]={0x04,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x02};//年void CGRAM(const u8 *hz,const u8 temp) //自定义字符存储{u8 i;for(i=0;i<8;i++){write_1602_com(temp+i);write_1602_dat(*(hz+i));}void init_1602(){TRISE=0x00;TRISD=0x00;//ADCON1=0X82;PCFG3=0;PCFG2=1;PCFG1=1;PCFG0=1; //A端口全部数字化PORTE=0;PORTD=0;write_1602_com(0x38);delay(50);write_1602_com(0x38);delay(50);write_1602_com(0x38);delay(50);write_1602_com(0x0c);write_1602_com(0x06);write_1602_com(0x01);void spi_init(){TRISC=0x13;SSPCON=0x20;SSPSTAT=0xc0;PIR1=0;}void main(){u8 x=3;TRISB0=0;spi_init();init_1602();CGRAM(hz1,0x40);CGRAM(hz2,0x48);CGRAM(hz3,0x50);//将这三个字写到1602用户自定义CGRAM中NRF24L01_CE=0; //使能24L01NRF24L01_CSN=1;//SPI片选取消SPIx_ReadWriteByte(0xff);//启动传输while(1){TX_Mode();if(key==0){delay(1);if(key==0)test[12]=1;}elsetest[12]=0;if(NRF24L01_TxPacket(test)==TX_OK){write_1602_com(0x80);//第一行第一个位置write_1602_dat(0x53);//显示发送的字母Slcd_1602_display_shu(4,2013,x,1);//显示4位数的年份write_1602_dat(2); //显示汉字年lcd_1602_display_shu(2,8,x+5,1);//显示月份write_1602_dat(1); //显示汉字月lcd_1602_display_shu(2,7,x+8,1);//显示日期write_1602_dat(0); //显示汉字日write_1602_com(0xc0);//第二行显示write_1602_dat(0x49); //显示字母Iwrite_1602_dat(0x44); //显示字母Dwrite_1602_com(0xc0|0x02);//隔两格write_1602_dat(0x3A);//显示封号for(i=0;i<13;i++)//显示工人编号{lcd_disp(i+3,1,test[i]);}}}}。
NRF24L01详细教程

NRF24L01详细教程近来课程的项目需要用到NRF24L01,用来做基本的收发,虽然资料拿到不少,但是,很多资料并不是很清晰、所带的例程并不够简洁或有不少冗余的部分,再加上对应的中文数据手册部分没翻译出来,翻译出来的不够有条理,很多地方模糊,甚至关键的地方看一两次还看不出来,导致了在学NRF24L01时花费了较多时间,所以,学完NRF24L01后,萌生了写个尽量清晰的教程的想法。
教程中的例程虽然是库开发方式,但基本都是最底层的操作才用到库函数譬如发一字节数据、GPIO置位等,虽然用的STM32,但我在看其他板子的例程时,发觉内容与流程都是差不多的,只是不同板引脚不同所导致的引脚配置的不同,不管用什么方式开发,用什么芯片,了解清楚NRF24L01如何配置,了解清楚其收发流程,基本上就会开发了,所以此文档虽然写的是以STM32为例,但看完此文档用NRF24L01基本也没什么大问题了。
教程说明:这教程是基于STMF103ZET6的,是野火的板子,例程也是从野火提供修改例程得来,用的是库开发的方式。
学习NRF24L01的步骤:1.学习SPI,SPI就是NRF24L01传送数据到单片机的一种协议,类似于USB,当然USB还是比较有难度的。
2.了解NRF24L01相关寄存器,结合中文数据手册了解NRF24L01的基本配置,收发数据前后的操作(如何启动发送接收、寄存器清空、标志位重置等)。
3.分析具体代码SPI的简介:具体的SPI教程,大家可以去野火的教程进行学习,在此只是简略介绍一下,SPI是一种一对多协议:一个主机(MCU)对应对多个从机,可以分时与多个从机通讯SPI 总线包含4 条总线,分别为SS、SCK、MOSI、MISO,其含义分别为SS:Slave Select,片选信号线,主机借此信号线选择一个从机,低电平有效。
MOSI:Master Output,Slave Input,主机数据从此线输出到从机,数据方向从主机到从机。
nRF24LU1快速开发系统使用手册

nRF24LU1-Quick-Dev 快速开发系统使用手册使用nRF24LU1-Quick-Dev 前请认真阅读本手册说明以及nRF24LU1的数据手册为了便于用户开发应用先进的nRF24LU1 USB+8051 Flash MCU+高速2Mbps2.4GHz 无线芯片,迅通科技提供nRF24LU1快速开发系统。
nRF24LU1开发系统包括两个无线高速USB 模块、两个开发板,MINI USB Dongle ,详细源代码,原理图,资料光盘,开发板上有按键和指示灯等,加电即可使用,可完成USB HID 协议和无线数据高速传输的全部功能,可方便地进行性能以及距离评测,并迅速掌握nRF24LU1的USB 设备开发以及高速无线通信编程和协议的设计。
时间 缩短您的开发时间,建立您对RF 产品开发的信心; 风险 接近实用的评估板,方便验证和改进,零风险;费用 只需不到一个工程师一个月的薪水或您预算内很小一部分 市场 可对多种产品及应用进行验证,实现平台式的验证与应用资料 技术资料全,上手快,可以使您立刻进入与世界同步的无线设计领域;1、 n RF24LU1-Quick-Dev 快速开发系统的安装示意图:2、nRF24LU1-Quick-Dev 开发板的安装:1、按照安装示意图,将nRF24LU1无线模块安装在开发板上。
请注意无线模块的安装方向!2、开发板上跳线帽接VBUS 端,nRF24LU1无线模块上跳线接帽VBAT 端。
3、开发板采用USB 端口供电,用USB 连线将开发板与PC 机的USB 端口连接即可工作。
3、nRF24LU1-Quick-Dev 开发板演示程序的使用:1、源代码说明程序源代码在 \ SOURCE CODE 目录上,程序分为USB DONGLE 部分和WDP KEYBOARD 部分。
该程序的特点是内嵌“WIRELESS DESKTOP PROTOCOL (简称WDP )”的协议,具有抗干扰、可靠、省电等优点,实用性强,可应用于产品设计。
迷你版的NRF24L01配置说明20150226

迷你版的NRF24L01无线模块配置说明(USB转TTL模块)(配置接线图)迷你版的NRF24L0L无线模块得借助USB转TTL模块进行配置;(如上图所示) 1、宽电压设计:3V-5.5V供电,即可以与3.3V或5V的MCU或者ARM链接使用;(文件在“CH341>>DRIVER>SETUP.EXE)2、USB转TTL模块需要安装CH341驱动;3、波特率出货默认为9600,波特率的选择范围为:2400-115200,具体,请看配置参数对应的描述;4、串口调试助手中HEX就是指十六进制,记得要勾上HEX显示与HEX发送;5、配置的格式为10个字节(配置时,不需要‘+’号,字节之间一个空格键即可):“每个数据包的长度 + 波特率 + 频道 + 5个字节的地址 + 2个CRC校验字节”1个字节 1个字节 1个字节 5个字节 2个字节6、模块采用了ModBus CRC校验协议,CRC校验字节得用CRC校验码计算器得出;7、CRC校验字节是由前面的8个字节计算而来,以保证数据传输的安全性;8、模块是成对存在的,两个模块的参数得配置成一样;9、同一个实验室的,为了不互相影响,得把频道设置成不一样,或者把地址设置成不一样,否则会互相干扰,;10、发送10个配置字节数据,返回8个字节以代表配置成功;11、数据的长度得选择适中,串口调试助手(或单片机)的发送频率也得选择适中;(图1)(图2)(图3)(图4)(图5)(图6)(图7)(图8)CRC校验字节的由来模块的配置参考了ModBus CRC 校验协议,ModBus CRC校验协议是为保证数据传输的安全性,CRC校验字节由如下软件生成:把“数据长度”,“波特率”,“频道”,“地址”等配置数据输入到CRC校验码计算器,点击下“计算”即可得出两个CRC校验字节;得出CRC校验字节后,把8个字节数据+2个CRC校验字节数据输入到串口调试助手,点击发送即可;如果CRC校验字节错误的话,那组配置参数会被模块忽略掉,认为那组配置数据有误;(只是在配置时存在着CRC校验,正常使用时没有CRC校验这个说法)注意:由于配置模块得用10个字节长度的数据包进行配置,如果非得把模块的“数据长度”配置成10的话(即正常使用时,每次传输10个字节数据),只要最后两个字节不是按照ModBus CRC校验协议得来的数据,模块能正常使用,即每次传输10个字节数据;否则,那10个字节的数据包是在修改模块的工作参数,即在配置模块;常见异常情况:1、两个模块,配置的参数不对应,如数据长度,频道;2、电源不纯,就是有干扰波,高频电路对电源的要求很高,这种情况得加滤波电容;3、只能进行通信一次的,这种情况,比较常见的原因也是:电源不纯,有干扰波;。
nRF24L01P产品说明书V1.0综述

nRF24L01+单片机2.4 GHz收发器产品说明书v1.0主要功能:全球通用的2.4 GHz ISM波段操作250kbps, 1Mbps and 2Mbps空中数据传输速率超低功率运行发射功率为0dBm(1.0mW)时,发射电流为11.3mA2Mbps空中数据传输速率,接收电流为13.5mA掉电电流为900nA待机-I电流26μA片内电压调整器1.9至3.6V电源供电范围增强型ShockBurst TM自动数据包处理自动包数据包事务处理6数据通道的MultiCeiver TM与nRF24L01嵌入式兼容空中数据速率250kbps 和1Mbps,与nRF2401A,nRF2402, nRF24E1和nRF24E2兼容低BOM成本±60ppm 16MHz晶振容许5V输入紧凑的20引脚4x4mm QFN封装应用无线 PC外围设备鼠标,键盘和遥控器三和一桌面捆绑先进的媒体中心遥控器网络电话耳机游戏控制器蓝牙模块运动手表和传感器消费电子产品射频遥控器家庭和商业自动化超低功率无线传感器网络RFID 射频识别资产跟踪系统玩具免责条款北欧半导体ASA有权做出随时更改,提高产品可靠性、功能或设计,不另行通知。
北欧半导体ASA不承担由于应用程序或使用任何所述产品或电路引起的责任。
所有应用程序的信息咨询,不构成说明书的组成部分。
极限值超过一个或多个限制的应力可能会造成设备永久性损坏。
这些应力等级只有在这样或那样的操作环境中提出,在规范中没有给出。
长时间暴露在限制值附近可能会影响设备的可靠性。
生命支持应用这些产品并非为因故障会引起人身伤害的维生装备,设备或系统设计的。
北欧半导体ASA客户使用或出售这些产品,他们将自担风险并同意完全赔偿北欧半导体ASA因使用不当或销售行为造成任何损害。
详细联系方式访问www.nordicsemi.no进入北欧半导体销售办事处和全世界的分销商网站总办公室:Otto Nielsens vei 127004 Trondheim电话: +47 72 89 89 00传真: +47 72 89 89 89www.nordicsemi.no写作惯例本产品规范遵循一套排版规则,文档一致,容易阅读。
【电子模块设计】NRF24L01使用说明书

NRF24L01使用说明1 NRF24L01功能框图Fig.1 NRF24L01 BLOCK DIAGRAMNRF24L01的框图如 Fig.1所示,从单片机控制的角度来看,我们只需要关注 Fig.1右面的六个控制和数据信号,分别为 CSN、SCK、MISO、MOSI、IRQ、CE。
CSN:芯片的片选线,CSN为低电平芯片工作。
SCK:芯片控制的时钟线(SPI时钟)MISO:芯片控制数据线(Master input slave output)MOSI:芯片控制数据线(Master output slave input)IRQ:中断信号。
无线通信过程中 MCU主要是通过 IRQ与 NRF24L01进行通信。
CE:芯片的模式控制线。
在 CSN为低的情况下,CE协同 NRF24L01的 CONFIG寄存器共同决定 NRF24L01的状态(参照 NRF24L01的状态机)。
2 NRF24L01状态机NRF24L01的状态机见 Fig.2所示,对于 NRF24L01的固件编程工作主要是参照NRF24L01的状态机。
主要有以下几个状态Power Down Mode:掉电模式Tx Mode:发射模式Rx Mode:接收模式Standby-1Mode:待机1模式Standby-2 Mode:待机2模式上面五种模式之间的相互切换方法以及切换所需要的时间参照 Fig.2。
Fig.2 NRF24L01 State Machine对 24L01的固件编程的基本思路如下:1)置 CSN为低,使能芯片,配置芯片各个参数。
(过程见 3.Tx与 Rx的配置过程)配置参数在 Power Down状态中完成。
2)如果是 Tx模式,填充 Tx FIFO。
3)配置完成以后,通过 CE与 CONFIG中的 PWR_UP与 PRIM_RX参数确定 24L01 要切换到的状态。
Tx Mode:PWR_UP=1; PRIM_RX=0; CE=1 (保持超过 10us就可以);Rx Mode: PWR_UP=1; PRIM_RX=1; CE=1;4) IRQ引脚会在以下三种情况变低:Tx FIFO发完并且收到 ACK(使能 ACK情况下)Rx FIFO收到数据达到最大重发次数将 IRQ接到外部中断输入引脚,通过中断程序进行处理。
nRF24L01无线通信模块使用手册12要点

nRF24L01无线通信模块使用手册12要点nRF24L01无线通信模块使用手册一、模块简介该射频模块集成了NORDIC公司生产的无线射频芯片nRF24L01:1.支持2.4GHz的全球开放ISM频段,最大发射功率为0dBm2.2Mbps,传输速率高3.功耗低,等待模式时电流消耗仅22uA4.多频点(125个),满足多点通信及跳频通信需求5.在空旷场地,有效通信距离:25m(外置天线)、10m(PCB 天线)6.工作原理简介:发射数据时,首先将nRF24L01配置为发射模式,接着把地址TX_ADDR和数据TX_PLD 按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10μs,延迟130μs后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号。
如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从发送堆栈中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC_CNT)达到上限,MAX_RT置高,TX_PLD不会被清除;MAX_RT或TX_DS置高时,使IRQ变低,以便通知MCU。
最后发射成功时,若CE为低,则nRF24L01进入待机模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入待机模式2。
接收数据时,首先将nRF24L01配置为接收模式,接着延迟130μs进入接收状态等待数据的到来。
当接收方检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位RX_DR置高,IRQ变低,以便通知MCU去取数据。
若此时自动应答开启,接收方则同时进入发射状态回传应答信号。
最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。
三、模块引脚说明四、模块与AT89S52单片机接口电路注:上图为示意连接,可根据自己实际需求进行更改;使用AT89S52MCU模块时,请将Nrf24L01通讯模块每个端口(MOSI、SCK、CSN和CE)接4.7K的排阻上拉到VCC增强其驱动能力(如下图:)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mPro 编程器使用说明
软件更新:
编程器购买: RMB88!!
1、 使用真正USB2.0芯片,稳定可靠,不会出现识别不了USB 设备的情况
2、 支持芯片丰富,并可通过更新固件支持更多器件(升级固件无须编程器)
3、 体积小,携带方便
4、 支持5V 和3.3V 芯片
5、 其他功能:USB 温湿度计 USB 电脑遥控器 USB 开发板 USB 转串口
6、 及时修复各种问题并不断添加功能
7、 支持HEX 及BIN 编程文件格式
通讯接口:USB2.0
供电方式:USB 供电,目标板无需供电 接口驱动:支持5V 和 3.3V
支持芯片:51 A VR STC nRF24LXX PL3K 系列 EEPROM … 软件升级:支持升级以支持更多芯片 尺寸:4.5*2cm
Pin1
Pin2
Pin3 Pin5 Pin7 Pin9 Pin4 Pin6
Pin8 Pin10
连接目标板前请一定要看看是3.3V 还是5V 供电并正确设置跳线,以免烧坏芯片
上位机软件:。