NRF24L01无线模块C语言程序_第1页
NRF24L01无线模块C语言程序_第2页
NRF24L01无线模块C语言程序_第3页
NRF24L01无线模块C语言程序_第4页
NRF24L01无线模块C语言程序_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、NRF24L01无线模块C语言程序 24MHz晶振 #include include include #include ttinclude #include #define U8unsigned char #define U16 unsigned int ttdefine TX_ADDRJVITDH 5 /发送地址宽度设置为5个字节 ttdefine RX_ADDRJVITDH 5 /接收地址宽度设置为5个字节 ttdefine TX_DATA_WITDH 1发送数据宽度1个字节 ttdefine RX_DATAITDH 1/接收数据宽度1个字节 #define #define #define

2、 #define #define #define #define #define REREGISTER W_REGISTER R_RX_PAYLOAD W_TX_PAYLOAD FLUSH.TX FLUSH.RX REUSE_TX_PL NOP 0 x00/读取配置寄存器 0 x20写配置寄存器 0 x61/读取RX有效数据 OxaO/写TX有效数据 Oxel/清除TXFIFO寄存器 0 xe2/清除RXFIFO寄存器 0 xe3/重新使用上一包有效数据 Oxff/空操作 #define #define #define #define #define #define #define #defi

3、ne #define #define #define #define #define #define #define #define CONFIG EN_AA EN.RXADDR SETUP_AW SETUP_RETR RF_CH RF.SETUP STATUS OBSERVE.TX CD RX_ADDR_PO RX_ADDR_P1 RX_ADDR_P2 RX_ADDR_P3 RX_ADDR_P4 RX_.ADDR.P5 0 x00/配置寄存器 0 x01/使能自动应答 0 x02接收通道使能0-5个通道 0 x03设置数据通道地址宽度3-5 0 x04/建立自动重发 0 x05/射频通道设置

4、 0 x06射频寄存器 0 x07状态寄存器 0 x08发送检测寄存器 0 x09载波 0 x0a/数据通道0接收地址 OxOb/数据通道1接收地址 0 x0c/数据通道2接收地址 OxOd/数据通道3接收地址 OxOe/数据通道4接收地址 OxOf/数据通道5接收地址 #define #define #define #define #define #define #define #define TX_ADDR RX_PW_PO RX_PW_P1 RX_PW_P2 RX_PW_P3 RX_PW_P4 RX_PW_P5 FIFO_STATUS 0 x10/7发送地址 0X11/P0通道数据宽度设

5、置 0X12/P1通道数据宽度设置 0X13/P2通道数据宽度设置 0X14/P3通道数据宽度设置 0X15/P4通道数据宽度设置 0X16/P5通道数据宽度设置 0X17/FIF0状态寄存器 /NRF24L01 U8 NRFACK (); U8 NRFSPI(U8 date); U8 NRFReadReg(U8 RegAddr); U8 NRFWriteReg(U8 RegAddr, U8 date); U8 NRFReadRxDate(U8 RegAddr, U8 *RxDate, U8 DateLen); U8 NRFWriteTxDate(U8 RegAddr, U8 *TxDate,

6、 U8 DateLen); U8 NRFRevDate(U8 *RevDate); void NRFSetTxMode(U8 *TxDate); void NRF24L01Int(); void NRFSetRXMode(); U8 CheckACK (); void Delay(U16 t); U8 bdata sta; /main void Delay_10ms(U16 del): bitCE二P4;/RX/TX 模式选择端 sbit IRQ二Pll; /可屏蔽中断端 sbit CSN二P6; /SPI 片选端就是 SS sbit Mosi=pro; /SPI主机输出从机输入端1 sbit

7、 MISO二P2; /SPI主机输入从机输出端 sbit SCLK二P3; /SPI 时钟端 U8 code TxAddr = 0 x34, 0 x43, 0 x10, 0 x10, 0 x01 ;/发送地址 U8 bdata sta;/状态标志 sbit RX_DR二sta6; sbit TX_DS=stao; sbit MAX_RT二st4; void Delay(U16 t) U16 x, y; for(x二t;x0;x-) for (y=110;y0;y); U8 NRFSPI(U8 date) U8 i; for(i=0;i8;i+) if (date date=l; / byte最

8、高位输出到MOS I /低一位移位到最高位 MOSE; 辻(MISO) / 拉高 SCK, nRF24L01 从 MOSI 读入 1位数据, 同时从MISO输出1位数据 SCLK二1; date 1=0 x01; /读MISO到byte最低位 / SCK置低 SCLK二0; return(date); /返回读出的一字节 void NRF24L01Int() Delay (2);/让系统什么都不干 CE二0; 待机模式1 CSN二1; SCLK=O; IRQ二1; U8 NRFReadReg(U8 RegAddr) U8 BackDate; CSN二0;/启动时序 NRFSPI (RegAdd

9、r);/写寄存器地址 BackDate二NRFSPI (0 x00); 写入读寄存器指令 CSN二1; return (BackDate) ; /返回状态 U8 NRFWriteReg(U8 RegAddr, U8 date) U8 BackDate; CSN二0;/启动时序 BackDate=NRFSPI (RegAddr); 写入地址 NRFSPI (date) ;/写入值 CSN二1; return(BackDate); U8 NRFReadRxDate(U8 RegAddr, U8 *RxDate, U8 DateLen) 寄存器地址读取数据存放变量/读取数据长度用于接收 U8 Bac

10、kDate, i; CSN二0;/启动时序 BackDate二NRFSPI (RegAddr) ;/写入要读取的寄存器地址 for(i=0;i RxDatei=NRFSPI(O); CSN二1; return(BackDate); U8 NRFWriteTxDate(U8 RegAddr, U8 *TxDate, U8 DateLen) 寄存器地址写入数据存放变量/读取数据长度用于发送 U8 BackDate, i; CSN二0; BackDate二NRFSPI (RegAddr); 写入要写入寄存器的地址 for(i=0;i NRFSPI(*TxDate+); CSN二1; return(B

11、ackDate); void NRFSetTxMode(U8 *TxDate) 发送模式 CE二 0; NRFWriteTxDate (W_REGISTER+TX_ADDR, TxAddr, TX_ADDR_WITDH);/写寄 存器指令+接收地址使能指令+接收地址+地址宽度 NRFWriteTxDate (W_REGISTER+RX_ADDR_PO, TxAddr, TX_ADDR_WITDH) ; /为了应 答接收设备,接收通道0地址和发送地任相同 NRFWriteTxDate (W_TX_PAYLOAD, TxDate, TX_DATA_WITDH) ;/写入数据 NRFWriteReg

12、(W_REGISTER+EN_AA, 0 x01) :/ 使能接收通道 0自动应答 NRFWriteReg (W_REGISTER+EN_RXADDR, 0 x01) ;/ 使能接收通道 0 NRFWriteReg (W_REGISTER+SETUP_RETR, 0 x0a) ;/ 自动重发延时等待 250us+86us,自动重发10次 NRFWriteReg (W_REGISTER+RF_CH, 0 x40);选择射频 通道0 x40 NRFWriteReg(W_REGISTER+RF_SETUP, 0 x07):/ 数据传输率 1Mbps,发射功率OdBm,低噪声放大器增益 NRFWrit

13、eReg (W_REGISTER+CONFIG, OxOe) ;/ CRC 使能,16 位 CRC 校验,上电 CE二 1; Delay (5) ;/保持10us秒以上 /主要接收模式 void NRFSetRXMode() CE=O; NRFWriteTxDate(W_REGISTER+RX_ADDR_PO, TxAddr, TX_ADDR_WITDH);/ 接收设备接收通道0使用和发送设备袖同的反送地址 NRFWr辻eReg(W_REGISTER+EN_AA, 0 x01); /使能接收通道0自務应答 NRFWriteReg(W_REGISTER+EN_RXADDR, 0 x01);/ 使

14、能接收通道0 NRFWriteReg(W_REGISTER+RF_CH, 0 x40); /选择射频通道0 x40 NRFWriteReg(W_REGISTER+RX_PW_PO, TX_DATA_WITDH) ;/ 接收通道 0 选择和发送通道相同看效数据宽度 NRFWriteReg(W_REGISTER+RF_SETUP, 0 x07);/ 数据传输率1Mbps,疵射功率OdBm,低噪声放大器增益*/ NRFWriteReg(W_REGISTER+CONFIG, OxOf);/ / CRC使能,16位CRC校验,上电,接收模式 CE = 1; Delay (5) ;/保持10us秒以上 U

15、8 CheckACK () 用于发射 sta=NRFReadReg(R_REGISTER+STATUS); /返回状态奮存器 if (TX_DS! ;MAX_RT) /发送完毕中断 NRFWriteReg(W_REGISTER+STATUS, Oxff) :/ 清除 TX_DS 或 MAX_RT 中断标志 CSN二0; NRFSPI(FLUSH_TX);用于清空FIFO ! !关键! !不然会出现意想不到 的后果! ! !大家记住! CSN二1; return(0); else return (1); /用于接收模式 U8 NRFRevDate(U8 *RevDate) U8 RevFlags

16、=0; sta=NRFReadReg (R_REGISTER+STATUS) ; /发送数据后读取状态寄存器 if(RX_DR)/判断是否接收到数据 CE二0;/SPI 使能 NRFReadRxDate (R_RX_PAYLOAD, RevDate, RX_DATAITDH) ;/ 从 RXFIFO 读 取数据 RevFlags=l;/读取数据完成标志 NRFWriteReg(W_REGISTER+STATUS, Oxff);/ 接 收 到 数据后 RX_DR, TX_DS, MAX_PT都置高为1,通过写1来清楚中断标 return(RevFlags); void Delay_10ms(U16 del) U16 i, j; for (iO; idel; i+) for(j=0; j1827; j+)这个是通过软件仿真得出的数 /做发射 main() U8 TxDatel=0; NRF24L01Int(); Delay(6000); while (1) if(KEY=O) if(KEY=O) Delay_10ms(2); TxDate 0 =0 x08; 发射按键标识值 NRFSetTxMode(TxDate); while

温馨提示

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

评论

0/150

提交评论