您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 关于NRF24l01的调试
NRF24l01的调试过程与方法小结心得体会:最近老板给了几块nrf24l01模块我,初次上手难免走了许多的弯路,经过近一周的时间的不断调试,模块之间终于可以相互收发数据了。这样下来终于松了一口气。其间的各种辛苦与艰辛难于言表。上网大致看了一下,网上基于51的调试比较多,但是我们实验室用的是DSP2812,由于nrf24l01是SPI接口,2812上刚好有SPI的接口,这样貌似给使用带来了方便,但是51之类的芯片虽然没有SPI口,但是例程也最多,关于他的讨论比较多。最开始我的想法也比较混乱,想直接用SPI来调试,把底层函数稍微修改了一下,发现并没有结果,这个东西就像一个黑匣子一样,即看不见也摸不着,后来我慢慢改变了思路。既然网上基于IO口模拟的SPI的例程最多,我决定另外走一条路,先用2812的IO口模拟SPI再用自带的SPI口去调试。这样一来我就有了两条可以走的路。第一条:底层SPI时序用IO口模拟去写。第二条:底层直接用2812的SPI去操作。虽然这样一来,路好走了一点,有各类的程序可以参考,但是这样带来最大的一个问题,这也是后来我才发现的,nrf24l01的最大读写速率是有限制的,2812在150M运行时很显然是太大了一点,由于nrf24l01对时序的要求很高,端口的读写速率和时序都有严格的要求,所以我们才看到,在网上一般是15M左右的单片机来模拟IO口,没有谁用150M的DSP来模拟IO口的,当然既然确定了这样的方法后来也发现了问题,我还是继续走下去了。很重要的一点是系统的时钟频率。当然时序的要求也很高,这也就是为什么,网上说这个模块不好调试的原因,既然是调试,当然我们既然是调试,肯定有一个思路和方法。那么方法是什么呢?开始的时候我是一股脑将发送和接收的程序都写进去,然后啥现象也没有,然后就傻眼了。在网上看了看,于是有了一点思路。方法是将发送和接收的调试分开来调试,以读取nrf24l01内部的寄存器为手段,先调试发送方,发送方调试没有问题以后,让发送方不断的发送数据,然后再来调试接收方,直到接收方也没有问题,再接着望下面去做。秉着这样的一个想法,我开始了调试。这里我只对一对一的调试进行说明,后续的一对多,以及调频之类虽然我有了想法,但是还没有开始实施。在开始调试之前建议将NRF24l01说明书读个三遍。模块的外部端口XL24LD01是采用挪威NORDIC公司的nrf24L012.4G无线收发IC设计的一款高性能2.4G无线收发模块,采用GFSK调制,工作在2400‐2483M的国际通用ISM频段,最高调制速率可达2MBPS。XL24L01-D01集成了所有与RF协议相关的高速信号处理部分,如:自动重发丢失数据包和自动产生应答信号等,模块的SPI接口可以利用单片机的硬件SPI口连接或用单片机的I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。在连线的时候要特别注意电源线不要弄反过来了,要注意电源的最大值不能超过3.6V,这个电压直接影响了模块的端口的输出电压值,由于我们的DSP端口的高电平在3.3V,一般将电压设置在这个附近左右。只有在硬件没有问题的基础上才能开始调试软件,否者会出现很多的问题。还有一个,工作模式的问题,要注意在待机和掉电的模式下才能够进行寄存器的写操作。模块内部的寄存器在调试中对寄存器的读取操作是一个非常有效的验证方法。对芯片资料中给出的23个寄存器内容请看手册。对应的寄存器在头文件里面。用IO口模拟SPI的方法头文件如下:#ifndef_NRF24L01_H_#define_NRF24L01_H_#defineCPU_RATE6.667L//fora150MHzCPUclockspeed(SYSCLKOUT)//DONOTMODIFYTHISLINE.#defineDELAY_US(A)DSP28x_usDelay(((((longdouble)A*1000.0L)/(longdouble)CPU_RATE)-9.0L)/5.0L)//这个函数是在150M下的us级延时函数/*******************************************************/#defineTX_ADDR_WITDH5//发送地址宽度设置为5个字节#defineRX_ADDR_WITDH5//接收地址宽度设置为5个字节#defineTX_DATA_WITDH1//发送数据宽度1个字节#defineRX_DATA_WITDH1//接收数据宽度1个字节/*******************命令寄存器***************************/#defineR_REGISTER0x00//读取配置寄存器#defineW_REGISTER0x20//写配置寄存器#defineR_RX_PAYLOAD0x61//读取RX有效数据#defineW_TX_PAYLOAD0xa0//写TX有效数据#defineFLUSH_TX0xe1//清除TXFIFO寄存器#defineFLUSH_RX0xe2//清除RXFIFO寄存器#defineREUSE_TX_PL0xe3//重新使用上一包有效数据#defineNOP0xff//空操作/******************寄存器地址****************************/#defineCONFIG0x00//配置寄存器#defineEN_AA0x01//使能自动应答#defineEN_RXADDR0x02//接收通道使能0-5个通道#defineSETUP_AW0x03//设置数据通道地址宽度3-5#defineSETUP_RETR0x04//建立自动重发#defineRF_CH0x05//射频通道设置#defineRF_SETUP0x06//射频寄存器#defineSTATUS0x07//状态寄存器#defineOBSERVE_TX0x08//发送检测寄存器#defineCD0x09//载波#defineRX_ADDR_P00x0a//数据通道0接收地址#defineRX_ADDR_P10x0b//数据通道1接收地址#defineRX_ADDR_P20x0c//数据通道2接收地址#defineRX_ADDR_P30x0d//数据通道3接收地址#defineRX_ADDR_P40x0e//数据通道4接收地址#defineRX_ADDR_P50x0f//数据通道5接收地址#defineTX_ADDR0x10//发送地址#defineRX_PW_P00x11//P0通道数据宽度设置#defineRX_PW_P10x12//P1通道数据宽度设置#defineRX_PW_P20x13//P2通道数据宽度设置#defineRX_PW_P30x14//P3通道数据宽度设置#defineRX_PW_P40x15//P4通道数据宽度设置#defineRX_PW_P50x16//P5通道数据宽度设置#defineFIFO_STATUS0x17//FIFO状态寄存器/*******************相关函数声明**************************/uncharNRFACK();uncharNRFSPI(unchardate);uncharNRFReadReg(uncharRegAddr);uncharNRFWriteReg(uncharRegAddr,unchardate);uncharNRFReadRxDate(uncharRegAddr,unchar*RxDate,uncharDateLen);uncharNRFWriteTxDate(uncharRegAddr,unchar*TxDate,uncharDateLen);uncharNRFRevDate(unchar*RevDate);voidNRFSetTxMode(unchar*TxDate);voidNRF24L01Int();voidNRFSetRXMode();uncharCheckACK();/**nrf24l01状态寄存器的申明**/structSTA_BITS{//bitdescriptionUint16TX_FULL:1;//0FIFO寄存器满标志Uint16RX_P_NO:3;//1:3接收通道号Uint16MAX_RT:1;//4最大重发次数Uint16TX_DS:1;//5数据发送完成标志Uint16RX_DR:1;//6接收数据中断Uint16rsvd:1;//7reserved};unionSTA_REG{Uint16all;structSTA_BITSbit;};structLOOK_BITS{//bitdescriptionUint16bit0:1;//0Uint16bit1:1;//1Uint16bit2:1;//2Uint16bit3:1;//3Uint16bit4:1;//4Uint16bit5:1;//5Uint16bit6:1;//6Uint16bit7:1;//7};unionLOOK_REG{Uint16all;structLOOK_BITSbit;};/*********************************************************/#endif函数的底层如下:/******************************************创建:那是星期天*时间:2015.4.15*功能:NRF24L01射频模块C文件*****************************************/#includeDSP28_Device.h#includeNRF24L01.h//nrf24l01的射频模块的头文件uncharTxAddr[]={0x34,0x43,0x10,0x10,0x01};//发送地址unionSTA_REGsta={0};/*****************SPI时序函数******************************************/uncharNRFSPI(unchardata){unchari;for(i=0;i8;i++)//循环8次{if(data&0x80)GpioDataRegs.GPADAT.bit.GPIOA3=1;//MOSIelseGpioDataRegs.GPADAT.bit.GPIOA3=0;//byte最高位输出到MISOdata=1;//低一位移位到最高位GpioDataRegs.GPADAT.bit.GPIOA1=1;//SCLK=1if(GpioDataRegs.GPADAT.bit.GPIOA2)//MISOdata|=0x01;GpioDataRegs.GPADAT.bit.GPIOA1=0;//SCLK=0}data=data&0x00ff;return(data);//返回读出的一个字节}/**********************NRF24L01初始化函数*******************************/voidNRF24L01Int(){DELAY_US(2);//延时2us//让系统什么都不干GpioDataRegs.GPADAT.bit.GPIOA5=0;//ce=0待机模式1GpioDataRegs.GPADAT.bit.GPIOA0=1;//CSN=1;GpioDataRegs.GPADAT.bit.GPIOA1=0;//SCLK=0;GpioDataRegs.GPADAT.bit.GPIOA4=1;//IRQ=1;}/*****************SPI读寄存器一字节函数*********************************/uncharNRFReadReg(uncharRegAddr){uncharBackDate;GpioDataRegs.GPADAT.bit.GPIOA0=0;//CSN=0启动时
本文标题:关于NRF24l01的调试
链接地址:https://www.777doc.com/doc-2665576 .html