找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13289|回复: 8
打印 上一主题 下一主题
收起左侧

NRF24L01驱动程序及中文说明书手册下载(51单片机和STM32)

  [复制链接]
跳转到指定楼层
楼主
分享NRF24L01简单驱动,51程序,STM32程序都有,还有各种相关的非常详细的资料,下面一起来看看吧:





NRF24L01中文说明书手册:
nRF24L01P(新版无线模块控制IC).PDF
nRF24L01中文说明书.pdf
NRF24L01功能使用文档.pdf
RF产品设计经验.pdf
安信可2.4G模块选型及使用详解.pdf

NRF24L01引脚图:


NRF24L01简介:

NRF24L01参数:


NRF24L01结构方框图:


NRF24L01引脚功能:


单片机源程序如下LCD1602显示:
  1. /*NRF24L01+无线模块(和2.4G模块)测试 LCD1602 单位通道和多通道测试完成
  2. 和2.4G模块(两种)混合使用时,NRF24L01用于接收正常,NRF24L01相同配置下用于发送时接收不到应答

  3. 以下为个人理解(欢迎指正):
  4. 1,发送和接收模块要设置相同的发射频率(寄存器0x05),传输速率(寄存器0x06),CRC长度(寄存器0x00)
  5.    和自动应答(寄存器0x01)是否.
  6. 2,发送模块通道0的地址是应答时用的,要和发送地址(寄存器0xa0)是一样的,自动重发设置(寄存器0x04),
  7.    上电和设置为发送模式(寄存器0x00).
  8. 3,接收模块可以用任一通道接收,把要接收的通道地址(寄存器0x0a~0x0f)设置和发送模块的发送地址相
  9.    同即可,然后把用到的通道的应答(寄存器0x01)打开,通道接收(寄存器0x02)打开,设置通道有效位宽
  10.    度(寄存器0x11~0x16)(1次性接收的有效数据是多少个(可设0~32)),上电和设置为接收模式(寄存器0x00).
  11. 4.网上看到:使用靠后通道要把前面的通道一起配置,经测试可以直接使用第6个通道接收,前面5个通道不用
  12.    设置,但发送模式时,应答只能默认在通道0,接收模式通道随意使用.
  13. 5.由于条件有限,不好全部功其都测试,它设置可参考一起打包的中文使用手册,见谅*/

  14. #include<reg52.h>
  15. #define uchar unsigned char
  16. #define uint unsigned int

  17. sbit LCD_RS=P2^6;                                //LCD 数据/命令 端口
  18. sbit LCD_RW=P2^5;                                //LCD 读/写 端口
  19. sbit LCD_EN=P2^7;                                //LCD 使能 端口
  20. sbit LCD_BF=P0^7;                                //LCD 忙碌标志位

  21. sbit NRFT_IRQ =P1^0;                        //中断信号,无线通信过程中MCU主要是通过IRQ与NRF24L01进行通信
  22. sbit NRFT_MISO=P1^1;                        //芯片控制数据线(主入从出)
  23. sbit NRFT_MOSI=P1^2;                        //芯片控制数据线(主出从入)
  24. sbit NRFT_SCK =P1^3;                        //芯片控制的时钟线(SPI 时钟)
  25. sbit NRFT_CSN =P1^4;                        //芯片的片选线,CSN为低电平芯片工作
  26. sbit NRFT_CE  =P1^5;                        //芯片的模式控制线.在CSN为低的情况下,
  27.                                                                 //CE协同NRF24L01的CONFIG寄存器共同决定NRF24L01的状态
  28. sbit NRFR_IRQ =P3^7;                        //中断信号,无线通信过程中MCU主要是通过IRQ与NRF24L01进行通信
  29. sbit NRFR_MISO=P3^6;                        //芯片控制数据线(主入从出)
  30. sbit NRFR_MOSI=P3^5;                        //芯片控制数据线(主出从入)
  31. sbit NRFR_SCK =P3^4;                        //芯片控制的时钟线(SPI 时钟)
  32. sbit NRFR_CSN =P3^3;                        //芯片的片选线,CSN为低电平芯片工作
  33. sbit NRFR_CE  =P3^2;                        //芯片的模式控制线.在CSN为低的情况下,
  34.                                                                 //CE协同NRF24L01的CONFIG寄存器共同决定NRF24L01的状态

  35. sbit KEY_UPP=P2^1;                                //按键上
  36. sbit KEY_LOW=P2^2;                                //按键下
  37. sbit KEY_LEF=P2^3;                                //按键左
  38. sbit KEY_RIG=P2^4;                                //按键右

  39. sbit OK=P2^0;                                        //程序测试位

  40. code uchar TAB[]="0123456789ABCDEF";                                        //lcd显示寄存器用的字符
  41. uchar TAB_RX_DAT[32];                                                                        //接收到的数据读到这
  42. code uchar TAB_TR_ADDR[]={0x0f,0x02,0x03,0x04,0x05};        //发送,接收及应答用的地址

  43. uchar num=7;                                                                //lcd要显示的寄存器

  44. void Delay(uint xms)                                                //延时(12M晶振约1ms)
  45. {
  46.         uint i;
  47.         for(;xms>0;xms--)
  48.                 for(i=123;i>0;i--);
  49. }
  50. void LCD_Read_BF()                                                        //读lcd的忙碌标记位
  51. {
  52.         uint i=10000;
  53.         P0=0xff;
  54.         LCD_RS=0;
  55.         LCD_RW=1;
  56.         LCD_EN=1;
  57.         while((LCD_BF==1)&&(i-->0));                        //i-->0;意思是如果读lcd忙碌标记错误,i从10000减至0也跳出
  58.         LCD_EN=0;
  59. }
  60. void LCD_Write_DAT(uchar dat)                                //lcd写入数据
  61. {
  62.         LCD_Read_BF();
  63.         LCD_RS=1;
  64.         LCD_RW=0;
  65.         P0=dat;         
  66.         LCD_EN=1;
  67.         LCD_EN=0;
  68. }
  69. void LCD_Write_CMD(uchar cmd)                                //lcd写入命令
  70. {
  71.         LCD_Read_BF();
  72.         LCD_RS=0;
  73.         LCD_RW=0;
  74.         P0=cmd;         
  75.         LCD_EN=1;
  76.         LCD_EN=0;
  77. }
  78. void LCD_Init()                                                                //lcd初始化
  79. {
  80.         LCD_RW=1;
  81.         LCD_RS=0;
  82.         LCD_EN=0;
  83.         LCD_Write_CMD(0x38);
  84.         LCD_Write_CMD(0x0c);
  85.         LCD_Write_CMD(0x06);
  86.         LCD_Write_CMD(0X01);
  87. }
  88. uchar SPIT_RW(uchar dat)                                        //发送模块 SPI总线读写(NRF24L01接口)
  89. {
  90.         uchar i,val;
  91.         for(i=8;i>0;i--)
  92.         {
  93.                 NRFT_MOSI=(bit)(dat&0x80);
  94.                 dat<<=1;
  95.                 NRFT_SCK=1;         
  96.                 val<<=1;
  97.                 val|=NRFT_MISO;
  98.                 NRFT_SCK=0;
  99.         }
  100.         return val;
  101. }
  102. uchar NRFT_Read_REG(uchar reg)                                //发送模块 读寄存器1个数据
  103. {
  104.         uchar val;
  105.         NRFT_CSN=0;
  106.         SPIT_RW(reg);
  107.         val=SPIT_RW(0xff);
  108.         NRFT_CSN=1;
  109.         return val;
  110. }
  111. uchar NRFT_Write_REG(uchar reg,uchar dat)        //发送模块 写1个数据到寄存器
  112. {                                      //寄存器,要写入数据
  113.         uchar val;
  114.         NRFT_CSN=0;
  115.         val=SPIT_RW(0x20|reg);                        //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
  116.         SPIT_RW(dat);
  117.         NRFT_CSN=1;
  118.         return val;
  119. }
  120. uchar NRFT_Write_BUF(uchar reg,uchar *pBUF,uchar bytes)//发送模块 写入多个数据到寄存器
  121. {                                 //寄存器,要写入数据的首地址,写入数据的数量
  122.         uchar temp,i;
  123.         NRFT_CSN=0;
  124.         temp=SPIT_RW(reg|0x20);                        //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
  125.         Delay(1);
  126.         for(i=0;i<bytes;i++)
  127.                 SPIT_RW(*pBUF++);
  128.         NRFT_CSN=1;
  129.         return temp;
  130. }
  131. /*uchar NRFT_Read_BUF(uchar reg,uchar *pBUF,uchar bytes)//读出发送模块的多个数据(读出收到的数据)
  132. {
  133.         uchar temp,i;
  134.         NRFT_CSN=0;
  135.         temp=SPIT_RW(reg);
  136.         Delay(1);
  137.         for(i=0;i<bytes;i++)
  138.                 *pBUF++=SPIT_RW(0xff);
  139.         NRFT_CSN=1;
  140.         return temp;
  141. }*/
  142. uchar SPIR_RW(uchar dat)                                        //接收模块 SPI总线读写(NRF24L01接口)
  143. {
  144.         uchar i,val;
  145.         for(i=8;i>0;i--)
  146.         {
  147.                 NRFR_MOSI=(bit)(dat&0x80);
  148.                 dat<<=1;
  149.                 NRFR_SCK=1;         
  150.                 val<<=1;
  151.                 val|=NRFR_MISO;
  152.                 NRFR_SCK=0;
  153.         }
  154.         return val;
  155. }
  156. uchar NRFR_Read_REG(uchar reg)                                //接收模块 读寄存器1个数据
  157. {
  158.         uchar val;
  159.         NRFR_CSN=0;
  160.         SPIR_RW(reg);
  161.         val=SPIR_RW(0xff);
  162.         NRFR_CSN=1;
  163.         return val;
  164. }
  165. uchar NRFR_Write_REG(uchar reg,uchar dat)        //接收模块 写1个数据到寄存器
  166. {
  167.         uchar val;
  168.         NRFR_CSN=0;
  169.         val=SPIR_RW(0x20|reg);                        //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
  170.         SPIR_RW(dat);
  171.         NRFR_CSN=1;
  172.         return val;
  173. }
  174. uchar NRFR_Write_BUF(uchar reg,uchar *pBUF,uchar bytes)//接收模块 写入多个数据到寄存器
  175. {                                 //寄存器,要写入数据的首地址,写入数据的数量
  176.         uchar temp,i;
  177.         NRFR_CSN=0;
  178.         temp=SPIR_RW(reg|0x20);                        //NRF写入配置寄存器时规定bit6=bit7=0,bit5=1,bit0-bit4为有效位
  179.         Delay(1);
  180.         for(i=0;i<bytes;i++)
  181.                 SPIR_RW(*pBUF++);
  182.         NRFR_CSN=1;
  183.         return temp;
  184. }
  185. uchar NRFR_Read_BUF(uchar reg,uchar *pBUF,uchar bytes)//接收模块 读出的多个数据(读出收到的数据)
  186. {                                 //寄存器,读出数据存放的首地址,写入数据的数量
  187.         uchar temp,i;
  188.         NRFR_CSN=0;
  189.         temp=SPIR_RW(reg);
  190.         Delay(1);
  191.         for(i=0;i<bytes;i++)
  192.                 *pBUF++=SPIR_RW(0xff);
  193.         NRFR_CSN=1;
  194.         return temp;
  195. }
  196. void NRFT_Init()                                                        //NRF24L01发送模块初始化
  197. {
  198.         code uchar NRFT_TX_DAT[]={"abcdefghijklmnopABCDEFGHIJKLMNOP"};//要发送出去的数据                          
  199.         NRFT_CE=0;                        //关模块(无论是发送还是接收)
  200.         NRFT_CSN=1;                        //SPI通信的片选使能
  201.         NRFT_SCK=0;                        //SPI通信的时钟(这里选择空闲时为低电平)
  202.         NRFT_IRQ=1;                        //NRF模块的中断输出端(中断发生输出低电平)

  203.         NRFT_Write_BUF(0x10,TAB_TR_ADDR,0x05);                //发送地址(接收模块通道地址)
  204.         NRFT_Write_BUF(0x0a,TAB_TR_ADDR,0x05);                //数据通道0接收地址(发送模块总是用通道0作为答)
  205.         NRFT_Write_BUF(0xa0,NRFT_TX_DAT,32);        //写入要发送的数据(1-32字节,用于发送模式)

  206.         NRFT_Write_REG(0x01,0x01);                                //自动应答使能(发送模块总是用通道0作为答)
  207.         NRFT_Write_REG(0x02,0x01);                                //接收地址允许(发送模块的通道1要接收应答信号)
  208.         NRFT_Write_REG(0x04,0x12);                                //建立自动重发(高4位自动重发间隔时间,低4位重发次数)
  209.         NRFT_Write_REG(0x05,40);                                //射频通道(频率[0-127])(Fo=(2400+RF_CH)*MHz)
  210.         NRFT_Write_REG(0x06,0x07);                                //射频设置

  211.         NRFT_Write_REG(0x00,0x0e);                                //配置为上电,发送模式

  212.         NRFT_CE=1;                                                                //使能模块接收或者发送
  213. }
  214. void NRFR_Init()                                                        //NRF24L01接收模块初始化
  215. {
  216.         code uchar TAB_P1_ADDR[]={0x0b,0x02,0x03,0x04,0x05};
  217.                                                 //通道5的前4字节地址和通道1共用,用通道5也要设置通道1,用两地址不应相同                          
  218.         NRFR_CE=0;                        //关模块(无论是发送还是接收)
  219.         NRFR_CSN=1;                        //SPI通信的片选使能
  220.         NRFR_SCK=0;                        //SPI通信的时钟(这里选择空闲时为低电平)
  221.         NRFR_IRQ=1;                        //NRF模块的中断输出端(中断发生输出低电平)

  222.         NRFR_Write_BUF(0x0b,TAB_P1_ADDR,0x05);                //数据通道1接收地址(这里用通道1作为存放接收地址)
  223.         NRFR_Write_REG(0x0f,TAB_TR_ADDR[0]);                //数据通道5接收地址(只用1字节,共用通道1的4个高字节)

  224.         NRFR_Write_REG(0x01,0X20);                                //自动应答使能 只开通道5(用哪个通道接收就用哪个通道应答)                                                               
  225.         NRFR_Write_REG(0x02,0X20);                                //接收通道允许 只开通道5(b0-b5为接收通道0-5使能位)
  226.         NRFR_Write_REG(0x05,40);                                //射频通道(频率)(频率[0-127])(Fo=(2400+RF_CH)*MHz)
  227.         NRFR_Write_REG(0x06,0X07);                                //射频设置

  228. //        NRFR_Write_REG(0x11,32);                                //通道0有效字节宽度(0-32)
  229. //        NRFR_Write_REG(0x12,32);                                //通道1有效字节宽度(0-32)
  230. //        NRFR_Write_REG(0x13,32);                                //通道2有效字节宽度(0-32)
  231. //        NRFR_Write_REG(0x14,32);                                //通道3有效字节宽度(0-32)
  232. //        NRFR_Write_REG(0x15,32);                                //通道4有效字节宽度(0-32)
  233.         NRFR_Write_REG(0x16,32);                                //通道5有效字节宽度(0-32)
  234.         NRFR_Write_REG(0x00,0X0f);                                //配置为上电,接收模式

  235.         NRFR_CE=1;                                                                //使能模块接收或者发送
  236. }
  237. void Init()                                                                        //初始化
  238. {
  239.         Delay(100);
  240.         LCD_Init();
  241.         NRFR_Init();
  242.         NRFT_Init();
  243.         Delay(100);
  244. }
  245. uchar Keys(uchar dat)                                                //按键
  246. {
  247.         if(KEY_UPP==0&&dat<0x1f)                                //修改要显示的寄存器
  248.         {
  249.                 Delay(10);
  250.                 if(KEY_UPP==0)
  251.                 {
  252.                         dat++;
  253.                         while(!KEY_UPP);
  254.                 }
  255.         }
  256.         else if(KEY_LOW==0&&dat!=0)                                //修改要显示的寄存器
  257.         {
  258.                 Delay(10);
  259.                 if(KEY_LOW==0)
  260.                 {
  261.                         dat--;
  262.                         while(!KEY_LOW);
  263.                 }
  264.         }
  265.         return dat;
  266. }
  267. void DIS_LCD()                                                                //显示
  268. {
  269.         uchar temp;
  270.         num=Keys(num);                                                        //修改要显示的寄存器
  271.         LCD_Write_CMD(0x80);                                        //在lcd1602的第一行开始写入
  272.         LCD_Write_DAT(TAB[num>>4]);
  273.         LCD_Write_DAT(TAB[num&0x0f]);
  274.         LCD_Write_DAT(' ');
  275.         LCD_Write_DAT('T');
  276.         LCD_Write_DAT(':');
  277.         temp=NRFT_Read_REG(num);                                //读发送模块的寄存器
  278.         LCD_Write_DAT(TAB[temp>>4]);
  279. ……………………

  280. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
NRF24L01无线模块.rar (5.38 MB, 下载次数: 501)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏20 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:212923 发表于 2018-5-9 10:01 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:361623 发表于 2018-6-29 11:36 | 只看该作者
这个芯片看的一头雾水
回复

使用道具 举报

地板
ID:265995 发表于 2019-1-30 18:51 | 只看该作者
不错
学习一下
回复

使用道具 举报

5#
ID:318927 发表于 2019-2-23 13:25 | 只看该作者
51代码没用过,不知道,但那32的代码有问题19个错误,1个警告
回复

使用道具 举报

6#
ID:417702 发表于 2019-3-23 09:39 | 只看该作者
学习了
回复

使用道具 举报

7#
ID:296060 发表于 2019-5-29 14:16 | 只看该作者
学习一下。。
回复

使用道具 举报

8#
ID:156302 发表于 2019-6-5 13:32 | 只看该作者
学习一下。。
回复

使用道具 举报

9#
ID:709498 发表于 2020-3-16 15:27 | 只看该作者
正在学习,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表