




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NRF24L01 :在通信中的应用方法,经验总结(1)2011-07-31 13:15首先说一下:nRF24.L01是一款新型单片射频收发器件,工作于2.4 GHz2.5 GHz ISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可通过程序进行配置。nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。是想将这个IC调通,首先要多读一下技术文档:下载技术文档以下C51驱动 nRF24.L01的源代码库(nRF24.L01.h)此库文件适合 发送端使用,在接收端会有所不同,请看第 2 部分的分析在使用过程中,需要引用/*NRF24L01端口定义*sbitCE =P20;sbitCSN=P21;sbitSCK =P22;sbit MOSI=P23;sbit MISO=P24;sbitIRQ=P25;/*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_ADDRESSTX_ADR_WIDTH= 0x35,0x43,0x10,0x10,0x03;/这里就是设置了 5 个字节的 本地地址/*此处的地址:在IC内部真实地址是 反过来的。即:address = 0310104334在数据发送时,发送到对方去的数据包括:数据本身+本地地址。与接收地址无关。*/uchar const RX_ADDRESSRX_ADR_WIDTH= 0xEF,0xEF,0xEF,0xEF,0xEF;/接收地址/*是指接受来自于发送方的地址(指发送方的本地地址),但在自动模式下,得到的应答信息中,包含的不是返回应答信息的对方的(本地地址)而是 由 发送方(也就是发送原信息的机子一方) 的本地地址*/uchar TxBuf1; / /*NRF24L01寄存器指令*#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 / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);uchar nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);/*长延时*void Delay(unsigned int s)unsigned int i;for(i=0; is; i+);for(i=0; i0;n-)_nop_();/*/*NRF24L01初始化/*/void init_NRF24L01(void) inerDelay_us(100);CE=0;CSN=1;SCK=0;SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允许接收地址只有频道0SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dBCE=1; / 网上很多地方 这里的 CE=1 都没有设置,不过也能正常工作。/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/*/uint SPI_RW(uint uchar)uint bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+)MOSI = (uchar & 0x80);uchar = (uchar 1);SCK = 1;uchar |= MISO;SCK = 0; return(uchar);/*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/*/uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0;SPI_RW(reg);reg_val = SPI_RW(0);CSN = 1;return(reg_val); /*/*功能:NRF24L01读写寄存器函数/*/uint SPI_RW_Reg(uchar reg, uchar value)uint status;CSN = 0;status = SPI_RW(reg);SPI_RW(value);CSN = 1;return(status); /*/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctruchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); / 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_ctruchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /关闭SPIreturn(status); / /*/*函数:void SetRX_Mode(void)/*功能:数据接收配置 /*/void SetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收发完成中断响应,16位CRC,主接收CE = 1; inerDelay_us(130);/*/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放如rx_buf接收缓冲区中/*/uchar nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0;sta=SPI_Read(STATUS);/ 读取状态寄存其来判断数据接收状况if(RX_DR)/ 判断是否接收到数据 CE = 0; /SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =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_WIDTH); / 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收发完成中断响应,16位CRC,主发送SPI_RW_Reg(WRITE_REG+STATUS,0X7E); / 清 除中断,以便开始发送数据CE=1; /置高CE,激发数据发送inerDelay_us(10);NRF24L01 :在通信中的应用方法,经验总结(2)2011-07-31 13:30接着说上一节在前面我说,库文件只适合在发送端使用,下面是 接收端 库文件,关键是对 6通道的设置,以达到 6 个通道可以同时接收数据的能力以下是 接收端库文件。当然这个库也可以用于 发送端部分。在接收端中,有几处不太一样的地方(标记为蓝色),请结合 发送端部分比较分析/接收端库文件(NRF24L01.h)/*NRF24L01端口定义*sbitCE =P20;sbitCSN=P21;sbitSCK =P22;sbit MOSI=P23;sbit MISO=P24;sbitIRQ=P25;/*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 1 / 20 uints TX payload#define RX_PLOAD_WIDTH 1 / 20 uints RX payloaduchar const TX_ADDRESSTX_ADR_WIDTH= 0xCF,0xCF,0xCF,0xCF,0xCF;/本地地址 实际地址为:CF-CF-CF-CF-CFuchar const RX_ADDRESSRX_ADR_WIDTH= 0x37,0x43,0x10,0x10,0xFF;/接收地址P0 实际地址为:FF-10-10-43-37/在实际使用过程中,发现 P0 与P1 地址的 最高的 4个字节地址不能够相同,(FF-10-10-43-37)/如果相同,会认为所接收到的所有的地址都来源于P0通道,即使他是从 P1 - P5 通道得来的数据,当然数据的收发不会受到影响uchar const RX1_ADDRESSRX_ADR_WIDTH= 0x35,0x43,0x10,0x10,0x03;/接收地址P1 实际地址为:03-10-10-43-35uchar const RX2_ADDRESS1= 0x36;/接收地址P2只写入最低位,其余高位与P1 相同,以下类同实际地址为:03-10-10-43-36uchar const RX3_ADDRESS1= 0x34;/接收地址P3 实际地址为:03-10-10-43-34uchar const RX4_ADDRESS1= 0x38;/接收地址P4 实际地址为:03-10-10-43-38uchar const RX5_ADDRESS1= 0x39;/接收地址P5 实际地址为:03-10-10-43-39/ 注意看清楚以上地址,与所给出的 列表 是反着的,为什么呢?/* 这是因为这个函数SPI_Write_Buf()这个函数是从第 0 个字节写上去的,但是 NRF24L01 是从低位开始保存的,也就是先写入的数值保存在 低位,依次类推。这样实际保存的地址与上面写的地址就反过来了。*/uchar TxBuf1; / /*NRF24L01寄存器指令*#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 / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 / 自动应答功能设置#define EN_RXADDR 0x02 / 可用信道设置#define SETUP_AW 0x03 / 收发地址宽度设置#define SETUP_RETR 0x04 / 自动重发功能设置#define RF_CH 0x05 / 工作频率设置#define RF_SETUP 0x06 / 发射速率、功耗功能设置#define STATUS 0x07 / 状态寄存器#define OBSERVE_TX 0x08 / 发送监测功能#define CD 0x09 / 地址检测 #define RX_ADDR_P0 0x0A / 频道0接收数据地址#define RX_ADDR_P1 0x0B / 频道1接收数据地址#define RX_ADDR_P2 0x0C / 频道2接收数据地址#define RX_ADDR_P3 0x0D / 频道3接收数据地址#define RX_ADDR_P4 0x0E / 频道4接收数据地址#define RX_ADDR_P5 0x0F / 频道5接收数据地址#define TX_ADDR 0x10 / 发送地址寄存器#define RX_PW_P0 0x11 / 接收频道0接收数据长度#define RX_PW_P1 0x12 / 接收频道0接收数据长度#define RX_PW_P2 0x13 / 接收频道0接收数据长度#define RX_PW_P3 0x14 / 接收频道0接收数据长度#define RX_PW_P4 0x15 / 接收频道0接收数据长度#define RX_PW_P5 0x16 / 接收频道0接收数据长度#define FIFO_STATUS 0x17 / FIFO栈入栈出状态寄存器设置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);uchar nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);/*长延时*void Delay(unsigned int s)unsigned int i;for(i=0; is; i+);for(i=0; i0;n-)_nop_();/*/*NRF24L01初始化/*/void init_NRF24L01(void) inerDelay_us(100);CE=0; / chip enableCSN=1; / Spi disable SCK=0; / Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 写接收端地址 P0SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX1_ADDRESS, RX_ADR_WIDTH); / 写接收端地址 P1SPI_Write_Buf(WRITE_REG + RX_ADDR_P2, RX2_ADDRESS, 1); / 写接收端地址 P2SPI_Write_Buf(WRITE_REG + RX_ADDR_P3, RX3_ADDRESS, 1); / 写接收端地址 P3SPI_Write_Buf(WRITE_REG + RX_ADDR_P4, RX4_ADDRESS, 1); / 写接收端地址 P4SPI_Write_Buf(WRITE_REG + RX_ADDR_P5, RX5_ADDRESS, 1); / 写接收端地址 P5SPI_RW_Reg(WRITE_REG + EN_AA,0x3F); / 频道0 - 5 自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR,0x3F); / 允许接收地址频道0 - 5SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为RX_PLOAD_WIDTH字节SPI_RW_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为RX_PLOAD_WIDTH字节SPI_RW_Reg(WRITE_REG + RX_PW_P2, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为RX_PLOAD_WIDTH字节SPI_RW_Reg(WRITE_REG + RX_PW_P3, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为RX_PLOAD_WIDTH字节SPI_RW_Reg(WRITE_REG + RX_PW_P4, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为RX_PLOAD_WIDTH字节SPI_RW_Reg(WRITE_REG + RX_PW_P5, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为RX_PLOAD_WIDTH字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /设置发射速率为1MHZ,发射功率为最大值0dBCE=1; / chip disable/*/*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序/*/uint SPI_RW(uint uchar)uint bit_ctr; for(bit_ctr=0;bit_ctr8;bit_ctr+) / output 8-bit 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; / .then set SCK low again return(uchar); / return read uchar/*/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序/*/uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI communicationreturn(reg_val); / return register value/*/*功能:NRF24L01读写寄存器函数/*/uint SPI_RW_Reg(uchar reg, uchar value)uint status;CSN = 0; / CSN low, init SPI transactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 毒物检验在急性中毒诊治中的作用
- 尊师重教育弘扬礼仪
- 物理高一暑假课件
- 路桥各工序质量技术培训
- 保安坐姿培训
- 幼儿园小班数学《认识圆形》课件
- java面试题及答案百家号
- 新年健康教育专题指南
- 2025年眼用抗感染药项目提案报告
- java构造方法面试题及答案
- 丁腈橡胶材质报告
- DB15-T 3586-2024 黄河灌区高标准农田盐碱地改良效果综合评价方法
- 2024-2030年中国宠物家具行业市场发展趋势与前景展望战略分析报告
- DL∕T 901-2017 火力发电厂烟囱(烟道)防腐蚀材料
- DL∕T 664-2016 带电设备红外诊断应用规范
- 河北省承德市平泉市2023-2024学年七年级下学期期末数学试题(无答案)
- DL-T448-2016电能计量装置技术管理规程
- 2024建筑工程劳务分包合同标准范本
- QB/T 2660-2024 化妆水(正式版)
- 《化工和危险化学品生产经营单位重大生产安全事故隐患判定标准(试行)》解读课件
- 基于Python+MySQL的员工管理系统的设计与实现
评论
0/150
提交评论