版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、(相关人员如觉得本人水平低下,还请见谅) Nrf24L01的使用程序和使用方法和简单操作:功能:无线对发程序。两个模块a, b,实现按下一个按键,会在对方的数码管上显示3或4,在本机上显示1,2。当一个模块,比如 a模块。当两个按键按下其中一个,则会在另一个模块b上显示数字3,4(具体根据按下哪个按键)。以上功能描述,B模块按键按下,如同 a模块一样的功能,不 做系统性描述了。下面给出程序中几个地方的解释:#defi ne READ_REG0x00/读寄存器指令#defi ne WRITE_REG0x20/与寄存器扌曰令#defi ne RD_RX_PLOAD0x61/读取接收数据指令#def
2、i ne WR_TX_PLOAD0xA0/写待发数据指令#defi ne FLUSH_TX0xE1冲洗发送FIFO指令#defi ne FLUSH_RX0xE2/冲洗接收FIFO指令#defi ne REUSE_TX_PL0xE3/定义重复装载数据指令#defi ne NOP0xFF/保留类似这种的描述,可以等同于READ_REG =0x00;这个是经过实际程序测试出来的,比如以下程序:#in clude<reg51.h> #defi ne k 0xfe void mai n()P1=k;则会出现此类结果:MOSI = (uchar & 0x80); uchar = (uc
3、har << 1); SCK = 1; uchar |= MISO;/ output 'uchar', MSB to MOSI/ shift next bit into MSB. / Set SCK high./ capture current MISO bitSCK = 0;此处为 spi 的核心,是 spi 协议的编程,其中 uchar |= MISO; 表示 uchar |= MISO | uchar;MOSI = (uchar & 0x80);其中0x80是1000 0000,与上uchar,这种& ,是按位与,故可以 从 uchar 提取出
4、一个电平给 mosi。MOSI = (uchar & 0x80);/ output 'uchar', MSB to MOSIuchar = (uchar << 1);这两句组合起来用,就实现了把uchar编程8位2进制数后的每一位都可以发送给mosi;Uchar 的只待对象,就是上面的诸如 #define FLUSH_TX0xE1这样的数,或者是相关的发送数据。*pBuf 这个并不是一个主要的问题,实际这个是涉及指针问题的,带*的跟地址有关系,但是我们其实不需要很关心编译的时候数据被具体存入哪个地址,即使是很重要的数据。void init_NRF24L01(
5、void)inerDelay_us(100);CE=0;/ chip enableCSN=1;/ Spi disableSCK=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
6、);/ 允许接收地址只有频道 0,如果需要多频道可以参考 Page21SPI_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,发射功率为最大值 0dB 在整个初始化中我们看到:CE=0;/ chip enableCSN=1;/ Spi disable这是设置整个的状态。如过状态设置成待机,则
7、引脚可能变为高阻。 (以上并非全部引脚)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 的子程序,将寄存器指令放入 nrf24l01 。如果需深究,请参考 说明书,手册等。 或者可以通过 #define READ_REG 0x00 / 读 寄 存 器指 令 等 了解大概流程。在整个无线通信过程中,初始化只需设置一次。TxBuf
8、 存放的是发送的数据。并且此数据被发送时,是将这个数组的数全部发送的。对方 也全部接收。RxBuf 接收数组,用于存放对方发来的数据。SetRX_Mode(); nRF24L01_RxPacket(RxBuf); 当主程序中包含这两个子函数时, 且这时某个数据被发送过来, 则会被接收到。 且被存放到 了 RxBuf ;反之包含 nRF24L01_TxPacket(TxBuf); 且 TxBuf 已经存入你想要的数据的时候, 这个数据将 被发送。程序部分:下面给出程序,由于收发双方程序是完全一样的,所以只粘贴一份。程序虽然不是自己写的,但是经过实际测试的,没有任何诡异的问题。#include &
9、lt; reg52.h>#include < intrin s.h>typedef unsigned char uchar;typedef unsigned char uint;/*NRF24L01 端口定义 *sbit MISO=P1A3;sbit MOSI =P1A4;sbitSCKsbitCEsbitCSNsbitIRQ=P1A2;=P1A1;=P3A2;=P3A3;/*按键sbitKEY1=P 3A6;sbitKEY2=P 3A7;/*sbitled3=P2A0;数码管位 选 *sbit led2=P2A1;sbit led1=P2A2;sbit led0=P2A3;
10、/*蜂明器sbitBELL=P 3A4;/*数码管 0-9 编码 *uchar seg10=0xC 0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF 8,0x80,0x90;/09 段码/*NRF 24 L01*#define TX _ADR_WID TH/ 5 uints TX addr ess width#define RX _ADR _W IDTH/ 5 uints RX address width#define TX _PLOAD_WID TH20/ 20 uints TX payload#define RX _PLOAD_W IDTH20/ 20 uints T
11、X payloaduint const TX_ADD RESSTX _ADR _WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址uint const RX_ADDR ESSRX _AD R_WIDTH= 0x34,0x43,0x10,0x10,0x01;/接收地址/*NRF24L01 寄存器指 令 */*SPI(nRF24L01) 寄存器地址 *#define CONF IG0x00/配置收发状态,CRC校验模式以及收发状态响应方式#define EN _AA0x01/自动应答功 能设置#define EN _RXADDR0x02/ 可用信道设置#define SET
12、UP _AW0x03/ 收发地址 宽度设 置#define SETUP _RETR0x04/ 自动重发 功能设置#define RF_CH0x05/ 工作频 率设置#define RF_SETUP0x06/ 发射速 率、功耗 功能设 置#define STATU S0x07/ 状态寄存 器#define OBSERV E_TX0x08/ 发送监测 功能#define CD0x09 / 地址检测#define READ_REG0x00/ 读寄存器指令#define WR ITE_REG0x20/ 写寄存器指令#define RD _RX_PLOAD0x61/ 读取接收数据指令#define WR
13、 _TX_P LOAD0xA0/ 写待发数据指令#define FLUSH_TX0xE1/ 冲洗发送FIFO 指令#define FLUSH_RX0xE2/ 冲洗接收FIFO 指令#define REUSE_TX_P L0xE3/ 定义重复装载数据 指令#define NOP0xFF/ 保留P00x0A/ 频道 0 接收数据 地址P10x0B/ 频道 1 接收数据 地址P20x0C/ 频道 2 接收 数据地 址P30x0D/ 频道 3 接收 数据地 址P40x0E/ 频道 4接收数据 地址P50x0F/ 频道 5 接收 数据地 址#define RX _ADDR#define RX _ADDR
14、#define RX _ADDR#define RX _ADDR#define RX _ADDR#define RX _ADDR#define TX_ADDR0x10/ 发送地址寄存 器#define RX_PW_P00x11/ 接收频道0 接 收数据 长度#define RX_PW_P10x12/ 接收频 道0 接收 数据长 度#define RX_PW_P20x13/ 接收频 道0 接收 数据长 度#define RX_PW_P30x14/ 接收频 道0 接收 数据长 度#define RX_PW_P40x15/ 接收频 道0 接收 数据长 度#define RX_PW_P50x16/ 接
15、收频 道0 接收 数据长 度#define FIF O_STA TUS0x17/ FIFO 栈入栈出状态 寄存器 设置void Del ay(un signed int s);void i nerDelay_u s(unsigned char n);void i nit_NRF 24L01(void);uint SPI_RW(uint uch ar);uchar SPI_Re ad(uchar reg);void SetR X_M ode(void);uint SPI_RW _Reg(u char reg, uchar value);uint SPI_Re ad_Buf(uchar re g,
16、 uchar *p Buf, uchar uchars);uint SPI_Write_Buf(uch ar reg, uchar *pBuf, uchar uchars);unsigned char nRF 24L01_RxP acket(unsigned char* rx_b uf);void n RF24L01_TxP acket(unsigned char * t x_buf);/* 长延时 *void Del ay(un signed int s)unsigned int i;for(i=0; i<s; i +);for(i=0; i<s; i +);uint bdata
17、 sta;/状态标志sbitRX_DR=staA6;sbitTX_DS=staA5;sbitMAX_RT=staA4;/*延时函数void i nerDelay_u s(unsigned char n)for(;n>0;n-)_nop_();/*NRF 24L01 初始化void init_NRF 24L01(void)inerDel ay_us(100);CE= 0;/ chip enableCSN=1;/ Spi disableSCK=0; /SPI_Write_Buf(WR ITE_REG + TX_ADDR , TX_ADDR ESS, TX_ADR_W IDTH); / 写本地
18、地 址SPI_Write_Buf(WR ITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR _WIDTH); / 写接收端地 址SPI_RW _Reg(WRITE_R EG + EN _AA , 0x01);/ 频道 0 自动ACK 应答允许SPI_RW _Reg(WRITE_R EG + EN_RXADDR, 0x01);/ 允许接收 地址只有频道 0,如果需要多频道可以参考 Page21SPI_RW _Reg(WRITE_R EG + RF_CH, 0);/ 设置信道工 作为 2.4GHZ ,收发必 须一致SPI_RW _Re g(WRITE_R EG + R
19、X _PW_P 0, RX _PLOAD_WID TH); /设置接收数 据长度, 本次设 置为 32字节SPI_RW _Re g(WRITE_R EG + RF_SETUP , 0x07);/设置发射速率 为 1MHZ ,发射功率为 最大值 0dB/* 函数:uint SPI_R W(uint uch ar)/* 功能:NRF 24L01 的 SPI 写时序uint SPI_RW(uint uch ar)uint bit _ctr;for(bit_ctr= 0;bit _ctr<8;bit _ctr+) / / output 8-bitMOSI = (uch ar & 0x80
20、);uchar = (uc har << 1);SCK = 1;uchar |= MISO;SCK = 0;return(uc har);/ output 'uchar', MSB to MOS I/ shift next bit int o MSB./ Set SCK high./ capture current M ISO bit/ .then set SCK low again/ retur n read ucharSPI_RW(val ue);/ .and write value to it.SPI_RW(val ue);/ .and write value
21、 to it./* 函数: uchar SPI_Re ad(uchar reg)/*功能: NRF 24L01 的 SPI 时序uchar SPI_Re ad(uchar reg)uchar reg_val;CSN = 0;/ CSN low, initialize SPI communic ation.SPI_RW(re g);/ Select register to read from.reg_val = SP I_RW(0);/ .then read re gisterv alueCSN = 1;/ CSN high, terminate SPI commu nicationreturn
22、(reg_val); / return register value/*功能: NRF 24L01 读写寄存器函 数uint SPI_RW _Reg(u char reg, uchar value)uint status;CSN = 0;/ CSN low, init SPI tran sactionstatus = SPI_RW(re g);/ select registerSPI_RW(val ue);/ .and write value to it.CSN = 1;/ CSN high againreturn(statu s); / return nRF 24L01 stat us uc
23、har/* 函数: uint SPI_Re ad_Buf(uchar re g, uchar *p Buf, uchar u chars)/*功能:用于读数据,reg:为寄存器地 址,pBuf :为待读出 数据地址,uchars读出数据的 个数uint SPI_Re ad_Buf(uchar re g, uchar *p Buf, uchar uchars)uint status,uchar_ctr;CSN = 0;/ Set CSN low, init SPI tranacti onstatus = SPI_RW(re g);/ Select register to write to and
24、 read status ucharfor(uchar_ctr= 0;uchar_ctr<uch ars;uchar_ctr+ +)pBufuchar_ctr = SPI_RW( 0);/CSN = 1;return(statu s);/ return nRF 24L01 status uchar/*函数: uint SPI_Write _Buf(uchar reg, uchar *p Buf, uchar uchars)/*功能:用于写数据:为寄存器地址,pBuf :为待写入数据地址,uchars :写入数据的个数uint SPI_Write_Buf(uch ar reg, uchar
25、 *pBuf, uc har uchars)uint status,uchar_ctr;CSN = 0;/SPI 使能status = SPI_RW(re g);for(uchar_ctr= 0; uchar _ctr<uchar s; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1;/关闭 SPIreturn(statu s);/*函数: void SetRX _Mode(void)/*功能:数据 接收配 置void SetRX_M ode(void)CE= 0;SPI_RW _Reg(WRITE_R EG + CONF IG, 0x0f);/ IR Q收发完成
26、中断响应,16位CRC,主接收CE = 1;inerDel ay_u s(130);/* 函数: unsigned char nRF 24L01_R xPacket(unsigned char* r x_buf)/*功能:数据 读取后 放如 rx_buf 接收缓冲 区中unsigned char nRF 24L01_RxP acket(unsigned char* rx_b uf)unsigned char revale=0;sta=SPI_Read(S TA TUS); / 读取状态寄 存其来判断数 据接收 状况if(RX_DR) / 判断是否接 收到数 据CE = 0; /SPI 使能SP
27、I_Read _Buf(RD _RX _PLOAD,rx_b uf,TX _PLOAD_WID TH);/ re ad r eceive payload fr om RX _FIFO buffer revale =1;/读取数据完成标 志SPI_RW _Re g(WRITE_R EG+S TATUS,sta);/接收到数据 后 RX_DR ,TX _D S,MAX _PT 都置高为 1,通 过写 1来清楚中断标志return revale;/*函数: void nRF 24L01_TxP ack et(unsigned char * t x_b uf)/* 功能:发送 tx_buf 中数据vo
28、id n RF24L01_TxP acket(unsigned char * t x_buf)CE= 0; /StandBy I 模式SPI_Write_Buf(WR ITE_REG + R X_A DDR _P0, TX_ADDR ESS, TX_ADR _WIDTH); / 装载接收端 地址SPI_Write_Buf(WR _TX_P LOAD, tx_buf , TX_P LOAD _WIDTH); / 装载数据SP_RW _Reg(WRITE_R EG + CONFIG, 0x0e);/ IRQ 收发完成 中断响应,16位 CRC,主发送CE=1;/置高CE,激发数据发 送inerDelay_us(10);主函数 */*void mai n(void)unsigned char tf = 0;/unsigned char TxBuf
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北农业大学现代科技学院《生物化学实验》2021-2022学年第一学期期末试卷
- 2024短视频平台运营安全与合作合同2篇
- 空白房屋出租合同模板
- 2024年度游戏开发与代理协议2篇
- 2024年度智能家居研发与市场推广协议
- 护理输血安全质控制度
- 二零二四年度工程品牌授权合同2篇
- 暑假班新教师岗前培训
- 2024版计算机软件开发公司与云平台搭建服务合同3篇
- 2024范文大全商铺租期延长合同:租期调整与费用计算3篇
- 进料加工业务操作流程
- 2024年秸秆收储合同4
- 驾照考试题库及答案
- 导管相关血流感染预防与控制技术指南课件
- Unit 7 Section A(1a-1c)表格式教案 人教版英语七年级下册
- JBT 11699-2013 高处作业吊篮安装、拆卸、使用技术规程
- MOOC 单片机原理与应用实例仿真-河南理工大学 中国大学慕课答案
- 2024年全国版图知识竞赛(小学组)考试题库大全(含答案)
- 拟建建筑物地质差异较大时的地基处理措施
- 2024年福建泉州永春县永源城市建设有限公司招聘笔试参考题库附带答案详解
- 钢制汽车零件感应淬火金相检验
评论
0/150
提交评论