NRF24LE1 NRF24LU1编程器下载器使用说明

合集下载

nRF24L01 无线模块 说明书

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)

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时花费了较多时间,所以,学完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快速开发系统使用手册

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配置说明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综述

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使用说明书

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无线通信模块使用手册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增强其驱动能力(如下图:)。

nRF24L01

nRF24L01

最近百度上一些朋友都在为nRF24L01头疼,我这段时间又比较忙不能花太多时间一个一个去帮忙调试,干脆今天抽点儿时间写个应用笔记,希望能给大家提供一些方法和帮助。

有问题可以跟帖留言,我看到会尽量帮大家。

nRF24L01是Nordic公司生产的一个单芯片射频收发器件,是目前应用比较广泛的一款无线通讯芯片,具体手册资料网上大把,我就不再重复它的特性什么的了,直接说说它的调试方法,供大家参考。

24L01是收发双方都需要编程的器件,这就对调试方法产生了一定的要求,如果两块一起调,那么通讯不成功,根本不知道是发的问题还是收的问题,不隐晦的说,我当时也是没理清调试思路才浪费了大半天时间看着模块干瞪眼。

正确的方法应该是先调试发送方,能保证发送正确,再去调接收,这样就可以有针对性的解决问题。

至于怎么去调发送方,先说下发送方的工作流程:·配置寄存器使芯片工作于发送模式后拉高CE端至少10us·读状态寄存器STA TUS·判断是否是发送完成标志位置位·清标志·清数据缓冲网上的程序我也看过,大多都是成品,发送方发送-等应答-(自动重发)-触发中断。

可是这样的流程就已经把接收方给牵涉进来了,就是说一定要接收方正确收到数据并且回送应答信号之后发送方才能触发中断,结束一次完整的发送。

可是这跟我们的初衷不相符,我们想单独调试发送,完全抛开接收,这样就要去配置一些参数来取消自动应答,取消自动重发,让发送方达到发出数据就算成功的目的。

SPI_RW_Reg(WRITE_REG + EN_AA, 0x00); // 失能通道0自动应答SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x00); // 失能接收通道0SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x00); // 失能自动重发(注:以下贴出的寄存器描述由于中文资料上有一个错误,故贴出原版英文资料)有了以上这三个配置,发送方的流程就变成了发送-触发中断。

NRF24L01模块系列说明书

NRF24L01模块系列说明书
13 问:你们提供些单片机的程序?
答:原厂给的标准收发演示例程,有 51 PIC STM32 的,都是标准 C 语言编写, 因此即使移植其它单片机也很快
14 问:拿到模块和程序后,自己焊接测试电路和移植程序,下载进去后通讯不 了。
答:首先不用怀疑模块的问题。生产工艺成熟,不良率在不测试时候低于 1%, 何况全部测试,不良率低于千分之一。大部分新手自己焊接电路移植程序不良是 因为移植时候硬件错误或者软件增删错误引起,因为即使很小点错误,也能导致 整个程序的失效,所以建议自己移植程序时候要很小心,尽量照搬我们的例程, 等整个程序跑起来再做修改。若实在搞不定,可以借用我们的测试板,或者付出 很少费用就能买到配套的测试板,这样能给客户节省不少的时间。
11 问 NRF24L01 系列模块可以一对多发送或者多对一接收吗?
答:完全可以,70%客户都这么用的。
12 问:我是新手,你们提供哪些方面的技术支持?
答:2.4G 系列模块属于有点技术难度的产品,若完全依靠客户参照规格书 写程序,会浪费客户一个多礼拜的时间,比较幸运的是我们提供了参考程序,并 且提供和程序配套的测试板借用或购买,可以让客户快速体验模块的性能。建议 项目比较急的客户选用,价格每个 20 元成本价格销售,可以给客户节省好几天 的调试时间,很划算。
答:一款原产台湾,一款原产品挪威,随着众多 IC 晶圆厂自己无线 IC 的 推出,兼容模块的价格从 2008 年的 20 元左右一直跌落到目前的 4.5,利润由当 初的 10 元降到现在的 0.5 元以下,其中挪威版的出的最早,价格虽然猛降,但 是始终拼不过台产芯片。
3 问:挪威版本的 NRF24L01+和台产版的哪个使用效果会更好? 答:台产版的完全克隆挪威版的,并在以前的基础上加了+7DB 的功放电路,

NRF24L01调试方法及经验总结

NRF24L01调试方法及经验总结

NRF24L01 :在通信中的应用方法,经验总结〔1〕2021-07-31 13:15首先说一下:单片射频收发器件,工作于2.4 GHz~2.5 GHz ISM频段。

内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。

nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。

是想将这个IC调通,首先要多读一下技术文档:下载技术文档以下C51驱动nRF24.L01 的源代码库〔nRF24.L01.h〕此库文件适合发送端使用,在接收端会有所不同,请看第2 局部的分析在使用过程中,需要引用//****************************************NRF24L01端口定义***************************************sbit CE =P2^0;sbit CSN =P2^1;sbit SCK =P2^2;sbit MOSI =P2^3;sbit MISO =P2^4;sbit IRQ =P2^5;//*********************************************NRF24L01********* ****************************#define TX_ADR_WIDTH 5 // 接收地址宽度,一般设置为5 不要动它#define RX_ADR_WIDTH 5 // 接收地址宽度,一般设置为5 不要动它#define TX_PLOAD_WIDTH 1 //接收数据的数据宽度〔最大为32 字节〕,这里我设置为最小的1 字节,方便调试#define RX_PLOAD_WIDTH 1 //发送数据的数据宽度〔最大为32 字节〕,这里我设置为最小的1 字节,方便调试uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x35,0x43,0x10,0x10,0x03}; // 这里就是设置了5 个字节的本地地址/*此处的地址:在IC内部真实地址是反过来的。

NRF24L01无线串口开发板程序详解

NRF24L01无线串口开发板程序详解

1.源程序开发环境建立1.1程序编译软件编译软件用keil C51,打开安装文件,一路点击下一步即可完成。

1.2程序下载软件使用STC ISP下载软件。

2.源程序文件整体结构工程中,只有一个main.c文件,所有程序都写在这个文件里面。

Reg51.h是包含的头文件。

是不是非常简单!3.源程序执行流程无线数据处理程序:串口数据处理程序:4.串口配置函数void serial_open(void){SCON = 0X50;AUXR |= 0X04;TL2 = 0Xc0; // 9600TH2 = 0Xfd;AUXR|=0X10;}此串口配置函数,利用单片机内部的定时器2作为波特率发生器。

共用到4个寄存器:SCON AUXR TL2 TH2SM0和SM1的位决定串口工作的4种方式:程序中,SCON=0X50,即SM0=0 SM1=1,即串口工作在“方式1”;REN=1,允许串口接收数据。

TL2和TH2是定时器2的高位和低位寄存器。

程序中,首先AUXR|=0X40,最后AUXR|=0X10。

即首先把T2x12置1,然后把T2R置1。

即首先把定时器2设置为1T模式,然后把定时器打开。

5.串口发送数据函数void senddata(uchar data_buf){SBUF = data_buf;while(!TI);TI = 0;}用到了寄存器SBUF和寄存器SCON中的TI位。

SBUF寄存器是串口收发数据缓存寄存器,放到这个寄存器中的数据,会通过串口发送出去,接收到的串口数据,也会放到这个寄存器中。

也就是串口接收和发送都是使用这个寄存器。

程序中,SBUF=data_buf,就是把data_buf给了SBUF,单片机自动把SBUF里面的数据发送到串口。

TI是串口发送数据完成标志位,当串口发送完一个数据,此位置1,置位后,需要通过软件清0。

所以通过while(!TI),来检测TI位,达到检测串口是否发送完数据的目的。

nRF24LE1中文手册

nRF24LE1中文手册
AD 转换 6,8,10,12 位分辨率 14 个输入通道 单端或差分输入 量程可通过内部参考电压,外部参考电压或 VDD 设置 2,4,8,16 Kbps 持续采样速率
4
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
低电流消耗,2 Kbps 采样速率下仅 0.1 mA 电压比较器
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
nRF24LE1
超低功耗无线片上系统解决方案 产品说明书 V1.6
关键特征
l nRF24L01+2.4 Hz 收发器(250 bps,1 Mbps,2 Mbps 空中速率 l 集成高速单片机(兼容 8051) l 16 kB 片上程序存储器 l 1 kB 片上数据存储器 l 512 字节非易失性数据存储器 l AES 对称加密硬件加速 l 16-32 位乘法除法协处理器 l 6-12 位 ADC l 高灵活性输入输出端口 l 从超低功耗到高效运行的省电模式 l 4*4 mm QFN24 5*5mm QFN32 7*7mm QFN48 封装 l 支持硬件调试器 l 硬件支持固件更新
1 简介
nRF24LE1 是一款高性价比且内置微控制器的智能 2.4GHz 射频收发器家族中的一员。 nRF24LE1 为提供超低功耗无线应用而作了优化。处理器能力,内存,低功耗晶振,实时实 名,计数器,AES 加密加速器,随机数发生器和节电模式的组合为实现射频协议提供了理 想的平台。使用 nRF24LE1 的好处包括严密的协议时序,安全性,低功耗和改善共存的性能。 对于应用层,nRF24LE1 提供了一个丰富的外设包括:SPI,IIC,UART,6 至 12 位 ADC, PWM 和一个用于电压等级系统唤醒的超低功耗模拟比较器。 nRF24LE1 三种封装的差异 超紧凑 4*4mm 24 脚 QFN 封装(7 个通用 IO 引脚),主要用于对大小有严格要求的应用场 合,如 穿戴式运动传感器和手册 5*5mm 32 脚 QFN 封装(15 个通用 IO 引脚)适用于无线鼠标,远程控制和玩具 7*7mm 48 脚 QFN 封装(31 个通用 IO 引脚)为对 I/O 数量要求很高的产品而设计,如无线 键盘

nRF24LE1中文数据手册

nRF24LE1中文数据手册
1 简介
nRF24LE1 是一款高性价比且内置微控制器的智能 2.4GHz 射频收发器家族中的一员。 nRF24LE1 为提供超低功耗无线应用而作了优化。处理器能力,内存,低功耗晶振,实时实 名,计数器,AES 加密加速器,随机数发生器和节电模式的组合为实现射频协议提供了理 想的平台。使用 nRF24LE1 的好处包括严密的协议时序,安全性,低功耗和改善共存的性能。 对于应用层,nRF24LE1 提供了一个丰富的外设包括:SPI,IIC,UART,6 至 12 位 ADC, PWM 和一个用于电压等级系统唤醒的超低功耗模拟比较器。 nRF24LE1 三种封装的差异 超紧凑 4*4mm 24 脚 QFN 封装(7 个通用 IO 引脚),主要用于对大小有严格要求的应用场 合,如 穿戴式运动传感器和手册 5*5mm 32 脚 QFN 封装(15 个通用 IO 引脚)适用于无线鼠标,远程控制和玩具 7*7mm 48 脚 QFN 封装(31 个通用 IO 引脚)为对 I/O 数量要求很高的产品而设计,如无线 键盘
IREF VDD_PA
ANT1 ANT2 XC1 XC2 衬底
模拟输入 设备参考电流输出,接一电阻到 PCB
电源输出 射频功放电源供应(+1.8V),调试时,
只要有发射此引脚就会有一个脉冲
射频
差分天线连接(发送和接收)
模拟输入 连接 16MHz 晶振
电源/散热 QFN48 和 QFN32 接地,QFN24 不要
9
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
号进行解调,当地址与自身地址一致且 CRC 校验正确时,有效数据被送到 RX FIFOs.如果 RX FIFOs 已满,则数据包被丢弃。
射频收发器保持在接收模式直到 MCU 配置其进入待机模式 1 或掉电模式。如果自动应答特 性被开启,则收发器可以进入其他模式,如进入发送模式发送应答确认。

nRF24LXX USB Flasher 编程器使用手册

nRF24LXX USB Flasher 编程器使用手册

nRF24LXX USB Flasher编程器用户使用手册一 功能介绍nRF24LXX USB Flasher编程器用于对nordic公司出品的nRF24LE1,nRF24LU1P等芯片内Flash进行烧录编程。

该编程器能提供一般的编程操作,如代码载入,编程,校验,读取以及代码保护功能。

同时下载口提供3.3V电压输出,能在下载结束后直接复位芯片进入代码执行阶段,方便用户开发工作。

编程器使用真正USB接口和电脑进行通信,下载速度快,对16K Flash的编程操作过程只需3~5秒,节省用户开发时间。

编程器套件组成:下载器一个10芯排线一根USB连接线一根最小系统测试PCB一片二 下载器介绍下载器USB接口连接PC端USB接口,10芯ISP下载口连接目标芯片,该10芯下载口信号顺序和nordic官方的下载器顺序一致。

另外板载电源指示灯和下载器工作指示灯,用于指示下载器工作状态。

10芯ISP下载信号说明信号顺序 信号顺序1 GND 6 MISO2 NC 7 CSN3 SCK 8 RESET4 MOSI 9 NC5 PROG 10 3V3板载2个LED,靠近USB接口的LED用于指示下载器是否通电,靠ISP下载端口的LED 用于指示下载是否进行。

三 PC端软件介绍PC端软件具备hex格式文件打开功能保存,代码HEX查看编辑功能。

具备对芯片Flash 的读取,编程,校验,全片擦除,以及代码保护功能。

同时具备了这些功能的一键自动操作。

另外可以读取信息页(Info Page)中的内容。

软件界面中还能实时指示USB连接状态。

如果USB处于断开状态,其他任何编程读取等操作将无法使用。

在软件的一键自动操作前,需要选定自动操作的选项,通常需要选定“编程”,“校验”,“保护”三项功能,如果需要下载后执行代码,则需要勾选“运行”,这样下载完成后,下载器给目标芯片重新供电并复位,使目标芯片开始运行程序。

四 安装USB驱动首次使用编程器时,需要安装USB驱动。

nRF24LE1中文数据手册

nRF24LE1中文数据手册
8
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
1 Mbps 速率下非重叠频道间隔为 1 MHz 2 Mbps 速率下非重叠频道间隔为 2 MHz 增加型突发模式 1-32 字节动态有效载荷长度(即用户要发的数据长度可以 1-32 字节) 包自动处理(封包/解包) 自动包传输处理(自动应答确认,自动重传) 6 个数据通道可用于 6:1 星型网络
nRF24LE1 模块 nRF24LU1 模块 mPro 编程器 仅需 88 元! 支持芯片:51 AVR STC nRF24LXX PL3K 系列 EEPROM … 其他功能:USB 温湿度计 USB 开发板 USB 转串口 电脑遥控器
2
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
AD 转换 6,8,10,12 位分辨率 14 个输入通道 单端或差分输入 量程可通过内部参考电压,外部参考电压或 VDD 设置 2,4,8,16 Kbps 持续采样速率
4
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
低电流消耗,2 Kbps 采样速率下仅 0.1 mA 电压比较器
应用 l 电脑外设:鼠标、键盘、远程控制、游戏 l 高级远程控制:音频/视频、娱乐中心、家庭应用 l 有源 RFID、传感网络 l 安全系统:支付、报警、访问控制 l 医疗健康和运动 l 遥控玩具
1
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
9
nRF24LE1 nRF24LU1 模块 多功能编程器 RMB88
号进行解调,当地址与自身地址一致且 CRC 校验正确时,有效数据被送到 RX FIFOs.如果 RX FIFOs 已满,则数据包被丢弃。

nRF24L01P产品说明书V1.0

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写作惯例本产品规范遵循一套排版规则,文档一致,容易阅读.使用书面约定如下:命令,位状态条件下,寄存器名称都写在Courier。

NRF24L01参考程序(包含多个实例)

NRF24L01参考程序(包含多个实例)

(相关人员如觉得本人水平低下,还请见谅)Nrf24L01的使用程序和使用方法和简单操作:功能:无线对发程序。

两个模块a,b,实现按下一个按键,会在对方的数码管上显示3或4,在本机上显示1,2。

当一个模块,比如a模块。

当两个按键按下其中一个,则会在另一个模块b上显示数字3,4(具体根据按下哪个按键)。

以上功能描述,B模块按键按下,如同a模块一样的功能,不做系统性描述了。

下面给出程序中几个地方的解释:#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 // 保留类似这种的描述,可以等同于READ_REG =0x00;这个是经过实际程序测试出来的,比如以下程序:#include<reg51.h>#define k 0xfevoid main(){P1=k;}则会出现此类结果: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;此处为spi的核心,是spi协议的编程,其中uchar |= MISO; 表示uchar |= MISO | uchar; MOSI = (uchar & 0x80);其中0x80是1000 0000,与上uchar,这种&,是按位与,故可以从uchar提取出一个电平给mosi。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 供电并正确设置跳线,以免烧坏芯片
上位机软件:。

相关文档
最新文档