找回密码
 立即注册

QQ登录

只需一步,快速开始

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

无线收发器 itead arduino 2.4G无线模块 RF数传通信模块配套资料

[复制链接]
跳转到指定楼层
楼主
   NRF24L01是一款工作在2.4-2.5GHz世界通用ISM频段的单片收发芯片,无线收发器包括:频率发生器 增强型 SchockBurstTM 模式控制器 功率放大器 晶体放大器 调制器 解调器 输出功率频道选择和协议的设置可以通过SPI接口进行设置极低的电流消耗,当工作在发射模式下发射功率为6dBm时电流消耗为9.0mA 接受模式为12.3mA掉电模式和待机模式下电流消耗模式更低。

球开放ISM 频段,最大0dBm 发射功率,免许可证使用。空旷100米!支持六路通道的数据接收

特性如下:

1.低工作电压:1.9~3.6V低电压工作

2.高速率:2Mbps,由于空中传输时间很短,极大的降低了无线传输中的碰撞现象(软件设置1Mbps或者2Mbps的空中传输速率)

3.多频点:125 频点,满足多点通信和跳频通信需要

4.超小型:内置2.4GHz天线,体积小巧,15x29mm(包括天线)

5.低功耗:当工作在应答模式通信时,快速的空中传输及启动时间,极大的降低了电流消耗。

6.低应用成本:NRF24L01集成了所有与RF协议相关的高速信号处理部分,比如:自动重发丢失数据包和自动产生应答信号等,NRF24L01的SPI接口可以利用单片机的硬件SPI口连接或用单片机I/O口进行模拟,内部有FIFO可以与各种高低速微处理器接口,便于使用低成本单片机。

7.便于开发:由于链路层完全集成在模块上,非常便于开发。自动重发功能,自动检测和重发丢失的数据包,重发时间及重发次数可软件控制自动存储未收到应答信号的数据包自动应答功能,在收到有效数据后,模块自动发送应答信号,无须另行编程载波检测—固定频率检测内置硬件CRC 检错和点对多点通信地址控制数据包传输错误计数器及载波检测功能可用于跳频设置可同时设置六路接收通道地址,可有选择性的打开接收通道标准插针Dip2.54MM间距接口,便于嵌入式应用







原代码:
  1. /****************************************/
  2. /*        nRF24L01_SPI通信程序
  3.      连线方式:
  4.              IOB0---》CE      (7脚)
  5.              IOB1---》CSN     (6脚)
  6.              IOB2---》SCK     (5脚)
  7.              IOB3---》MOSI    (4脚)
  8.              IOB4---》MISO    (3脚)
  9.              IOB5---》IRQ     (2脚)
  10. */
  11. /****************************************/
  12. #include "SPCE061V004.H"
  13. //#include "LCD.h"


  14. #define MISO     *P_IOB_Data
  15. #define uchar      unsigned char
  16. #define MOSI_High *P_IOB_Data|=0x0008
  17. #define MOSI_Low  *P_IOB_Data&=0xfff7
  18. #define SCK_High  *P_IOB_Data|=0x0004
  19. #define SCK_Low   *P_IOB_Data&=0xfffb
  20. #define CE_High   *P_IOB_Data|=0x0001
  21. #define CE_Low    *P_IOB_Data&=0xfffe
  22. #define CSN_High  *P_IOB_Data|=0x0002
  23. #define CSN_Low   *P_IOB_Data&=0xfffd

  24. #define TX_ADR_WIDTH    5                   // 5 bytes TX(RX) address width
  25. #define TX_PLOAD_WIDTH  20                  // 20 bytes TX payload
  26. #define        RX_DS      sta&0x40       // RX_DR=sta^6;
  27. #define TX_DS      sta&0x20       //        TX_DS        =sta^5;
  28. #define MAX_RT     sta&0x10      //        MAX_RT        =sta^4;
  29. // SPI(nRF24L01) commands
  30. #define READ_REG    0x00                                                 // Define read command to register
  31. #define WRITE_REG   0x20                                                 // Define write command to register
  32. #define RD_RX_PLOAD 0x61                                         // Define RX payload register address
  33. #define WR_TX_PLOAD 0xA0                                         // Define TX payload register address
  34. #define FLUSH_TX    0xE1                                                 // Define flush TX register command
  35. #define FLUSH_RX    0xE2                                                 // Define flush RX register command
  36. #define REUSE_TX_PL 0xE3                                         // Define reuse TX payload register command
  37. #define NOP         0xFF                                                         // Define No Operation, might be used to read status register
  38. //***************************************************//
  39. // SPI(nRF24L01) registers(addresses)
  40. #define CONFIG      0x00                                                 // 'Config' register address
  41. #define EN_AA       0x01                      // 'Enable Auto Acknowledgment' register address
  42. #define EN_RXADDR   0x02                  // 'Enabled RX addresses' register address
  43. #define SETUP_AW    0x03                     // 'Setup address width' register address
  44. #define SETUP_RETR  0x04                  // 'Setup Auto. Retrans' register address
  45. #define RF_CH       0x05                       // 'RF channel' register address
  46. #define RF_SETUP    0x06                                         // 'RF setup' register address
  47. #define STATUS      0x07                                         // 'Status' register address
  48. #define OBSERVE_TX  0x08                                 // 'Observe TX' register address
  49. #define CD          0x09                                                 //'Carrier Detect' register address
  50. #define RX_ADDR_P0  0x0A                                         // 'RX address pipe0' register address
  51. #define RX_ADDR_P1  0x0B                                 // 'RX address pipe1' register address
  52. #define RX_ADDR_P2  0x0C                                 // 'RX address pipe2' register address
  53. #define RX_ADDR_P3  0x0D                                 // 'RX address pipe3' register address
  54. #define RX_ADDR_P4  0x0E                                 // 'RX address pipe4' register address
  55. #define RX_ADDR_P5  0x0F                                    // 'RX address pipe5' register address
  56. #define TX_ADDR     0x10                                         // 'TX address' register address
  57. #define RX_PW_P0    0x11                                         // 'RX payload width, pipe0' register address
  58. #define RX_PW_P1    0x12                                         // 'RX payload width, pipe1' register address
  59. #define RX_PW_P2    0x13                                         // 'RX payload width, pipe2' register address
  60. #define RX_PW_P3    0x14                                         // 'RX payload width, pipe3' register address
  61. #define RX_PW_P4    0x15                                         // 'RX payload width, pipe4' register address
  62. #define RX_PW_P5    0x16                                         // 'RX payload width, pipe5' register address
  63. #define FIFO_STATUS 0x17                                     // 'FIFO Status Register' register address

  64. unsigned char Buffer[5]={"0","3","4","5","8"};
  65. unsigned char const TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // Define a static TX address
  66. unsigned char  SPI_ReceiveData;
  67. unsigned char RX[16];
  68. unsigned char Tx_Buffer[5]={"abc"};
  69. void Initial_IOB()  //初始化IOB端口
  70. {
  71.    *P_IOB_Dir=0xffcf;    //set IRQ,MISO input ,the other output
  72.    *P_IOB_Attrib=0xffcf;  
  73.    *P_IOB_Data=0x0000;
  74.    
  75. }
  76.   void delay1us(unsigned char t)
  77. {
  78.     while(--t)
  79.        *P_Watchdog_Clear=1;
  80. }
  81. unsigned char SPI_RW(unsigned char byte)   //写一个字节到24L01,同时读一个字节
  82. {
  83.      unsigned char bit_ctr;
  84.         
  85.      for(bit_ctr=0;bit_ctr<8;bit_ctr++)   //output 8-bit
  86.        {
  87.            if(byte&0x80)  
  88.               MOSI_High;
  89.            else
  90.              MOSI_Low;
  91.              byte=(byte<<1);
  92.              SCK_High;
  93.              if(MISO&0x0010) byte |= 1;       //SPI_ReceiveData=MISO;
  94.              SCK_Low;
  95.             
  96.            //  SPI_ReceiveData =( SPI_ReceiveData<<1);
  97.        }
  98.        return(byte);  //return read byte
  99. }
  100. unsigned char SPI_Read(unsigned char reg)
  101. {
  102.         unsigned char reg_val;

  103.           CSN_Low;             // CSN low, initialize SPI communication...
  104.           SPI_RW(reg);            // Select register to read from..
  105.           reg_val = SPI_RW(0);    // ..then read registervalue
  106.           CSN_High;                // CSN high, terminate SPI communication

  107.           return(reg_val);        // return register value
  108. }

  109. /****向寄存器reg写一个字节,同时返回状态字节**************/
  110. unsigned char SPI_RW_Reg(unsigned char reg,unsigned char value)
  111. {
  112.    unsigned char status;
  113.    CSN_Low;
  114.    status=SPI_RW(reg);   //select register  and write value to it
  115.    SPI_RW(value);   
  116.    CSN_High;
  117.    return(status);     
  118. }
  119. /********读出bytes字节的数据*************************/
  120. unsigned char SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes)
  121. {
  122.   uchar status,byte_ctr;
  123.   CSN_Low;
  124.   status=SPI_RW(reg);      
  125.   for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  126.            pBuf[byte_ctr]=SPI_RW(0);
  127.    CSN_High;
  128.    return(status);
  129. }
  130. /****************写入bytes字节的数据*******************/
  131. unsigned char SPI_Write_Buf(uchar reg,uchar *pBuf,uchar bytes)
  132. {
  133.    uchar status,byte_ctr;
  134.    CSN_Low;
  135.    delay1us(1);
  136.    status=SPI_RW(reg);      
  137.    for(byte_ctr=0;byte_ctr<bytes;byte_ctr++)
  138.                    SPI_RW(*pBuf++);
  139.    CSN_High;
  140.    delay1us(1);
  141.    return(status);
  142. }
  143. /*接收函数,返回1表示有数据收到,否则没有数据接收到**/
  144. unsigned char nRF24L01_RxPacket(unsigned char *rx_buf)
  145. {
  146.    unsigned char sta,revale=0;               
  147.    SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);  
  148.    CE_High;
  149.    delay1us(10);
  150.    
  151.   sta=SPI_Read(STATUS);                 // read register STATUS's value
  152.    if(RX_DS)                                            // if receive data ready (RX_DR) interrupt
  153.     {
  154.                   CE_Low;                // stand by mode
  155.                   SPI_Read_Buf(RD_RX_PLOAD,rx_buf,WR_TX_PLOAD); // read receive payload from RX_FIFO buffer
  156.                      revale =1;
  157.      }
  158.      SPI_RW_Reg(WRITE_REG+STATUS,sta);   // clear RX_DR or TX_DS or MAX_RT interrupt flag
  159.      return revale;
  160.    
  161. }
  162. /****************发送函数***************************/
  163. void nRF24L01_TxPacket(unsigned char *tx_buf)
  164. {
  165.      CE_Low;                //  CE=0;
  166.      SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);       // WritesTX_Address to nRF24L01
  167.      SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);     //RX_Addr0 same as TX_Adr for Auto.Ack
  168.      SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);   // Writes data to TX payload
  169.      SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);            // Set PWR_UP bit, enable CRC(2 bytes) &Prim:TX. MAX_RT & TX_DS enabled..
  170.      CE_High;                //CE=1;
  171.      delay1us(10);
  172.      CE_Low;       //CE=0;
  173. }   
  174. void RX_Mode(void)
  175. {
  176.         CE_Low;   //CE=0;
  177.         delay1us(1);
  178.     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
  179.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
  180.           SPI_Write_Buf(WR_TX_PLOAD, Buffer, TX_PLOAD_WIDTH); // Writes data to TX payload

  181.           SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
  182.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
  183.           SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
  184.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40
  185.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  186.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..


  187.           CE_High;   //CE = 1   Set CE pin high to enable RX device
  188.     delay1us(1);
  189.   //  This device is now ready to receive one packet of 16 bytes payload from a TX device sending to address
  190.   //  '3443101001', with auto acknowledgment, retransmit count of 10, RF channel 40 and datarate = 2Mbps.
  191. }
  192. void TX_Mode(void)
  193. {
  194.         CE_Low;      //CE=0;
  195.         delay1us(1);
  196.           SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // Writes TX_Address to nRF24L01
  197.           SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 same as TX_Adr for Auto.Ack
  198.           SPI_Write_Buf(WR_TX_PLOAD,Tx_Buffer, TX_PLOAD_WIDTH);         // Writes data to TX payload

  199.          SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      // Enable Auto.Ack:Pipe0
  200.           SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // Enable Pipe0
  201.           SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
  202.           SPI_RW_Reg(WRITE_REG + RF_CH, 40);        // Select RF channel 40
  203.           SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // TX_PWR:0dBm, Datarate:2Mbps, LNA:HCURR
  204.           SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);     // Set PWR_UP bit, enable CRC(2 bytes) & Prim:TX. MAX_RT & TX_DS enabled..
  205.    
  206.     CE_High;    //        CE=1;  
  207.     delay1us(1);  
  208. }
  209. void nRF24L01_Initial(void)
  210. {
  211.           CE_Low;                        //nRF24L01_CE=0;                         chip enable
  212.           CSN_High;                        //nRF24L01_CSN=1;                         Spi disable
  213.           SCK_Low;          //nRF24L01_SCK=0;                         Spi clock line init high
  214.         
  215.         
  216. }
  217. /****************** 配置函数********************************/
  218. void nRF24L01_Config(void)
  219. {
  220.           //initial io
  221.      CE_Low;          //        CE=0 ;chip enable
  222.      CSN_High;       //CSN=1   Spi disable
  223.      SCK_Low;       //SCK=0   // Spi clock line init high
  224.      CE_Low;        //CE=0;
  225.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // Set PWR_UP bit, enable CRC(2 bytes) &Prim:RX. RX_DR enabled..
  226.     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
  227.     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
  228.     SPI_RW_Reg(WRITE_REG + SETUP_AW, 0x02); // Setup address width=5 bytes
  229.     SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 retrans...
  230.     SPI_RW_Reg(WRITE_REG + RF_CH, 0);
  231.     SPI_RW_Reg(WRITE_REG + RF_SETUP,0x0f); // TX_PWR:0dBm, Datarate:2Mbps,
  232. }  
  233. main()
  234. {   
  235.    int a;
  236.   Initial_IOB();
  237.   nRF24L01_Initial();
  238.   TX_Mode();
  239.   // RX_Mode();
  240.    while(1)
  241.     {
  242.          
  243.            //自己添加要发送的内容到数组里
  244.            
  245.       ///   nRF24L01_TxPacket(*****)
  246.               delay1us(100);
  247.                   *P_Watchdog_Clear=1;
  248.     }
  249. }
复制代码

全部资料(压缩包)下载:

NRF24L01原理图.rar

2.74 KB, 下载次数: 9, 下载积分: 黑币 -5

参考设计例程.zip

1.57 MB, 下载次数: 9, 下载积分: 黑币 -5

相关参考设计文档.zip

7.03 MB, 下载次数: 8, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:112693 发表于 2016-6-6 12:52 | 只看该作者
经典,参考了,谢谢楼主
回复

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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