NRF24LE1编程器&烧写器使用说明
- 格式:pdf
- 大小:295.45 KB
- 文档页数:2
stc12单片机SPI的nrf24l01程序/////////////////////发送/////////////////////////////// #include <reg52.h>#include <intrins.h>typedef unsigned char uchar;#define uint unsigned int//****************************************IO端口定义***************************************sfr SPCTL = 0xCE;//SPI Control Register SSIG SPEN DORD MSTR CPOL CPHASPR1 SPR0 0000,0100sfr SPSTAT = 0xCD;//SPI Status Register SPIF WCOL - - - -- - 00xx,xxxxsfr SPDAT = 0xCF;sbit CE =P1^0;sbit CSN =P1^1;sbit IRQ =P1^2;sbit led=P1^3;//********************************************************* ********************************* uchar bdata sta;//状态标志sbit RX_DR =sta^6;sbit TX_DS =sta^5;sbit MAX_RT =sta^4;//*********************************************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 32// 32 uints TX payload#define RX_PLOAD_WIDTH 32// 32 uints TX payloaduchar const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//本地地址uchar const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};//接收地址 uchar codeTx_Buf[TX_PLOAD_WIDTH]={0xff,0xee,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x2 2,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa ,0xbb,0x11,0x22,0x33,0xee,0xff};//发送数据 ucharRx_Buf[RX_PLOAD_WIDTH];//接收数据//***************************************NRF24L01寄存器指令*******************************************************#define READ_REG 0x00 // 读寄存器指令 #defineWRITE_REG 0x20 // 写寄存器指令 #define RD_RX_PLOAD 0x61 // 读取接收数据指令 #define WR_TX_PLOAD 0xA0 // 写待发数据指令 #define FLUSH_TX0xE1 // 冲洗发送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 // 收发地址宽度设置 #defineSETUP_RETR 0x04 // 自动重发功能设置 #define RF_CH 0x05 // 工作频率设置 #define RF_SETUP 0x06 // 发射速率、功耗功能设置 #define STATUS 0x07 // 状态寄存器 #define OBSERVE_TX 0x08 // 发送监测功能 #defineCD 0x09 // 地址检测 #define RX_ADDR_P0 0x0A // 频道0接收数据地址#defineRX_ADDR_P1 0x0B // 频道1接收数据地址 #defineRX_ADDR_P2 0x0C // 频道2接收数据地址 #defineRX_ADDR_P3 0x0D // 频道3接收数据地址 #defineRX_ADDR_P4 0x0E // 频道4接收数据地址 #defineRX_ADDR_P5 0x0F // 频道5接收数据地址 #define TX_ADDR 0x10 // 发送地址寄存器 #define RX_PW_P0 0x11 // 接收频道0接收数据长度 #define RX_PW_P1 0x12 // 接收频道1接收数据长度 #define RX_PW_P2 0x13 // 接收频道2接收数据长度 #define RX_PW_P3 0x14 // 接收频道3接收数据长度 #define RX_PW_P4 0x15 // 接收频道4接收数据长度 #define RX_PW_P5 0x16 // 接收频道5接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/******************************************延时函数********************************************************///长延时 void Delay(unsigned int s) { unsigned int i,j;for(i=0;i<1000;i++)for(j=0;j<s;j++); } //短延时 voiddelay_ms(unsigned int x) { unsigned int i,j; i=0;for(i=0;i<x;i++) { j=108; while(j--); } } /************初始化5A spi***************/ void Init_SPI() { SPDAT=0; //初始化数据寄存器 SPSTAT=0XC0; //清除状态寄存器SPCTL=0XD2;//设置为主机模式主频不能超过2M //忽略SS 使能spi MSB SCLK空闲为0 第一个时钟边沿开始采集 spi通信的频率为CUP_CLK/16 } //SPDAT 读写一个字节 //TxData:要写入的字节//返回值:读取到的字节 uchar SPI_ReadWriteByte(uchar TxData){ SPDAT=TxData; //发送一个bytewhile((SPSTAT&0x80)==0); SPSTAT=0XC0; //清除状态寄存器 return SPDAT; //返回收到的数据 } //读取SPI寄存器值 //reg:要读的寄存器 uchar SPI_Read_Reg(uchar reg) { uchar reg_val; CSN = 0; //使能SPI传输SPI_ReadWriteByte(reg); //发送寄存器号reg_val=SPI_ReadWriteByte(0xFF);//读取寄存器内容 CSN = 1;//禁止SPI传输 return(reg_val); //返回状态值 } // 向寄存器REG写一个字节,同时返回状态字节reg寄存器地址 value写入的数据 uchar SPI_RW_Reg (ucharreg,uchar value) { uchar status; CSN=0;status=SPI_ReadWriteByte(reg);//发送寄存器号SPI_ReadWriteByte(value); //写入寄存器的值 CSN=1;return(status); } //写一个数据包 ucharSPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes) { ucharstatus,byte_ctr; CSN = 0;status=SPI_ReadWriteByte(reg); for(byte_ctr=0; byte_ctr<bytes;byte_ctr++) SPI_ReadWriteByte(*pBuf++); CSN = 1; return(status); } //读一个数据包 uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) { uchar status,uchar_ctr; CSN = 0;status = SPI_ReadWriteByte(reg);for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)pBuf[uchar_ctr]=SPI_ReadWriteByte(0xFF); CSN = 1; return(status); } /*******************************接 ***** 收 ***** 模 *****式 ***** 代 ***** 码 *************************************//*********************************************************************** *******************************/ /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) /*功能:数据读取后放如rx_buf接收缓冲区中/******************************************************************* ***********************************/ unsigned charnRF24L01_RxPacket(unsigned char* rx_buf) { // unsigned char revale=0; sta=SPI_Read_Reg(STATUS); // 读取状态寄存其来判断数据接收状况 SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志 if(RX_DR) // 判断是否接收到数据{ SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferSPI_RW_Reg(FLUSH_RX,0xFF);//清除接受FIFO return 1;//读取数据完成标志 } return 0; }/******************************************************************* *********************************/ /*函数:voidRX_Mode(void) /*功能:数据接收配置/******************************************************************* *********************************/ void RX_Mode(void) { CE=0; //SPI_RW_Reg(FLUSH_RX,0x00);//清除接受FIFO //SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // Writes TX_Address to nRF24L01 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack SPI_RW_Reg(WRITE_REG + EN_AA,0x01);//使能自动应答 Enable Auto.Ack:Pipe0 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //连接通道0和地址 Enable Pipe0//SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...1a SPI_RW_Reg(WRITE_REG + RF_CH, 40);//通信频率0~125 设置通信的频率 Select RF channel 40SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为2字节 SPI_RW_Reg(WRITE_REG +RF_SETUP,0X07); //0x07 TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR // 设置TX发射参数,0db增益,2Mbps,低噪声增益开启 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);//配置基本工作模式的参数 CE=1; delay_ms(130); }//************************************串口初始化********************************************************* void StartUART( void ) { //波特率9600 TMOD=0x20;//设置定模式2 TH1=0xFD; TL1=0xFD; SM1=1; //设置串口SCON,为方式1 SM0=0; REN=1; //串行允许 TR1=1; //启动定时器EA=1; //中断 ES=1; //打开串口 }//************************************通过串口将接收到数据发送给PC端 ************************************** voidR_S_Byte(uint R_Byte) { ES=0; SBUF=R_Byte; while(TI==0); TI=0; ES=1; } /************************************主函数************************************************************/ uchar NRF24L01_Check(void) { ucharbuf[5]={0XA5,0XA5,0XA5,0XA5,0XA5}; uchar i;SPI_Write_Buf(WRITE_REG+TX_ADDR,buf,5);//写入5个字节的地址.SPI_Read_Buf(TX_ADDR,buf,5); //读出写入的地址for(i=0;i<5;i++) if(buf[i]!=0XA5) break; if(i!=5) return 1;//检测24L01错误 return 0; //检测到24L01 } void main() { uint i=0; CE=0; CSN=1; led=0; Init_SPI(); StartUART(); //串口初始while(NRF24L01_Check())//检测不到24L01 { delay_ms(500);delay_ms(500); R_S_Byte(0x11); } //接收模式代码 RX_Mode(); //接受模式 Delay(10);//防止编译警告 while(1){ if(nRF24L01_RxPacket(Rx_Buf)) { for(i=0;i<TX_PLOAD_WIDTH;i++) { R_S_Byte(Rx_Buf[i]); //发送接收到的数据到电脑 } } Delay(10); } }。
nRF24LE1芯片简单介绍NRF24LE1特性NRF24LE1采用了NORDIC最新的无线和超低功耗技术,在一个极小封装中集成了包括2.4G无线传输,增强型51 FLASH高速单片机,丰富外设及接口等的单片FLASH芯片,是一个综合了性能及成本的完美结合,很适合应用于各种2.4G的产品设计。
NRF24LE1=2.4GHz+Flash51+ADC+PWM+I2C+RTC+WDT+RNG+AES++COMP+UART+SPI….应用:无线鼠标,无线键盘,无线摇杆,PC外设,玩具,RFID,无线遥控,医学参数监测,线数字语音,工业控制及无线数据采集主要特性:1、内嵌 2.4GHz低功耗无线收发内核NRF24L01+, 250kbps,1Mbps,2Mbps空中速率2、高性能51内核,16kbytes Flash,1Kbyte data RAM,1Kbyte NVRAM3、具有丰富的外设资源,内置128bit AES硬件加密,32位硬件乘除处理器,6-12位ADC,两路PWM,I2C,UART,硬件随机数产生器件,WDT,RTC,模拟比较器4、提供QFN24,QFN32,QFN48多种封装,提供灵活应用选择5、灵活高效的开发手段,支持Keil C,ISP下载,是开发无线外设,RFID,消费产品,无线数传等有力工具及平台。
带Gazell协议Gazell协议是NORDIC专为2.4G无线桌面和其他无线应用设计推出的无线通信协议,配合NRF24LE1/NRF24LU1P使用,客户可以专注于应用设计,无需花费大量的精力在无线链路上。
低功耗Gazell协议是低功耗协议,可设计为纽扣电池供电的应用。
抗干扰性Gazell协议完成自动跳频及抗干扰的无线通信,具有在复杂环境下优异的抗干扰性能。
低延时Gazell协议充分利用NRF高速通信的特性,具有低延时特性,特别满足PC周边及其他应用。
高安全性Gazell协议具有AES 128bit 高强度加密,确保数据传输的安全可靠。
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 )”的协议,具有抗干扰、可靠、省电等优点,实用性强,可应用于产品设计。
24l01的多机通信采用频分多子的方法,只需要在接受端对不同的通道配置地址即可。
发送端使用相应的地址作为本机地址。
接受数据时通过读取STATUS 中相关位即可得知接收的是哪个通道的数据。
以下仅给出多对一的通信代码。
至于一对多,以及多对多等情况读者可以自行研究了。
只给出相关部分,其他部分请参考前两篇文章------------------------------------------------------------------------------------------接受端uint const ADDRESS0[ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //频道0接收地址uint const ADDRESS1[ADR_WIDTH]= {0xc4,0xc3,0xc2,0xc1,0xc0}; //频道1接收地址uchar who=0xff;//**************************************************************** ************************/*NRF24L01初始化//**************************************************************** ***********************/void init_NRF24L01(void){us(100);CE=0; // chip enableCSN=1; // Spi disableSCK=0; // Spi clock line init high//SPI_Write_Buf(WRITE_REG + TX_ADDR,ADDRESS0, ADR_WIDTH); //写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0,ADDRESS0,ADR_WIDTH); //频道0地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P1,ADDRESS1,ADR_WIDTH); //频道1地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x03); //频道0、1自动应答SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x03); //允许频道0、1SPI_RW_Reg(WRITE_REG + RF_CH, 0); //设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //0接收数据长度SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //1接收数据长度SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/***************************************************************** *************************************//*函数: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_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);revale =1;who=sta&0x0e;who|=0xf0; //通道0:who==0xf0;通道1:who==0xf2}SPI_RW_Reg(WRITE_REG+STATUS,0xff); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志CSN=0;SPI_RW(FLUSH_RX);CSN=1;return revale;}void main(void){uchar i;uchar RxBuf[TX_PLOAD_WIDTH];init_NRF24L01() ;StartUART();ms(6000);while(1){//如果接收到数据,发往PCSetRX_Mode();if(nRF24L01_RxPacket(RxBuf)){R_S_Byte(who);ms(100);for(i=0;i<TX_PLOAD_WIDTH;i++){R_S_Byte(RxBuf[i]);ms(100);}}}}-------------------------------------------1----------------------------------------------------发送uint constADDRESS0[ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};其余与双工通信相同-------------------------------------------2----------------------------------------------------发送uint constADDRESS1[ADR_WIDTH]= {0xc4,0xc3,0xc2,0xc1,0xc0}; //频道1接收地址其余与双工通信相同以上就是简要的代码。
系统级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。
最近百度上一些朋友都在为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); // 失能自动重发(注:以下贴出的寄存器描述由于中文资料上有一个错误,故贴出原版英文资料)有了以上这三个配置,发送方的流程就变成了发送-触发中断。
NRF24LE1编程器&烧写器使用说明
1、 使用真正USB2.0芯片,稳定可靠,不会出现识别不了USB 设备的情况
2、 全新升级! 支持芯片丰富,并可通过更新固件支持更多器件(升级固件无须编程器)
3、 体积小,携带方便
4、 及时修复各种问题并不断添加功能
5、 支持HEX 及BIN 编程文件格式
通讯接口:USB2.0
供电方式:USB 供电,目标板无需供电 接口驱动:支持5V 和 3.3V
支持芯片:51 A VR STC nRF24LXX PL3K 系列 EEPROM … 软件升级:支持升级以支持更多芯片 尺寸:4.5*2cm
Pin1
Pin2
Pin3Pin5Pin7Pin9 Pin4Pin6Pin8Pin10
连接目标板前请一定要看看是3.3V还是5V供电并正确设置跳线,烧写NRF24LE1需设置3.3V供电!
NRF24LE1程序下载烧写举例:
1.将烧写器的排线连接到读写器底板上的接口座。
(注意:烧写程序时底板上只能插上一个读写模块或标签,否则会引起冲突而无法完成烧写下载)
2.将烧写器USB接口插入电脑,这时可能会提示安装驱动,直接定位到mPro文件夹位置完成驱动安装。
3.烧写时,读写器可不用上电,直接由烧写器供电。
打开mPro软件界面,如下图所示:选择nRF24LE1芯片类型,然后点击“载入编程文件”,选取所要烧写的Hex文件,最后按图上所示在烧写选项“检测器件”、“擦FLASH”、“写FLASH”、“校验”前打勾,点
击“自动”即完成烧写下载工作。