NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机_第1页
NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机_第2页
NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机_第3页
NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机_第4页
NRF24L01全双工调试程序 自动切换收发模式 可用于实现对讲机_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、/NRF24L01调试程序,全双工双向通信,即两个模块兼具收发功能,自动高速切换收发模 式。/使用本程序的前提条件是:硬件没问题。如果能正确运行本程序,也能说明你的硬件电路 没问题。/大家根据实际情况,更改NRF24L01各引脚、LED和KEY的宏定义。/LED 灯的状态由 RxBuflO来决定,RxBufO = O,LED 输出 0; RxBuf0 = 1,LED 输出 1; 你也可以自行更改规则。力KEY可以改变TxBuflO的值,从而改变另一起模块RxBuflO的值,进而改变LED的状态。 /此程序未用到外部中断,即不响应IRQ因此IRQ引脚可以接任意UOII,不必接到外部 中断引脚,不

2、过建议接到外部中断引脚。若注释部分为乱码:设置 keil: EditConfigurationEditorEncodmg 选择 chmese2312o/以下程序经过多次复制,粘贴到keil,没有错误,如出现错误,请下载文档后再复制。/粘贴到word后排布可能会变得不整齐,请自行排布。全双工应用实例: HYPERLINK /v_show/id_XNzM4MDYwNzY0.html /v_show/id_XNzM4MDYwNzY0.html#iiiclude#inc lude #define uchai unsigned char#define umt unsigned mtsbit POO =

3、PO 0; sbit P01 =POZ 1; sbit P02 = P0z2; sbit P03 = POZ3; sbit P04 = POZ 4; sbit P05 = POZ5; sbit P06 = P0z6; sbit P07 = P0z7;sbit PIO = P1AO; sbitPll =P1A1; sbitP12 = PlA2; sbitP13=PlA3; sbitP14 = PlA4; sbitP15 = PlA5; sbitP16 = Plz6; sbitP17 = PlA7;sbit P20 = P2A0; sbit P21 =P2A1; sbit P22 = P2A2;

4、sbit P23=P2A3;sbit P24 = P2A4;sbit P25 = P2A5;sbit P26 = P2A6;sbit P27 = P2A7;sbit P30 = P3ZO;sbit P31=P3A1;sbit P32 = P3A2;sbit P33=P3A3;sbit P34 = P3A4;sbit P35 = P3、5;sbit P36 = P3Z6;sbit P37 = P3A7;#define LED P36#define KEY P20yfy* * * * *void delayus(uint us)fbr(;us 0;us-)f_nop_();/*void delay

5、ius(umt ms)/延时?个 msuchar a,b,c;wlule(ms-)ffbi(c=l;cO;c-)foi(b=142;b0;b-) for(a=2;a0;a);*/IO 端 I I 定 义*:$:* 左* *:$:* * * 左* 左* *01*;$:*;$:*;$:*;$:*;$:*#defineCEPIO#defineSCKPl!#defineMISOP12#defineCSNP16#define MOSI P17define IRQP32俨*NRF24L01的 接 收 和 发 送 地 址#define TX_ADR_WIDTH#define RX_ADR_WIDTH#def

6、ine TX_PLOAD_WIDTH#define RX_PLOAD_WIDTH5/ 5个字节的TX地址长度5 5个字节的RX地址长度16 ?个字节的TX数据长度16 ?个字节的RX数据长度#define CONFIG#define EN_AA#define EN_RXADDR#define SETUP.AW#define SETUP_RETR#define RF_CH#define RF_SETUP#define STATUS#define OBSERVE_TX#define CD#define RX_ADDR_P0#define RX_ADDR_P1#define RX_ADDR_P2#d

7、efine RX_ADDR_P3#define RX_ADDR_P4#define RX_ADDR_P5#define TX_ADDR#define RX.PW.PO#define RX_PW.P1#define RX_PW_P2#define RX_PW_P3#define RX_PW_P4uchai const TX.ADDRESSTX_ADR_WIDTH= 0 x34,0 x43,0 x10.0 x10.0 x01; 本地地址uchai const RX_ADDRESSRX_ADR_WIDTH= 0 x34,0 x43,0 x10,0 x10,0 x01; 接收地址*NRF24L0寄存器

8、指*#define READ.REG0 x00 / 读寄存器#ddine WRITE_REG0 x20/ 写寄存器#define RD_RX_PLOAD0 x61 / 读取接收数据#ddine WR_TX_PLOAD0 xA0/ 写待发数据#define FLUSH.TXOxEl/ 冲 洗发送 FIFO#define FLUSH.RX0 xE2/ 冲洗接收 FIFO#define REUSE.TX_PL0 xE3 /定义重复装载数据define NOPOxFF / 保留* EEEHSPIQJRF24L01)寄存器地0 x00 配置收发状态,CRC校验模式以及收发状态响应方式0 x01 /自动应

9、答功能设置0 x02 可用信道设置0 x03 /收发地址宽度设置0 x04 /自动重发功能设置0 x05 /工作频率设置0 x06 /发射速率、功耗功能设置0 x07 /状态寄存器0 x08 /发送监测功能0 x09 地址检测0 x0A /频道0接收数据地址0 x0B /频道1接收数据地址0 x0C /频道2接收数据地址0 x0D /频道3接收数据地址OxOE /频道4接收数据地址OxOF /频道5接收数据地址0 x10 /发送地址寄存器0 x11 /接收频道0接收数据长度0 x12 /接收频道0接收数据长度0 x13 接收频道0接收数据长度0 x14 /接收频道0接收数据长度0 x15 接收

10、频道0接收数据长度#define RX_PW_P5 0 x16 接收频道0接收数据长度define FIFO_STATUS 0 x17 / FIFO栈入栈出状态寄存器设置void 1111CNRF24L010;uchai SPI_RW(uchar num);uchai SPI_Read(uchai- reg);void SetRX_ModeQ;void SetTx_Mode();uchai SPI_RW_Reg(uchar reg, uchar value);uchai SPI_Read_Buf(uchai- reg, uchai *pBuf, uchai ucliars);uchai SPI

11、_Write_Buf(uchai- reg, uchai *pBuf, uchai- uchais);void 11RF24L0l_RxPacket(uchar *ix_buf);void 11RF24L0 l_TxPacket(uchar *tx_buf);*#*:$:*:$:* * *:$:* * */uchai bdata sta;sbit RX_DR =staA6;sbit TX_DS =staA5;sbit MAX_RT =staA4;*:$:* * *左* * 左* *jpj24L01* *:$:* * *void 1111CNRF24L010delayus(lOO);CE=0;/

12、片选使能CSN=1; /SPI 使能SCK=0; / SPI时钟拉低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(VRITE_REG + EN_AA, 0 x01);通道 0自动应答SPI_RW_Reg(VRITE_REG + EN_RXADDR, 0 x01);/允许接收地址频道0 SPI_RW_Reg(VRITE_REG + RF_CH,

13、0 x32);设置信道工作频率,收发必须一致SPI_RW_Reg(VRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);设置接收数据长度SPI_RW_Reg(VRITE_REG + RF_SETUP. OxOf);设 置发射速率为2MHZ,发射功率为最大值OdBSPI_RW_Reg(VRITE_REG + CONFIG. 0 x7c);/IRQ 引脚不显示中断掉电模式1-16CRC校验 ,藤*:$:*:$:* *:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*/* 函数:umt SPI_RW(umt uchai)/*功能:N

14、RF24L01的SPI写时序* *左* * *:$:* */uchar SPI_RW(uchar num)uchar bit_cti;fbr(bit_ctr=0;bit_ctrv8;bit_ctr+) / output 8-bitMOSI = (num & 0 x80); num = (num 1);SCK= 1; num |= MISO;SCK = 0;leturn(num);*:$:*:$:*:$:*/ output *uchar MSB to MO SI / shift next bit into MSB./Set SCKlugh./ capture current MISO bit/

15、.tlien set SCK low again/ return read uchai函数:uchar SPI_Read(uchar reg)功能:NRF24L01的SPI时序*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:*:$:* *:$:*:$:*:$:*/ uchai SPI_Read(uchai- reg)uchar reg_val;CSN = 0;SPI_RW(reg);reg_val = SPI_RW(0);CSN= 1; CSN low, mitialize SPI comm

16、unication./ Select register to read from./ .then read registenTalue CSN high, terminate SPI conununication/ leturn register valueretuin(reg_val);*左* * *:$:* */*功能:NRF24L01读写寄存器函数*左* * *:$:* */uchai SPI_RW_Reg(uchar reg, uchar value)uchar status;/ CSN low, iiiit SPI tiansaction/ select register/ .and

17、 write value to it./ CSN high again/ return 11RF24L01 status ucharCSN = 0;status = SPI_RW(ieg);SPI_RW(value);CSN= 1;retum(status);/*:$:*:$:* *:$:* * *:$:*:$:*:$:*/uchai SPI_Read_Buf(uchai- reg, uchai *pBuf, uchai bytes)uchar status.byte_ctr;CSN = 0; / Set CSN low, iiiit SPI tranactionstatus = SPI_RW

18、(reg); / Select register to write to and read status bytefbi(byte_c tr=O; byte_ctrbytes; bytjcti+)pBuf!byte_ctr = SPI_RW(0); / Perform SPI_RW to read byte from 11RF24L01CSN = 1; Set CSN high agamretum(status); / return 11RF24L01 status byte/#*:$:*:$:*:$:* * *:$:*:$:*:$:* *:$:* * *:$:/* 函数:umt SPI_Wi

19、ite_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能:用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchais:写入数据的个数/#*:$:*:$:*:$:* * *:$:*:$:*:$:*/uchai SPI_Write_Buf(uchai- reg, uchai *pBuf, uchai- uchais)uchar status,uchar_ctr;CSN = 0;/SPI 使能status = SPI_RW(ieg);fdi(uchai_cti-O; uchai_ctiuchars; uchar_ctr+) / SPI_RW(*pBu

20、R+);CSN= 1;关闭 SPIretum(status); / * IMfU攵发程序 *左*void mfLRxTx(uchar mod_mfuchai *buff) Z/NRF24L01 收发程序static uchar mod_nrflb/static 地址不释放/*进入发射模式* iRmod_mf = t)iRmod_mfLb != T) mod nrf b = t;CE = 0;SPI_RW_Reg(WRITE_REG+STATUS,Oxff); 清除中断标志SPI_RW_Reg(FLUSH_TX,OxOO);清除 TX_FIFO 寄存器SPI_RW_Reg(XMUTE_REG +

21、 CONFIG,0 x7e);/IRQ 引脚不显示中断 上电 发射 模式1-16CRC校验CE= 1;delayus(13O);/从CE = 0到CE=1:即待机模式到收发模式,需要最大130us)俨*发送数据*CE = 0;Z/StandBy I 模式SPI_Wnte_Buf(WRITE_REG + RX_ADDR_P0. TX_ADDRESS, TX_ADR_WIDTH);/装载接收端地址SPI_Wnte_Buf(WR_TX_PLOAD,bi】ff,TX_PLOAD_WIDTH);/ 装我数据CE=1; 置高CE激发数据发送delayus(130)y/从CE = 0到CE= 1:即待机模式

22、到收发模式,需要最大130usdelayus(lOO);给发送数据一点时间比发送速度较快延时可以比接收少sta = SPI_Read(STATUS);/读取状态寄存器的值SPI_RW_Reg(WRITE_REG+STATUS,sta);/ 清除对应的中断if(TX_DS = 1)/发送成功再清除tx fifo寄存器(CE = 0;SPI_RW_Reg(FLUSH_TX,0 x00); 清除 tx fifo 寄存器 * 重 要 *CE= 1;俨*进入接收模式*else if(mod_nrf = T)接收模式iRmod_nrflb != T)(mod nrf b = Y;CE = 0;SPI_RW_Reg(WRITE_REG+STATUS,Oxff); 清 除中断标志SPI_RW_Reg(FLUSH_RX,0 x00);清除 RX.FIFO 寄存器SPI_RW_Reg(WRITE_REG + CONFIG. 0 x7f);/IRQ 引脚不显示中断 上电 接 收模式 1-16CRC校验C

温馨提示

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

评论

0/150

提交评论