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

下载本文档

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

文档简介

1、精选文档NRF24L01无线模块C语言程序24MHz晶振#include#include#include#include#include#include#define U8  unsigned char#define U16 unsigned int#define TX_ADDR_WITDH 5 /发送地址宽度设置为5个字节#define RX_ADDR_WITDH 5 /接收地址宽度设置为5个字节#define TX_DATA_WITDH 1/发送数据宽度1个字节#define RX_DATA_WITDH 1/接收数据宽度1个字节#define  R_

2、REGISTER     0x00/读取配置寄存器#define  W_REGISTER     0x20/写配置寄存器#define  R_RX_PAYLOAD   0x61/读取RX有效数据#define  W_TX_PAYLOAD  0xa0/写TX有效数据#define  FLUSH_TX   0xe1/清除TXFIFO寄存器#define  FLUSH_RX   0xe2/清除

3、RXFIFO寄存器#define  REUSE_TX_PL    0xe3/重新使用上一包有效数据#define  NOP            0xff/空操作#define  CONFIG          0x00/配置寄存器#define  EN_AA    0x01/使能自动应答#defi

4、ne  EN_RXADDR       0x02/接收通道使能0-5个通道#define  SETUP_AW        0x03/设置数据通道地址宽度3-5#define  SETUP_RETR      0x04/建立自动重发#define  RF_CH          

5、 0x05/射频通道设置#define  RF_SETUP        0x06/射频寄存器#define  STATUS          0x07/状态寄存器#define  OBSERVE_TX      0x08/发送检测寄存器#define  CD       

6、60;      0x09/载波#define  RX_ADDR_P0      0x0a/数据通道0接收地址#define  RX_ADDR_P1      0x0b/数据通道1接收地址#define  RX_ADDR_P2      0x0c/数据通道2接收地址#define  RX_ADDR_P3    

7、0; 0x0d/数据通道3接收地址#define  RX_ADDR_P4      0x0e/数据通道4接收地址#define  RX_ADDR_P5      0x0f/数据通道5接收地址#define  TX_ADDR         0x10/发送地址#define  RX_PW_P0        0

8、x11/P0通道数据宽度设置#define  RX_PW_P1        0x12/P1通道数据宽度设置#define  RX_PW_P2        0x13/P2通道数据宽度设置#define  RX_PW_P3        0x14/P3通道数据宽度设置#define  RX_PW_P4    

9、    0x15/P4通道数据宽度设置#define  RX_PW_P5        0x16/P5通道数据宽度设置#define  FIFO_STATUS     0x17/FIFO状态寄存器/NRF24L01U8 NRFACK();U8 NRFSPI(U8 date);U8 NRFReadReg(U8 RegAddr);U8 NRFWriteReg(U8 RegAddr,U8 date);U8 NRFReadRxDate(U8 R

10、egAddr,U8 *RxDate,U8 DateLen);U8 NRFWriteTxDate(U8 RegAddr,U8 *TxDate,U8 DateLen);U8 NRFRevDate(U8 *RevDate);void NRFSetTxMode(U8 *TxDate);void NRF24L01Int();void NRFSetRXMode();U8 CheckACK();void Delay(U16 t);U8 bdata sta;/mainvoid Delay_10ms(U16 del);bit  CE=P14;  /RX/TX模式选择端sbit IRQ=P11

11、; /可屏蔽中断端sbit CSN=P16; /SPI片选端/就是SSsbit MOSI=P10; /SPI主机输出从机输入端1sbit MISO=P12; /SPI主机输入从机输出端sbit SCLK=P13; /SPI时钟端U8 code TxAddr=0x34,0x43,0x10,0x10,0x01;/发送地址U8 bdata sta;   /状态标志sbit RX_DR=sta6;sbit TX_DS=sta5;sbit MAX_RT=sta4;void Delay(U16 t)  U16 x,y;  for(x=t

12、;x>0;x-)   for(y=110;y>0;y-);U8 NRFSPI(U8 date)                                       

13、60;          U8 i;    for(i=0;i<8;i+)          / 循环8次       if(date&0x80)     MOSI=1;   else     MOSI=0; 

14、60; / byte最高位输出到MOSI      date<<=1;             / 低一位移位到最高位      SCLK=1;   if(MISO)          / 拉高SCK,nRF24L01从MOSI读入1位数据, 同时从MISO输出1位数据

15、0;       date|=0x01;        / 读MISO到byte最低位      SCLK=0;             / SCK置低        return(date);     

16、60;      / 返回读出的一字节void NRF24L01Int() Delay(2);/让系统什么都不干 CE=0; /待机模式1   CSN=1;  SCLK=0; IRQ=1; U8 NRFReadReg(U8 RegAddr)   U8 BackDate;   CSN=0;/启动时序   NRFSPI(RegAddr);/写寄存器地址   BackDate=NRF

17、SPI(0x00);/写入读寄存器指令    CSN=1;   return(BackDate); /返回状态U8 NRFWriteReg(U8 RegAddr,U8 date)   U8 BackDate;   CSN=0;/启动时序   BackDate=NRFSPI(RegAddr);/写入地址   NRFSPI(date);/写入值   CSN=1;   return(BackDate);U8 NRFReadRxDat

18、e(U8 RegAddr,U8 *RxDate,U8 DateLen)  /寄存器地址/读取数据存放变量/读取数据长度/用于接收    U8 BackDate,i; CSN=0;/启动时序 BackDate=NRFSPI(RegAddr);/写入要读取的寄存器地址 for(i=0;i         RxDatei=NRFSPI(0);       CSN=1;   return(Bac

19、kDate);U8 NRFWriteTxDate(U8 RegAddr,U8 *TxDate,U8 DateLen) /寄存器地址/写入数据存放变量/读取数据长度/用于发送   U8 BackDate,i;   CSN=0;   BackDate=NRFSPI(RegAddr);/写入要写入寄存器的地址   for(i=0;i          NRFSPI(*TxDate+);     

20、0; CSN=1;   return(BackDate);void NRFSetTxMode(U8 *TxDate)/发送模式    CE=0;    NRFWriteTxDate(W_REGISTER+TX_ADDR,TxAddr,TX_ADDR_WITDH);/写寄存器指令+接收地址使能指令+接收地址+地址宽度 NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);/为了应答接收设备,接收通道0地址和发送地址相同 NRFWrit

21、eTxDate(W_TX_PAYLOAD,TxDate,TX_DATA_WITDH);/写入数据    NRFWriteReg(W_REGISTER+EN_AA,0x01);       / 使能接收通道0自动应答   NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);   / 使能接收通道0   NRFWriteReg(W_REGISTER+SETUP_RETR,0x0a);  / 自动重发延时等待250u

22、s+86us,自动重发10次   NRFWriteReg(W_REGISTER+RF_CH,0x40);         / 选择射频通道0x40   NRFWriteReg(W_REGISTER+RF_SETUP,0x07);    / 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 NRFWriteReg(W_REGISTER+CONFIG,0x0e);      / CR

23、C使能,16位CRC校验,上电  CE=1; Delay(5);/保持10us秒以上/主要接收模式void NRFSetRXMode() CE=0;    NRFWriteTxDate(W_REGISTER+RX_ADDR_P0,TxAddr,TX_ADDR_WITDH);  / 接收设备接收通道0使用和发送设备相同的发送地址   NRFWriteReg(W_REGISTER+EN_AA,0x01);        

24、       / 使能接收通道0自动应答   NRFWriteReg(W_REGISTER+EN_RXADDR,0x01);           / 使能接收通道0   NRFWriteReg(W_REGISTER+RF_CH,0x40);             &#

25、160;   / 选择射频通道0x40   NRFWriteReg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);  / 接收通道0选择和发送通道相同有效数据宽度   NRFWriteReg(W_REGISTER+RF_SETUP,0x07);            / 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益*/   NRFWriteReg(W_REGIS

26、TER+CONFIG,0x0f);              / CRC使能,16位CRC校验,上电,接收模式   CE = 1; Delay(5);/保持10us秒以上    U8 CheckACK()  /用于发射 sta=NRFReadReg(R_REGISTER+STATUS);       

27、0;            / 返回状态寄存器 if(TX_DS|MAX_RT) /发送完毕中断     NRFWriteReg(W_REGISTER+STATUS,0xff);  / 清除TX_DS或MAX_RT中断标志    CSN=0;    NRFSPI(FLUSH_TX);/用于清空FIFO !关键!不然会出现意想不到的后果!大家记住!  

28、;      CSN=1;    return(0);  else    return(1);/用于接收模式U8 NRFRevDate(U8 *RevDate)     U8 RevFlags=0;  sta=NRFReadReg(R_REGISTER+STATUS);/发送数据后读取状态寄存器     if(RX_DR)    / 判断是否接收到

29、数据       CE=0;    /SPI使能  NRFReadRxDate(R_RX_PAYLOAD,RevDate,RX_DATA_WITDH);/ 从RXFIFO读取数据  RevFlags=1;    /读取数据完成标志     NRFWriteReg(W_REGISTER+STATUS,0xff); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标  return(RevFlags);void Delay_10ms(U16 del) U16

温馨提示

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

评论

0/150

提交评论