《nrf24l01调试方法及经验总结43969.pdf》由会员分享,可在线阅读,更多相关《nrf24l01调试方法及经验总结43969.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、NRF24L01:在通信中的应用方法,经验总结(1)2011-07-31 13:15 首先说一下:是一款新型单片射频收发器件,工作于 GHz GHz ISM 频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型 ShockBurst 技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01 功耗低,在以-6 dBm 的功率发射时,工作电流也只有 9 mA;接收时,工作电流只有 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。是想将这个 IC 调通,首先要多读一下技术文档:下载技术文档 以下 C51 驱动 的源代码库()此库文件适合 发送端使用,
2、在接收端会有所不同,请看第 2 部分的分析 在使用过程中,需要引用 SCK=1;uchar|=MISO;then set SCK low again return(uchar);.SPI_RW(reg);reg_val=SPI_RW(0);then read registervalue CSN=1;and write value to it.CSN=1;/CSN high again return(status);/return nRF24L01 status uchar /*/*函数:uint SPI_Read_Buf(uchar reg,uchar*pBuf,uchar uchars)/*
3、功能:用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*/uint SPI_Read_Buf(uchar reg,uchar*pBuf,uchar uchars)uint status,uchar_ctr;CSN=0;/Set CSN low,init SPI tranaction status=SPI_RW(reg);/Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctruchars;uchar_ctr+)pBufuchar_ctr=SPI_RW(0)
4、;/CSN=1;return(status);/return nRF24L01 status uchar /*/*函数:uint SPI_Write_Buf(uchar reg,uchar*pBuf,uchar uchars)/*功能:用于写数据:reg 为寄存器地址,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_ctru
5、chars;uchar_ctr+)/SPI_RW(*pBuf+);CSN=1;/关闭SPI return(status);/*/*函数:void SetRX_Mode(void)/*功能:数据接收配置 /*/void SetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG+CONFIG,0 x0f);/IRQ 收发完成中断响应,16 位 CRC,主接收 CE=1;inerDelay_us(130);/*/*函数:unsigned char nRF24L01_RxPacket(unsigned char*rx_buf)/*功能:数据读取后放如 rx_buf 接收缓冲区
6、中/*/uchar nRF24L01_RxPacket(unsigned char*rx_buf)unsigned char revale=0;sta=SPI_Read(STATUS);/读取状态寄存其来判断数据接收状况 if(RX_DR)/判断是否接收到数据 Display8bit(3,0,sta);/看一下接收机状态 判断一下,IC 的工作状态,在正常使用过程中,这句需要去掉 CE=0;/SPI 使能 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/read receive payload from RX_FIFO buffer reval
7、e=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_WID
8、TH);/装载接收端地址 SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);/装载数据 SPI_RW_Reg(WRITE_REG+CONFIG,0 x0e);/IRQ 收发完成中断响应,16 位 CRC,主发送 SPI_RW_Reg(WRITE_REG+STATUS,0X7E);CE=1;/置高 CE,激发数据发送 inerDelay_us(100);NRF24L01:在通信中的应用方法,经验总结(3)2011-07-31 13:42 再接着往下说 调试过程:一般拿到 IC 后最大的困难就是 无法知道自己 IC 是否已经工作了。如果调试不通,不知
9、道是由于发送端的问题还是接收端的问题。的确,这个问题很现实。其实方法也很简单,读取 IC 内部数据,如果能读出就说明,IC 已经工作,工作的怎么样等信息,也可以用读取数据的方式来获得 下面是发送部分的代码:#include#include#include /引用了 1602 的库,用来显示数据,来查看 NRF24L01 的工作状态#include /引用 需要调用的库/*主函数*void main(void)uchar tf;uchar t;uchar i,p;LCM_Init();/初始化 1602 init_NRF24L01();/初始化 NRF24L01 Delay(6000);t=0;
10、while(1)for(i=0;i10;i+)TxBuf0=0 x30+i;/向发送缓存里放入一数,我在这里放入的是 i 字符。至所以在 i+0 x30 根据 ASCII 码,加上 0X30 后 8 才会变成“8”nRF24L01_TxPacket(TxBuf);/发送数据 DisplayListChar(0,0,TxBuf);/将发送的数据 显示出来,因为在显示的时候,要显示一个可显示字符“8”才能显示 0 x08 是不能显示的 for(p=0;p8;p+)Delay(6000);tf=SPI_Read(STATUS);/读取 状态 寄存器,根据状态寄存器,我们就可以知道 IC 是否正常工作
11、,/如果不工作,这里得到的 tf=0 xFF Display8bit(0,1,tf);/使用 二进制方法来显示得到的 数据 下面是接收部分的代码:#include#include#include#include /*主函数*void main(void)uchar RxBuf1=0;uchar x,tf;LCM_Init();init_NRF24L01();Delay(6000);while(1)SetRX_Mode();/设定为接收模式 nRF24L01_RxPacket(RxBuf);/接收数据 x=RxBuf0;DisplayOneChar(0,0,x);/显示得到的数据 tf=SPI_Read(STATUS);/显示 IC 状态,以方便观察 IC 是否正确工作。Display8bit(0,1,tf);