在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → nrf24l01驱动

nrf24l01驱动

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:3.84KB
  • 下载次数:9
  • 浏览次数:140
  • 发布时间:2020-11-12
  • 实例类别:嵌入式开发
  • 发 布 人:h8416
  • 文件格式:.rar
  • 所需积分:2
 相关标签: RF24L01 NRF RF 驱动 24

实例介绍

【实例简介】
发一份自己调试好的nRF24L01库, 网上的动不动都不好使

自己写的多通道的

【实例截图】

【核心代码】

  1. #include "nRF24L01Drv.h"
  2. #include "USART.h"
  3. #include "stdio.h"
  4. #include "config.h"
  5. #include <intrins.h>
  6. #include "spi.h"

  7. /**
  8. * 1.改多路方法:
  9. * NUM_USED_PIPE 改为使用的路数, RX_ADDRESS 分别指定 RX的地址,
  10. * RX_PLOAD_WIDTH 改为每一路的PAYLOAD
  11. * NRF24L01_RxPacket 里面知道是哪一路在接收
  12. *
  13. *
  14. * 2. 发送时自动将CONFIG 备份,然后切换TX后再切换回去
  15. *   并且备份RX_ADDR_P0
  16. *
  17. * 3. 通道0,1 支持40位地址写入, 但是通道2,3,4,5只支持1位写入,其他地址与1通道相同
  18. *
  19. * 4. NRF24L01_TxPacket 支持写入TX_PLOAD_WIDTH 个字节
  20. *
  21. * 5. NRF24L01_RxPacket 第一个参数是PIPE_NUMBER, 第二个参数是 读入的 buffer
  22. *
  23. *
  24. * **/
  25. #define NUM_USED_PIPE 3

  26. const u8 TX_ADDRESS[TX_ADR_WIDTH] = {0x35, 0x30, 0x30, 0x30, 0x35};
  27. const u8 RX_ADDRESS[6][RX_ADR_WIDTH] = {{0x33, 0x30, 0x30, 0x30, 0x33}, {0x34, 0x30, 0x30, 0x30, 0x33}, {0x35, 0x00, 0x00, 0x00, 0x00}};
  28. u8 RX_PLOAD_WIDTH[6] = {0x02, 0x02, 0x02, 0x00, 0x00, 0x00};

  29. u8 SPI_RW(u8 tr_data)
  30. {
  31.         u16 bit_ctr;
  32.         for (bit_ctr = 0; bit_ctr < 8; bit_ctr ) // output 8-bit
  33.         {
  34.                 NRF_MOSI = (tr_data & 0x80); // output 'uchar', MSB to MOSI
  35.                 tr_data = (tr_data << 1);         // shift next bit into MSB..
  36.                 NRF_SCK = 1;                                 // Set SCK high..
  37.                 tr_data |= NRF_MISO;                 // capture current MISO bit
  38.                 NRF_SCK = 0;                                 // ..then set SCK low again
  39.         }
  40.         return (tr_data); // return read uchar
  41. }

  42. /*********************************************/
  43. /* 函数功能:给24L01的寄存器写值(一个字节) */
  44. /* 入口参数:reg   要写的寄存器地址          */
  45. /*           value 给寄存器写的值            */
  46. /* 出口参数:status 状态值                   */
  47. /*********************************************/
  48. u8 NRF24L01_RW_Reg(u8 reg, u8 value)
  49. {
  50.         u16 status;

  51.         NRF_CSN = 0;                  // CSN low, init SPI transaction
  52.         status = SPI_RW(reg); // select register
  53.         SPI_RW(value);                  // ..and write value to it..
  54.         NRF_CSN = 1;                  // CSN high again

  55.         return (status); // return nRF24L01 status uchar
  56. }
  57. /*************************************************/
  58. /* 函数功能:读24L01的寄存器值 (一个字节)      */
  59. /* 入口参数:reg  要读的寄存器地址               */
  60. /* 出口参数:value 读出寄存器的值                */
  61. /*************************************************/
  62. u8 NRF24L01_Read_Reg(u8 reg)
  63. {
  64.         u8 reg_val;

  65.         NRF_CSN = 0;                        // CSN low, initialize SPI communication...
  66.         SPI_RW(reg);                        // Select register to read from..
  67.         reg_val = SPI_RW(0xFF); // ..then read registervalue
  68.         NRF_CSN = 1;                        // CSN high, terminate SPI communication

  69.         return (reg_val); // return register value
  70. }
  71. /*********************************************/
  72. /* 函数功能:读24L01的寄存器值(多个字节)   */
  73. /* 入口参数:reg   寄存器地址                */
  74. /*           *pBuf 读出寄存器值的存放数组    */
  75. /*           len   数组字节长度              */
  76. /* 出口参数:status 状态值                   */
  77. /*********************************************/
  78. u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 len)
  79. {
  80.         u16 status, uchar_ctr;

  81.         NRF_CSN = 0;                  // Set CSN low, init SPI tranaction
  82.         status = SPI_RW(reg); // Select register to write to and read status uchar

  83.         for (uchar_ctr = 0; uchar_ctr < len; uchar_ctr )
  84.                 pBuf[uchar_ctr] = SPI_RW(0xFF); //

  85.         NRF_CSN = 1;

  86.         return (status); // return nRF24L01 status uchar
  87. }
  88. /**********************************************/
  89. /* 函数功能:给24L01的寄存器写值(多个字节)  */
  90. /* 入口参数:reg  要写的寄存器地址            */
  91. /*           *pBuf 值的存放数组               */
  92. /*           len   数组字节长度               */
  93. /**********************************************/
  94. u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
  95. {
  96.         u8 status, u8_ctr;
  97.         NRF_CSN = 0;
  98.         status = SPI_RW(reg); //发送寄存器值(位置),并读取状态值
  99.         for (u8_ctr = 0; u8_ctr < len; u8_ctr )
  100.                 SPI_RW(*pBuf ); //写入数据
  101.         NRF_CSN = 1;
  102.         return status; //返回读到的状态值
  103. }

  104. /*********************************************/
  105. /* 函数功能:24L01接收数据                   */
  106. /* 入口参数:rxbuf 接收数据数组              */
  107. /* 返回值: 1   成功收到数据                 */
  108. /*          0   没有收到数据                 */
  109. /*********************************************/
  110. u8 NRF24L01_RxPacket(u8 *pipe_num, u8 *rxbuf)
  111. {
  112.         u8 fifo_state;
  113.         u8 state;
  114.         u8 i;
  115.         unsigned char revale = 0;

  116.         fifo_state = NRF24L01_Read_Reg(FIFO_STATUS); //读取状态寄存器的值
  117.         state = NRF24L01_Read_Reg(STATUS);                         //清除TX_DS或MAX_RT中断标志
  118.         //TX1_write2buff(state);
  119.         if (!(fifo_state & _BV(RX_EMPTY))) //接收到数据
  120.         {
  121.                 NRF_CSN = 0;
  122.                 i = SPI_RW(RF24_NOP); // IRQ收发完成中断响应,16位CRC,主发送
  123.                 *pipe_num = (i >> RX_P_NO) & 0x07;
  124.                 NRF_CSN = 1;
  125.                 NRF_CE = 0;                                                                                                                  //SPI使能
  126.                 NRF24L01_Read_Buf(RD_RX_PLOAD, rxbuf, RX_PLOAD_WIDTH[*pipe_num]); // read receive payload from RX_FIFO buffer
  127.                                                                                                                                                   //   NRF24L01_RW_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器
  128.                 NRF24L01_RW_Reg(WRITE_REG STATUS, state);                                                  //清除TX_DS或MAX_RT中断标志
  129.                 NRF24L01_RW_Reg(FLUSH_RX, 0xFF);                                                                  //清除TX_DS或MAX_RT中断标志
  130.                 revale = RX_PLOAD_WIDTH[*pipe_num];
  131.         }
  132.         NRF_CE = 1;

  133.         return revale; //没收到任何数据
  134. }
  135. /**********************************************/
  136. /* 函数功能:设置24L01为发送模式              */
  137. /* 入口参数:txbuf  发送数据数组              */
  138. /* 返回值; 0x10    达到最大重发次数,发送失败*/
  139. /*          0x20    成功发送完成              */
  140. /*          0xff    发送失败                  */
  141. /**********************************************/
  142. u8 NRF24L01_TxPacket(u8 *txbuf)
  143. {
  144.         u8 state;
  145.         u8 config;

  146.         NRF_CE = 0; //StandBy I模式
  147.         config = NRF24L01_Read_Reg(CONFIG);

  148.         NRF24L01_Read_Buf(RX_ADDR_P0, RX_ADDRESS[0], RX_ADR_WIDTH);                          // 备份 RX_ADDRESS[0]
  149.         NRF24L01_Write_Buf(WRITE_REG RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  150.         NRF24L01_Write_Buf(WR_TX_PLOAD, txbuf, TX_PLOAD_WIDTH);                                  // 装载数据
  151.         NRF24L01_RW_Reg(WRITE_REG CONFIG, config & ~_BV(0));                                  // 设置为PTX
  152.         NRF_CE = 1;
  153.         //置高CE,激发数据发送
  154.         while (NRF_IRQ == 1)
  155.         {
  156.                 ;
  157.         }                                                                                        //等待发送完成
  158.         state = NRF24L01_Read_Reg(STATUS);                        //读取状态寄存器的值
  159.         NRF24L01_RW_Reg(WRITE_REG STATUS, state); //清除TX_DS或MAX_RT中断标志
  160.         if (state & MAX_TX)                                                        //达到最大重发次数
  161.         {
  162.                 NRF24L01_RW_Reg(FLUSH_TX, 0xff); //清除TX FIFO寄存器
  163.                 return MAX_TX;
  164.         }

  165.         NRF24L01_Write_Buf(WRITE_REG RX_ADDR_P0, RX_ADDRESS[0], RX_ADR_WIDTH);
  166.         NRF24L01_RW_Reg(WRITE_REG CONFIG, config); //改回PRX
  167.         if (state & TX_OK)                                                         //发送完成
  168.         {
  169.                 return TX_OK;
  170.         }
  171.         return 0xff; //发送失败
  172. }
  173. /********************************************/
  174. /* 函数功能:检测24L01是否存在              */
  175. /* 返回值;  0  存在                        */
  176. /*           1  不存在                      */
  177. /********************************************/
  178. u8 NRF24L01_Check(void)
  179. {
  180.         u8 check_in_buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
  181.         u8 check_out_buf[20] = {0x00};

  182.         NRF_CE = 0;

  183.         NRF24L01_Write_Buf(WRITE_REG TX_ADDR, check_in_buf, 5);
  184.         NRF24L01_Read_Buf(READ_REG TX_ADDR, check_out_buf, 5);

  185.         if ((check_out_buf[0] == 0x11) &&
  186.                 (check_out_buf[1] == 0x22) &&
  187.                 (check_out_buf[2] == 0x33) &&
  188.                 (check_out_buf[3] == 0x44) &&
  189.                 (check_out_buf[4] == 0x55))
  190.                 return 0;

  191.         return 1;
  192. }

  193. void NRF24L01_RT_Init(void)
  194. {
  195.         u8 i = 0;

  196.         NRF_SCK = 0;

  197.         NRF_CE = 0; // chip enable

  198.         NRF24L01_Write_Buf(WRITE_REG TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);

  199.         NRF24L01_RW_Reg(WRITE_REG CONFIG, 0x0B);           //0x20
  200. ……………………

标签: RF24L01 NRF RF 驱动 24

实例下载地址

nrf24l01驱动

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警