NRF24l01一对一双向通信程序_第1页
NRF24l01一对一双向通信程序_第2页
NRF24l01一对一双向通信程序_第3页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、以下程序参考多个网络程序后,经调试并且已经调通,可以稍加修改即可使用 经测试可实现双向通信发送方本程序实现功能:从 52单片机串口读入数据后通过24L01发送 /24L01 发送#in elude <reg52.h>#in elude vintrin s.h>typedef un sig ned char uehar; typedef un sig ned char uint;/*NRF24L01端口定义*sbit MISO =P1A4; sbit MOSI=P1A3;sbit SCK =P1A2;sbit CE =P1A0;sbit CSN =P1A1; sbit IRQ

2、=P1A5;/*按键*/sbitKEY仁卩3人6;/sbit KEY2=P3A7;/*数码管位选*/sbitled3=P2A0;/sbitled2=P2A1;/sbitled1=P2A2;/sbitled0=P2A3;/*蜂明器*/sbit BELL=P3A4;/*数码管0-9编码*/uehar seg10=0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90; 码09 段*#defi ne TX_ADR_WIDTH5/ 5 uints TX address width#defi ne RX_ADR_WIDTH5/ 5 ui nts RX addr

3、ess width#defi ne TX_PLOAD_WIDTH10/ 20 ui nts TX payload#defi ne RX_PLOAD_WIDTH10/ 20 uints TX payload/*NRF24L01uint con st TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01; uint con st RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址/接收地址/*NRF24L01寄存器指令*#defi ne READ_REG0x00/读寄存器指令#define WRI

4、TE_REG0x20/ 写寄存器指令#define RD_RX_PLOAD0x61/ 读取接收数据指令#define WR_TX_PLOAD0xA0/ 写待发数据指令#define FLUSH_TX0xE1/ 冲洗发送 FIFO 指令#define FLUSH_RX0xE2/ 冲洗接收 FIFO 指令#define REUSE_TX_PL0xE3/ 定义重复装载数据指令#define NOP0xFF/ 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG#define EN_AA#define EN_RXADDR#define SETUP_AW #define SETUP

5、_RETR#define RF_CH#define RF_SETUP #define STATUS0x00 / 配置收发状态, CRC 校验模式以及收发状态响应方式0x01 / 自动应答功能设置0x02/ 可用信道设置0x03/ 收发地址宽度设置0x04/ 自动重发功能设置0x05/ 工作频率设置0x06/ 发射速率、功耗功能设置0x07/ 状态寄存器0x08 / 发送监测功能#define OBSERVE_TX0x09 / 地址检测*#define RX_ADDR_P00x0A#define RX_ADDR_P10x0B#define RX_ADDR_P20x0C#define RX_ADD

6、R_P30x0D#define RX_ADDR_P40x0E#define RX_ADDR_P50x0F#define TX_ADDR0x10#define RX_PW_P00x11#define RX_PW_P10x12#define RX_PW_P20x13#define RX_PW_P30x14#define RX_PW_P40x15#define RX_PW_P50x16#define FIFO_STATUS0x17#define CD/*/ 频道 0 接收数据地址/ 频道 1 接收数据地址/ 频道 2 接收数据地址/ 频道 3 接收数据地址/ 频道 4 接收数据地址/ 频道 5 接收

7、数据地址/ 发送地址寄存器/ 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度 / 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度 / 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

8、(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); void nRF24L01_TxPacket(unsigned char * tx_buf);/*长延时*void Delay(unsigned int s) unsigned int i; for(i=0;

9、 i<s; i+); for(i=0; i<s; i+);*uint bdata sta;/状态标志sbit RX_DR =staA6;sbit TX_DS =staA5; sbit MAX_RT =staA4;延时函数 */* void inerDelay_us(unsigned char n) for(;n>0;n-)_nop_();/*NRF24L01初始化 *void init_NRF24L01(void) inerDelay_us(100);CE=0;/ chip enableCSN=1;/ Spi disableSCK=0; /SPI_Write_Buf(WRIT

10、E_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);/ 允许接收地址只有频道 0,如果需要多频道可以参考 Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0);/ 设置信道工作为 2.4GHZ

11、,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);/设置接收数据长度,本次设置为32 字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);/设置发射速率为 1MHZ ,发射功率为最大值 0dB/* /* 函数: uint SPI_RW(uintuchar) /*功能: NRF24L01 的 SPI 写时序/* */uint SPI_RW(uint uchar)uint bit_ctr;for(bit_ctr=0;bit_ctr<8;bit_ctr+) / output 8-bitMOSI =(uc

12、har& 0x80);/ output 'uchar', MSB to MOSIuchar =(uchar<< 1);/ shift next bit into MSB.SCK =1;/ Set SCK high.uchar |= MISO;/ capture current MISO bit return(uSCK =0;/ .then set SCK low againchar);/ return read uchar/* /* 函数: ucharSPI_Read(ucharreg) /*功能: NRF24L01 的 SPI 时序/*uchar SPI_

13、Read(uchar reg) CSN = 0;/ CSN low, initialize SPI communication.SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1;/ Select register to read from./ .then read registervalue/ CSN high, terminate SPI communicationreturn(reg_val);/ return register value* */* 功能: NRF24L01 读写寄存器函数* */uint SPI_RW_Reg(uchar reg, uc

14、har value) uint status;CSN = 0; status = SPI_RW(reg); SPI_RW(value);/ CSN low, init SPI transaction / select register/ .and write value to it.CSN = 1;/ return nRF24L01 status uchar/ CSN high againreturn(status);/* */ /* 函数: uintSPI_Read_Buf(ucharreg, uchar *pBuf, ucharuchars)/*功能:用于读数据,reg:为寄存器地址,pB

15、uf:为待读出数据地址,uchars:读出数据的 个数/* */ uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) uint status,uchar_ctr;CSN = 0;status = SPI_RW(reg);/ Set CSN low, init SPI tranaction/ Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+) pBufuchar_ctr = SPI_RW(0);

16、/CSN = 1;return(status);/ return nRF24L01 status uchar/*/* 函数: uintSPI_Write_Buf(ucharreg, uchar *pBuf, ucharuchars)/*功能:用于写数据:为寄存器地址,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; ucha

17、r_ctr<uchars; 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 , 0x0f); / IRQ 收发完成中断响应, 16 位 CRC ,主接收CE = 1;inerDelay_us(130); /* */* 函数: unsigned char nRF24L01_RxPacket(unsigned ch

18、ar* 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 使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1; / 读取数据

19、完成标志SPI_RW_Reg(WRITE_REG+STA TUS,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_

20、WIDTH); / 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);/ 装 载 数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ 收发完成中断响应, 16 位 CRC ,主发送CE=1;/置高CE,激发数据发送inerDelay_us(10); /*/ unsigned char tf =0; unsigned char TxBuf10=0; / unsigned char RxBuf10=0;函数/* /* 主*void main(void)/% 单片机串口初始化 /SCON=0x5

21、0;/SCON: 模式 1,8-bitUART, 使能接收 :REN=1 TMOD=0x20;TH1=0xfd;/ 波特率 9600 初值 TL1=0xfd;TR1=1;EA= 1 ;/打开总中断ES= 1 ;/打开串口中断/%/init_NRF24L01() ;/ 上面保留三句移到了全局变量 while(1) nRF24L01_TxPacket(TxBuf);/ Transmit Tx buffer dataDelay(1000);/ SPI_RW_Reg(WRITE_REG+STA TUS,0xff);/ 清零状态寄存器?/*SetRX_Mode();nRF24L01_RxPacket(R

22、xBuf);SBUF=RxBuf0;/ 存放到本单片机串口输出 ?Delay(600);/?void UART_SER() in terrupt 4/uchar Temp;/定义临时变量if(RI)RI=0;/标志位清零/读入缓冲区的值TxBufO=SBUF; 把输入的 save 到 TxBuf 里/Delay(1000);/?if(TI)/如果是发送标志位,清零TI=0;接收方:以下程序参考多个网络程序后,经调试并且已经调通,可以稍加修改即可使用本程序实现功能:24L01接收到数据后通过 52单片机串口输出到电脑端查看,同时又把数 据回传(发送)实现双向通信#in clude <reg

23、52.h>#in clude vintrin s.h> typedef un sig ned char uchar;typedef un sig ned char uint;/*NRF24L01端口定义*sbit MISO =P1A4; sbit MOSI=P1A3;sbit SCK =P1A2;sbit CE =P1A0;sbit CSN =P1A1;sbit IRQ =P1A5;/*NRF24L01*#defi ne TX_ADR_WIDTH5/ 5 ui nts TX address width#define RX_ADR_WIDTH5#define TX_PLOAD_WID

24、TH10#define RX_PLOAD_WIDTH10/ 5 uints RX address width/ 20 uints TX payload/ 20 uints TX payload/*NRF24L01#define READ_REG0x00寄存器指令 */ 读寄存器指令#define WRITE_REG0x20/ 写寄存器指令#define RD_RX_PLOAD0x61/ 读取接收数据指令#define WR_TX_PLOAD0xA0/ 写待发数据指令#define FLUSH_TX0xE1/ 冲洗发送 FIFO 指令#define FLUSH_RX0xE2/ 冲洗接收 FIFO

25、 指令#define REUSE_TX_PL0xE3/ 定义重复装载数据指令#define NOP0xFF/ 保留uint const TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/ 本地地址uint const RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/ 接收地址/*SPI(nRF24L01)寄存器地址*0x00 / 配置收发状态, CRC 校验模式以及收发状态响应方式0x01 / 自动应答功能设置0x02 / 可用信道设置#define CONFIG #define EN_AA

26、#define EN_RXADDR #define SETUP_AW #define SETUP_RETR #define RF_CH #define RF_SETUP #define STATUS#define OBSERVE_TX #define CD0x03/ 收发地址宽度设置0x04/ 自动重发功能设置0x05/ 工作频率设置0x06/ 发射速率、功耗功能设置0x07/ 状态寄存器0x08/ 发送监测功能0x09/ 地址检测/ 频道 0 接收数据地址/ 频道 1 接收数据地址/ 频道 2 接收数据地址/ 频道 3 接收数据地址/ 频道 4 接收数据地址/ 频道 5 接收数据地址/ 发送

27、地址寄存器/ 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度 / 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度/ 接收频道 0 接收数据长度 / FIFO 栈入栈出状态寄存器设置#define RX_ADDR_P00x0A#define RX_ADDR_P10x0B#define RX_ADDR_P20x0C#define RX_ADDR_P30x0D#define RX_ADDR_P40x0E#define RX_ADDR_P50x0F#define TX_ADDR0x10#define RX_PW_P00x11#define RX_PW_

28、P10x12#define RX_PW_P20x13#define RX_PW_P30x14#define RX_PW_P40x15#define RX_PW_P50x16#define FIFO_STATUS0x17/*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, uc

29、har value);uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);/*长延时*void Delay(unsigned int s) unsigned int i; for(i=0; i<s; i+); f

30、or(i=0; i<s; i+);*uint bdata sta;/状态标志sbit RX_DR =staA6;sbit TX_DS =staA5; sbit MAX_RT =staA4;延时函数 */* void inerDelay_us(unsigned char n) for(;n>0;n-)_nop_();/*NRF24L01初始化 *void init_NRF24L01(void) inerDelay_us(100);CE=0;/ chip enableCSN=1;/ Spi disableSCK=0; /SPI_Write_Buf(WRITE_REG + TX_ADDR

31、, 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);/ 允许接收地址只有频道 0,如果需要多频道可以参考 Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0);/ 设置信道工作为 2.4GHZ ,收发必须一致SPI_RW_Re

32、g(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /设置接收数据长度,本次设置为32 字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);/设置发射速率为 1MHZ ,发射功率为最大值 0dB /* /* 函数: uint SPI_RW(uintuchar)/*功能: NRF24L01 的 SPI 写时序/* */uint SPI_RW(uint uchar)uint bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr+) / output 8-bitMOSI =(uchar& 0x80)

33、;/ output 'uchar', MSB to MOSIuchar =(uchar<< 1);/ shift next bit into MSB.SCK =1;/ Set SCK high.uchar |= MISO;/ capture current MISO bit return(uSCK =0;/ .then set SCK low againchar);/ return read uchar/* /* 函数: ucharSPI_Read(ucharreg) /*功能: NRF24L01 的 SPI 时序/*uchar SPI_Read(uchar reg

34、) CSN = 0;/ CSN low, initialize SPI communication.SPI_RW(reg); reg_val = SPI_RW(0); CSN = 1;/ Select register to read from./ .then read registervalue/ CSN high, terminate SPI communicationreturn(reg_val);/ return register value*/* 功能: NRF24L01 读写寄存器函数*uint SPI_RW_Reg(uchar reg, uchar value) uint sta

35、tus;CSN = 0; status = SPI_RW(reg); SPI_RW(value);CSN = 1;/ CSN low, init SPI transaction / select register/ .and write value to it./ CSN high againreturn(status); / return nRF24L01 status uchar /*/* 函数:uintSPI_Read_Buf(ucharreg, uchar *pBuf, ucharuchars)/*功能:用于读数据,reg:为奇存器地址,pBuf:为待读出数据地址,uchars:读出数

36、据的个数/* */uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0;status = SPI_RW(reg);/ Set CSN low, init SPI tranaction/ Select register to write to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); /CSN = 1;return(status); /

37、 return nRF24L01 status uchar /*/* 函数: uintSPI_Write_Buf(ucharreg, uchar *pBuf, ucharuchars)/*功能:用于写数据:为寄存器地址,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_ctr<uchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1;/ 关闭 SPIreturn(status); /* */* 函数: void SetRX_Mode(void)/*功能:数据接收配置/*/void SetRX_Mode(void)CE=0;16SPI_RW_Reg(WRITE_REG + CONFIG , 0x0f); / IRQ 收发完成中断响应, 位 CRC ,主接收CE = 1; inerDelay_us(130);/* */* 函数: unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/* 功能:数据读取后放入 r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论