智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2873|回复: 1
打印 上一主题 下一主题

我用两个51做的无线加上位收发 请教问题

[复制链接]

7

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
487
QQ
威望
405
贡献
26
兑换币
76
注册时间
2011-3-3
在线时间
28 小时
跳转到指定楼层
#
发表于 2013-6-22 09:31:52 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
30贡献
接收端

复制代码
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned char uint;
  5. //****************************************NRF24L01端口定义***************************************
  6. sbit CE   = P2^0;  // Chip Enable pin signal (output)
  7. sbit CSN  = P2^1;  // Slave Select pin, (output to CSN, nRF24L01)
  8. sbit IRQ  = P2^2;  // Interrupt signal, from nRF24L01 (input)
  9. sbit MISO = P2^3;  // Master In, Slave Out pin (input)
  10. sbit MOSI = P2^4;  // Serial Clock pin, (output)
  11. sbit SCK  = P2^5;  // Master Out, Slave In pin (output)
  12. sbit         LEDEN        =P1^7;
  13. //************************************按键***************************************************
  14. sbit        D0=P1^0;
  15. //************************************蜂明器***************************************************
  16. sbit         D1=P1^1;
  17. //*******************************************************************************************
  18. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  19. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  20. #define TX_PLOAD_WIDTH  32             // 20 uints TX payload
  21. #define RX_PLOAD_WIDTH  32          // 20 uints TX payload
  22. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  23. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  24. //***************************************NRF24L01寄存器指令*******************************************************
  25. #define READ_REG        0x00          // 读寄存器指令
  26. #define WRITE_REG       0x20         // 写寄存器指令
  27. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  28. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  29. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  30. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  31. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  32. #define NOP             0xFF          // 保留
  33. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  34. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  35. #define EN_AA           0x01  // 自动应答功能设置
  36. #define EN_RXADDR       0x02  // 可用信道设置
  37. #define SETUP_AW        0x03  // 收发地址宽度设置
  38. #define SETUP_RETR      0x04  // 自动重发功能设置
  39. #define RF_CH           0x05  // 工作频率设置
  40. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  41. #define STATUS          0x07  // 状态寄存器
  42. #define OBSERVE_TX      0x08  // 发送监测功能
  43. #define CD              0x09  // 地址检测           
  44. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  45. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  46. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  47. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  48. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  49. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  50. #define TX_ADDR         0x10  // 发送地址寄存器
  51. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  52. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  53. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  54. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  55. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  56. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  57. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  58. //**************************************************************************************
  59. void Delay(unsigned int s);
  60. void inerDelay_us(unsigned char n);
  61. void init_NRF24L01(void);
  62. uint SPI_RW(uint uchar);
  63. uchar SPI_Read(uchar reg);
  64. void SetRX_Mode(void);
  65. uint SPI_RW_Reg(uchar reg, uchar value);
  66. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  67. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  68. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  69. void nRF24L01_TxPacket(unsigned char * tx_buf);
  70. //*****************************************长延时*****************************************
  71. void Delay(unsigned int s)
  72. {
  73.         unsigned int i;
  74.         for(i=0; i<s; i++);
  75.         for(i=0; i<s; i++);
  76. }
  77. //******************************************************************************************
  78. uint         bdata sta;   //状态标志
  79. sbit        RX_DR        =sta^6;
  80. sbit        TX_DS        =sta^5;
  81. sbit        MAX_RT        =sta^4;
  82. /******************************************************************************************
  83. /*延时函数
  84. /******************************************************************************************/
  85. void inerDelay_us(unsigned char n)
  86. {
  87.         for(;n>0;n--)
  88.                 _nop_();
  89. }
  90. //****************************************************************************************
  91. /*NRF24L01初始化
  92. //***************************************************************************************/
  93. void init_NRF24L01(void)
  94. {
  95.     inerDelay_us(100);
  96.          CE=0;    // chip enable
  97.          CSN=1;   // Spi disable
  98.          SCK=0;   // Spi clock line init high
  99.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址        
  100.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  101.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许        
  102.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  103.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  104.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  105.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB
  106.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  107. }
  108. /****************************************************************************************************
  109. /*函数:uint SPI_RW(uint uchar)
  110. /*功能:NRF24L01的SPI写时序
  111. /****************************************************************************************************/
  112. uint SPI_RW(uint uchar)
  113. {
  114.         uint bit_ctr;
  115.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  116.            {
  117.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  118.                 uchar = (uchar << 1);           // shift next bit into MSB..
  119.                 SCK = 1;                      // Set SCK high..
  120.                 uchar |= MISO;                         // capture current MISO bit
  121.                 SCK = 0;                              // ..then set SCK low again
  122.            }
  123.     return(uchar);                             // return read uchar
  124. }
  125. /****************************************************************************************************
  126. /*函数:uchar SPI_Read(uchar reg)
  127. /*功能:NRF24L01的SPI时序
  128. /****************************************************************************************************/
  129. uchar SPI_Read(uchar reg)
  130. {
  131.         uchar reg_val;
  132.         
  133.         CSN = 0;                // CSN low, initialize SPI communication...
  134.         SPI_RW(reg);            // Select register to read from..
  135.         reg_val = SPI_RW(0);    // ..then read registervalue
  136.         CSN = 1;                // CSN high, terminate SPI communication
  137.         
  138.         return(reg_val);        // return register value
  139. }
  140. /****************************************************************************************************/
  141. /*功能:NRF24L01读写寄存器函数
  142. /****************************************************************************************************/
  143. uint SPI_RW_Reg(uchar reg, uchar value)
  144. {
  145.         uint status;
  146.         
  147.         CSN = 0;                   // CSN low, init SPI transaction
  148.         status = SPI_RW(reg);      // select register
  149.         SPI_RW(value);             // ..and write value to it..
  150.         CSN = 1;                   // CSN high again
  151.         
  152.         return(status);            // return nRF24L01 status uchar
  153. }
  154. /****************************************************************************************************/
  155. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  156. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  157. /****************************************************************************************************/
  158. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  159. {
  160.         uint status,uchar_ctr;
  161.         
  162.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  163.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  164.         
  165.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  166.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  167.         
  168.         CSN = 1;                           
  169.         
  170.         return(status);                    // return nRF24L01 status uchar
  171. }
  172. /*********************************************************************************************************
  173. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  174. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  175. /*********************************************************************************************************/
  176. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  177. {
  178.         uint status,uchar_ctr;
  179.         
  180.         CSN = 0;            //SPI使能      
  181.         status = SPI_RW(reg);   
  182.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  183.                 SPI_RW(*pBuf++);
  184.         CSN = 1;           //关闭SPI
  185.         return(status);    //
  186. }
  187. /****************************************************************************************************/
  188. /*函数:void SetRX_Mode(void)
  189. /*功能:数据接收配置
  190. /****************************************************************************************************/
  191. void SetRX_Mode(void)
  192. {
  193.         CE=0;
  194. //        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  195.         CE = 1;
  196.         inerDelay_us(130);
  197. }
  198. /******************************************************************************************************/
  199. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  200. /*功能:数据读取后放如rx_buf接收缓冲区中
  201. /******************************************************************************************************/
  202. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  203. {
  204.     unsigned char revale=0;
  205.         sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
  206.         if(RX_DR)                                // 判断是否接收到数据
  207.         {
  208.             CE = 0;                         //SPI使能
  209.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  210.                 revale =1;                        //读取数据完成标志
  211.         }
  212.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  213.         return revale;
  214. }
  215. /***********************************************************************************************************
  216. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  217. /*功能:发送 tx_buf中数据
  218. /**********************************************************************************************************/
  219. /*void nRF24L01_TxPacket(unsigned char * tx_buf)
  220. {
  221.         CE=0;                        //StandBy I模式        
  222.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  223.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据        
  224.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  225.         CE=1;                 //置高CE,激发数据发送
  226.         inerDelay_us(10);
  227. }          */
  228. //************************************串口初始化*********************************************************
  229. void StartUART( void )
  230. {                                                          //波特率9600
  231.      SCON = 0x50;
  232.      TMOD = 0x20;
  233.      TH1 = 0xFA;
  234.      TL1 = 0xFA;
  235.      PCON = 0x00;
  236.      TR1 = 1;
  237. }
  238. //************************************通过串口将接收到数据发送给PC端**************************************
  239. void Senddat(uchar dat)
  240. {        
  241.          SBUF = dat;  
  242.      while( TI == 0 );                                //查询法
  243.            TI = 0;   
  244. }
  245. //************************************主函数************************************************************
  246. void main(void)
  247. {
  248.         uchar i;
  249.         uchar RxBuf[32]={1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};        
  250.     init_NRF24L01() ;
  251.         StartUART();
  252.         Delay(6000);
  253.         LEDEN=0;
  254.         while(1)
  255.         {
  256.                 D1=~D1;
  257.                 SetRX_Mode();
  258.                    if(nRF24L01_RxPacket(RxBuf))
  259.                 {
  260.                         for(i=0;i<32;i++)
  261.                         {
  262.                                 Senddat(RxBuf[i]);
  263.                                 Delay(600);
  264.                                 D0=~D0;
  265.                         }        
  266.                 }
  267.                 Delay(600);
  268.         }
  269.         
  270. }
复制代码

发送端

复制代码
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned char uint;
  5. //****************************************IO端口定义***************************************
  6. sbit CE   = P2^0;  // Chip Enable pin signal (output)
  7. sbit CSN  = P2^1;  // Slave Select pin, (output to CSN, nRF24L01)
  8. sbit IRQ  = P2^2;  // Interrupt signal, from nRF24L01 (input)
  9. sbit MISO = P2^3;  // Master In, Slave Out pin (input)
  10. sbit MOSI = P2^4;  // Serial Clock pin, (output)
  11. sbit SCK  = P2^5;  // Master Out, Slave In pin (output)
  12. sbit         LEDEN        =P1^7;
  13. //************************************按键***************************************************
  14. sbit        D0=P1^0;
  15. //************************************蜂明器***************************************************
  16. sbit         D1=P1^1;
  17. //***********************************数码管0-9编码*******************************************
  18. uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};         //0~~9段码
  19. uchar TxBuf[32]=
  20. {
  21. 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
  22. 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
  23. 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
  24. 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
  25. };         //

  26. //*********************************************NRF24L01*************************************
  27. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  28. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  29. #define TX_PLOAD_WIDTH  32          // 20 uints TX payload
  30. #define RX_PLOAD_WIDTH  32          // 20 uints TX payload
  31. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  32. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  33. //***************************************NRF24L01寄存器指令*******************************************************
  34. #define READ_REG        0x00          // 读寄存器指令
  35. #define WRITE_REG       0x20         // 写寄存器指令
  36. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  37. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  38. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  39. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  40. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  41. #define NOP             0xFF          // 保留
  42. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  43. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  44. #define EN_AA           0x01  // 自动应答功能设置
  45. #define EN_RXADDR       0x02  // 可用信道设置
  46. #define SETUP_AW        0x03  // 收发地址宽度设置
  47. #define SETUP_RETR      0x04  // 自动重发功能设置
  48. #define RF_CH           0x05  // 工作频率设置
  49. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  50. #define STATUS          0x07  // 状态寄存器
  51. #define OBSERVE_TX      0x08  // 发送监测功能
  52. #define CD              0x09  // 地址检测           
  53. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  54. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  55. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  56. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  57. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  58. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  59. #define TX_ADDR         0x10  // 发送地址寄存器
  60. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  61. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  62. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  63. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  64. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  65. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  66. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  67. //**************************************************************************************
  68. void Delay(unsigned int s);
  69. void inerDelay_us(unsigned char n);
  70. void init_NRF24L01(void);
  71. uint SPI_RW(uint uchar);
  72. uchar SPI_Read(uchar reg);
  73. void SetRX_Mode(void);
  74. uint SPI_RW_Reg(uchar reg, uchar value);
  75. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  76. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  77. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  78. void nRF24L01_TxPacket(unsigned char * tx_buf);
  79. //*****************************************长延时*****************************************
  80. void Delay(unsigned int s)
  81. {
  82.         unsigned int i;
  83.         for(i=0; i<s; i++);
  84.         for(i=0; i<s; i++);
  85. }
  86. //******************************************************************************************
  87. uint         bdata sta;   //状态标志
  88. sbit        RX_DR        =sta^6;
  89. sbit        TX_DS        =sta^5;
  90. sbit        MAX_RT        =sta^4;
  91. /******************************************************************************************
  92. /*延时函数
  93. /******************************************************************************************/
  94. void inerDelay_us(unsigned char n)
  95. {
  96.         for(;n>0;n--)
  97.                 _nop_();
  98. }
  99. //****************************************************************************************
  100. /*NRF24L01初始化
  101. //***************************************************************************************/
  102. void init_NRF24L01(void)
  103. {
  104.     inerDelay_us(100);
  105.          CE=0;    // chip enable
  106.          CSN=1;   // Spi disable
  107.          SCK=0;   // Spi clock line init high
  108.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址        
  109.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  110.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许        
  111.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  112.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  113.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  114.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB        
  115.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送

  116. }
  117. /****************************************************************************************************
  118. /*函数:uint SPI_RW(uint uchar)
  119. /*功能:NRF24L01的SPI写时序
  120. /****************************************************************************************************/
  121. uint SPI_RW(uint uchar)
  122. {
  123.         uint bit_ctr;
  124.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  125.            {
  126.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  127.                 uchar = (uchar << 1);           // shift next bit into MSB..
  128.                 SCK = 1;                      // Set SCK high..
  129.                 uchar |= MISO;                         // capture current MISO bit
  130.                 SCK = 0;                              // ..then set SCK low again
  131.            }
  132.     return(uchar);                             // return read uchar
  133. }
  134. /****************************************************************************************************
  135. /*函数:uchar SPI_Read(uchar reg)
  136. /*功能:NRF24L01的SPI时序
  137. /****************************************************************************************************/
  138. /*uchar SPI_Read(uchar reg)
  139. {
  140.         uchar reg_val;
  141.         
  142.         CSN = 0;                // CSN low, initialize SPI communication...
  143.         SPI_RW(reg);            // Select register to read from..
  144.         reg_val = SPI_RW(0);    // ..then read registervalue
  145.         CSN = 1;                // CSN high, terminate SPI communication
  146.         
  147.         return(reg_val);        // return register value
  148. }
  149. /****************************************************************************************************/
  150. /*功能:NRF24L01读写寄存器函数
  151. /****************************************************************************************************/
  152. uint SPI_RW_Reg(uchar reg, uchar value)
  153. {
  154.         uint status;
  155.         
  156.         CSN = 0;                   // CSN low, init SPI transaction
  157.         status = SPI_RW(reg);      // select register
  158.         SPI_RW(value);             // ..and write value to it..
  159.         CSN = 1;                   // CSN high again
  160.         
  161.         return(status);            // return nRF24L01 status uchar
  162. }
  163. /****************************************************************************************************/
  164. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  165. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  166. /****************************************************************************************************/
  167. /*uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  168. {
  169.         uint status,uchar_ctr;
  170.         
  171.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  172.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  173.         
  174.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  175.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  176.         
  177.         CSN = 1;                           
  178.         
  179.         return(status);                    // return nRF24L01 status uchar
  180. }
  181. /*********************************************************************************************************
  182. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  183. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  184. /*********************************************************************************************************/
  185. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  186. {
  187.         uint status,uchar_ctr;
  188.         
  189.         CSN = 0;            //SPI使能      
  190.         status = SPI_RW(reg);   
  191.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  192.                 SPI_RW(*pBuf++);
  193.         CSN = 1;           //关闭SPI
  194.         return(status);    //
  195. }
  196. /****************************************************************************************************/
  197. /*函数:void SetRX_Mode(void)
  198. /*功能:数据接收配置
  199. /****************************************************************************************************/
  200. /*void SetRX_Mode(void)
  201. {
  202.         CE=0;
  203.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  204.         CE = 1;
  205.         inerDelay_us(130);
  206. }
  207. /******************************************************************************************************/
  208. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  209. /*功能:数据读取后放如rx_buf接收缓冲区中
  210. /******************************************************************************************************/
  211. /*unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  212. {
  213.     unsigned char revale=0;
  214.         sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
  215.         if(RX_DR)                                // 判断是否接收到数据
  216.         {
  217.             CE = 0;                         //SPI使能
  218.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  219.                 revale =1;                        //读取数据完成标志
  220.         }
  221.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  222.         return revale;
  223. }
  224. /***********************************************************************************************************
  225. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  226. /*功能:发送 tx_buf中数据
  227. /**********************************************************************************************************/
  228. void nRF24L01_TxPacket(unsigned char * tx_buf)
  229. {
  230.         CE=0;                        //StandBy I模式        
  231.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  232.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据        
  233. //        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  234.         CE=1;                 //置高CE,激发数据发送
  235.         inerDelay_us(10);
  236. }
  237. //************************************主函数************************************************************
  238. void main(void)
  239. {
  240.         uchar temp =0;
  241.         LEDEN=0;        
  242.     init_NRF24L01() ;
  243.         nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
  244.         Delay(6000);
  245.         while(1)
  246.         {        
  247.                         if(temp<4)
  248.                 {
  249.                 switch(temp)
  250.                 {
  251.                 case         1:        
  252.                         D0=0;D1=0;
  253.                         break;        
  254.                 case         2:         
  255.                             D0=0;D1=1;
  256.                
  257.                                 break;        
  258.                 case         3:
  259.                         D0=1;D1=0;

  260.                           break;        
  261.                 default:  break;
  262.                 }
  263.                 }
  264.         if(temp==3)
  265.                 {
  266.                 temp=0;
  267.                 D0=1;D1=1;
  268.                 }
  269.                 nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
  270.                 Delay(20000);
  271.                 SPI_RW_Reg(WRITE_REG+STATUS,0XFF);  
  272.                 temp++;
  273.                 }
  274.         
  275. }
复制代码

程序代码如上

问题是接收端时刻有值送入PC(即使发送端没开启也是)  

请教高手帮忙改进 或者参考下你们的程序












/------------------------------------------------------------------------华丽丽的分割线-------------------------------------------------------------------------------------------------------------------/
同时我又发现了一份程序 一套收发程序 但是问题是接收端无论如何都没有数据传入PC
接收端


复制代码
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. //****************************************NRF24L01端口定义***************************************
  6. sbit CE   = P2^0;  // Chip Enable pin signal (output)
  7. sbit CSN  = P2^1;  // Slave Select pin, (output to CSN, nRF24L01)
  8. sbit IRQ  = P2^2;  // Interrupt signal, from nRF24L01 (input)
  9. sbit MISO = P2^3;  // Master In, Slave Out pin (input)
  10. sbit MOSI = P2^4;  // Serial Clock pin, (output)
  11. sbit SCK  = P2^5;  // Master Out, Slave In pin (output)
  12. sbit LEDEN= P1^7;
  13. //************************************按键***************************************************
  14. sbit        KEY1=P3^4;
  15. //************************************蜂明器***************************************************
  16. sbit         LED=P1^0;
  17. //*******************************************************************************************
  18. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  19. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  20. #define TX_PLOAD_WIDTH  32         // 20 uints TX payload
  21. #define RX_PLOAD_WIDTH  32          // 20 uints TX payload
  22. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  23. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  24. //***************************************NRF24L01寄存器指令*******************************************************
  25. #define READ_REG        0x00          // 读寄存器指令
  26. #define WRITE_REG       0x20         // 写寄存器指令
  27. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  28. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  29. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  30. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  31. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  32. #define NOP             0xFF          // 保留
  33. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  34. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  35. #define EN_AA           0x01  // 自动应答功能设置
  36. #define EN_RXADDR       0x02  // 可用信道设置
  37. #define SETUP_AW        0x03  // 收发地址宽度设置
  38. #define SETUP_RETR      0x04  // 自动重发功能设置
  39. #define RF_CH           0x05  // 工作频率设置
  40. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  41. #define STATUS          0x07  // 状态寄存器
  42. #define OBSERVE_TX      0x08  // 发送监测功能
  43. #define CD              0x09  // 地址检测           
  44. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  45. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  46. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  47. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  48. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  49. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  50. #define TX_ADDR         0x10  // 发送地址寄存器
  51. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  52. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  53. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  54. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  55. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  56. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  57. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  58. //**************************************************************************************
  59. void Delay(unsigned int s);
  60. void inerDelay_us(unsigned char n);
  61. void init_NRF24L01(void);
  62. uint SPI_RW(uint uchar);
  63. uchar SPI_Read(uchar reg);
  64. void SetRX_Mode(void);
  65. uint SPI_RW_Reg(uchar reg, uchar value);
  66. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  67. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  68. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  69. void nRF24L01_TxPacket(unsigned char * tx_buf);
  70. //*****************************************长延时*****************************************
  71. void Delay(unsigned int s)
  72. {
  73.         unsigned int i;
  74.         for(i=0; i<s; i++);
  75.         for(i=0; i<s; i++);
  76. }
  77. //******************************************************************************************
  78. uint         bdata sta;   //状态标志
  79. sbit        RX_DR        =sta^6;
  80. sbit        TX_DS        =sta^5;
  81. sbit        MAX_RT        =sta^4;
  82. /******************************************************************************************
  83. /*延时函数
  84. /******************************************************************************************/
  85. void inerDelay_us(unsigned char n)
  86. {
  87.         for(;n>0;n--)
  88.                 _nop_();
  89. }
  90. //****************************************************************************************
  91. /*NRF24L01初始化
  92. //***************************************************************************************/
  93. void init_NRF24L01(void)
  94. {
  95.     inerDelay_us(100);
  96.          CE=0;    // chip enable
  97.          CSN=1;   // Spi disable
  98.          SCK=0;   // Spi clock line init high
  99.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址        
  100.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  101.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许        
  102.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  103.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  104.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  105.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB
  106.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  107. }
  108. /****************************************************************************************************
  109. /*函数:uint SPI_RW(uint uchar)
  110. /*功能:NRF24L01的SPI写时序
  111. /****************************************************************************************************/
  112. uint SPI_RW(uint uchar)
  113. {
  114.         uint bit_ctr;
  115.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  116.            {
  117.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  118.                 uchar = (uchar << 1);           // shift next bit into MSB..
  119.                 SCK = 1;                      // Set SCK high..
  120.                 uchar |= MISO;                         // capture current MISO bit
  121.                 SCK = 0;                              // ..then set SCK low again
  122.            }
  123.     return(uchar);                             // return read uchar
  124. }
  125. /****************************************************************************************************
  126. /*函数:uchar SPI_Read(uchar reg)
  127. /*功能:NRF24L01的SPI时序
  128. /****************************************************************************************************/
  129. uchar SPI_Read(uchar reg)
  130. {
  131.         uchar reg_val;
  132.         
  133.         CSN = 0;                // CSN low, initialize SPI communication...
  134.         SPI_RW(reg);            // Select register to read from..
  135.         reg_val = SPI_RW(0);    // ..then read registervalue
  136.         CSN = 1;                // CSN high, terminate SPI communication
  137.         
  138.         return(reg_val);        // return register value
  139. }
  140. /****************************************************************************************************/
  141. /*功能:NRF24L01读写寄存器函数
  142. /****************************************************************************************************/
  143. uint SPI_RW_Reg(uchar reg, uchar value)
  144. {
  145.         uint status;
  146.         
  147.         CSN = 0;                   // CSN low, init SPI transaction
  148.         status = SPI_RW(reg);      // select register
  149.         SPI_RW(value);             // ..and write value to it..
  150.         CSN = 1;                   // CSN high again
  151.         
  152.         return(status);            // return nRF24L01 status uchar
  153. }
  154. /****************************************************************************************************/
  155. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  156. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  157. /****************************************************************************************************/
  158. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  159. {
  160.         uint status,uchar_ctr;
  161.         
  162.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  163.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  164.         
  165.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  166.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  167.         
  168.         CSN = 1;                           
  169.         
  170.         return(status);                    // return nRF24L01 status uchar
  171. }
  172. /*********************************************************************************************************
  173. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  174. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  175. /*********************************************************************************************************/
  176. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  177. {
  178.         uint status,uchar_ctr;
  179.         
  180.         CSN = 0;            //SPI使能      
  181.         status = SPI_RW(reg);   
  182.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  183.                 SPI_RW(*pBuf++);
  184.         CSN = 1;           //关闭SPI
  185.         return(status);    //
  186. }
  187. /****************************************************************************************************/
  188. /*函数:void SetRX_Mode(void)
  189. /*功能:数据接收配置
  190. /****************************************************************************************************/
  191. void SetRX_Mode(void)
  192. {
  193.         CE=0;
  194. //        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  195.         CE = 1;
  196.         inerDelay_us(130);
  197. }
  198. /******************************************************************************************************/
  199. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  200. /*功能:数据读取后放如rx_buf接收缓冲区中
  201. /******************************************************************************************************/
  202. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  203. {
  204.     unsigned char revale=0;
  205.         while(IRQ!=0);
  206.             CE = 0;                         //SPI使能
  207.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  208.                 revale =1;                        //读取数据完成标志

  209.         SPI_RW_Reg(WRITE_REG+STATUS,0XFF);  
  210.         return revale;
  211. }
  212. /***********************************************************************************************************
  213. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  214. /*功能:发送 tx_buf中数据
  215. /**********************************************************************************************************/
  216. void nRF24L01_TxPacket(unsigned char * tx_buf)
  217. {
  218.         CE=0;                        //StandBy I模式        
  219.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  220.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据        
  221.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  222.         CE=1;                 //置高CE,激发数据发送
  223.         inerDelay_us(10);
  224. }
  225. //************************************串口初始化*********************************************************
  226. void StartUART( void )
  227. {                                                          //波特率4800
  228.      SCON = 0x50;
  229.      TMOD = 0x20;
  230.      TH1 = 0xFA;
  231.      TL1 = 0xFA;
  232.      PCON = 0x00;
  233.      TR1 = 1;
  234. }
  235. //************************************通过串口将接收到数据发送给PC端**************************************
  236. void R_S_Byte(uchar R_Byte)
  237. {        
  238.          SBUF = R_Byte;  
  239.      while( TI == 0 );                                //查询法
  240.            TI = 0;   
  241. }
  242. //************************************主函数************************************************************
  243. void main(void)
  244. {
  245.         uchar i,temp;
  246.         uchar RxBuf[32];        
  247.     init_NRF24L01() ;
  248.         StartUART();
  249.         LEDEN=0;
  250.         Delay(6000);
  251.         while(1)
  252.         {

  253.                 SetRX_Mode();
  254.                    if(nRF24L01_RxPacket(RxBuf))
  255.                 {
  256.                 LED=0;
  257.                         temp++;
  258.                         for(i=0;i<32;i++)
  259.                         {
  260.                                 R_S_Byte(RxBuf[i]);
  261.                                 Delay(600);
  262.                         }        
  263.                 }
  264.                 LED=1;
  265.                 Delay(600);
  266.         }
  267.         
  268. }
复制代码

发送端


复制代码
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5. //****************************************NRF24L01端口定义***************************************
  6. sbit CE   = P2^0;  // Chip Enable pin signal (output)
  7. sbit CSN  = P2^1;  // Slave Select pin, (output to CSN, nRF24L01)
  8. sbit IRQ  = P2^2;  // Interrupt signal, from nRF24L01 (input)
  9. sbit MISO = P2^3;  // Master In, Slave Out pin (input)
  10. sbit MOSI = P2^4;  // Serial Clock pin, (output)
  11. sbit SCK  = P2^5;  // Master Out, Slave In pin (output)
  12. //************************************按键***************************************************
  13. sbit        KEY1=P3^4;
  14. //************************************蜂明器***************************************************
  15. sbit         LED=P1^0;
  16. //***********************************发送缓冲区*********************************************
  17. uchar TxBuf[32]=
  18. {
  19. 0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08,
  20. 0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,
  21. 0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,
  22. 0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,
  23. };         //
  24. //*********************************************NRF24L01*************************************
  25. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  26. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  27. #define TX_PLOAD_WIDTH  32          // 20 uints TX payload
  28. #define RX_PLOAD_WIDTH  32          // 20 uints TX payload
  29. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  30. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  31. //***************************************NRF24L01寄存器指令*******************************************************
  32. #define READ_REG        0x00          // 读寄存器指令
  33. #define WRITE_REG       0x20         // 写寄存器指令
  34. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  35. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  36. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  37. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  38. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  39. #define NOP             0xFF          // 保留
  40. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  41. #define CONFIG          0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  42. #define EN_AA           0x01  // 自动应答功能设置
  43. #define EN_RXADDR       0x02  // 可用信道设置
  44. #define SETUP_AW        0x03  // 收发地址宽度设置
  45. #define SETUP_RETR      0x04  // 自动重发功能设置
  46. #define RF_CH           0x05  // 工作频率设置
  47. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  48. #define STATUS          0x07  // 状态寄存器
  49. #define OBSERVE_TX      0x08  // 发送监测功能
  50. #define CD              0x09  // 地址检测           
  51. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  52. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  53. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  54. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  55. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  56. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  57. #define TX_ADDR         0x10  // 发送地址寄存器
  58. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  59. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  60. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  61. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  62. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  63. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  64. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  65. //**************************************************************************************
  66. void Delay(unsigned int s);
  67. void inerDelay_us(unsigned char n);
  68. void init_NRF24L01(void);
  69. uint SPI_RW(uint uchar);
  70. uchar SPI_Read(uchar reg);
  71. void SetRX_Mode(void);
  72. uint SPI_RW_Reg(uchar reg, uchar value);
  73. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars);
  74. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);
  75. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
  76. void nRF24L01_TxPacket(unsigned char * tx_buf);
  77. //*****************************************长延时*****************************************
  78. void Delay(unsigned int s)
  79. {
  80.         unsigned int i;
  81.         for(i=0; i<s; i++);
  82.         for(i=0; i<s; i++);
  83. }
  84. //******************************************************************************************
  85. uint         bdata sta;   //状态标志
  86. sbit        RX_DR        =sta^6;
  87. sbit        TX_DS        =sta^5;
  88. sbit        MAX_RT        =sta^4;
  89. /******************************************************************************************
  90. /*延时函数
  91. /******************************************************************************************/
  92. void inerDelay_us(unsigned char n)
  93. {
  94.         for(;n>0;n--)
  95.                 _nop_();
  96. }
  97. //****************************************************************************************
  98. /*NRF24L01初始化
  99. //***************************************************************************************/
  100. void init_NRF24L01(void)
  101. {
  102.     inerDelay_us(100);
  103.          CE=0;    // chip enable
  104.          CSN=1;   // Spi disable
  105.          SCK=0;   // Spi clock line init high
  106.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址        
  107.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  108.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许        
  109.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  110.         SPI_RW_Reg(WRITE_REG + RF_CH, 0);        //   设置信道工作为2.4GHZ,收发必须一致
  111.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  112.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);                   //设置发射速率为1MHZ,发射功率为最大值0dB        
  113.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送

  114. }
  115. /****************************************************************************************************
  116. /*函数:uint SPI_RW(uint uchar)
  117. /*功能:NRF24L01的SPI写时序
  118. /****************************************************************************************************/
  119. uint SPI_RW(uint uchar)
  120. {
  121.         uint bit_ctr;
  122.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  123.            {
  124.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  125.                 uchar = (uchar << 1);           // shift next bit into MSB..
  126.                 SCK = 1;                      // Set SCK high..
  127.                 uchar |= MISO;                         // capture current MISO bit
  128.                 SCK = 0;                              // ..then set SCK low again
  129.            }
  130.     return(uchar);                             // return read uchar
  131. }
  132. /****************************************************************************************************
  133. /*函数:uchar SPI_Read(uchar reg)
  134. /*功能:NRF24L01的SPI时序
  135. /****************************************************************************************************/
  136. uchar SPI_Read(uchar reg)
  137. {
  138.         uchar reg_val;
  139.         
  140.         CSN = 0;                // CSN low, initialize SPI communication...
  141.         SPI_RW(reg);            // Select register to read from..
  142.         reg_val = SPI_RW(0);    // ..then read registervalue
  143.         CSN = 1;                // CSN high, terminate SPI communication
  144.         
  145.         return(reg_val);        // return register value
  146. }
  147. /****************************************************************************************************/
  148. /*功能:NRF24L01读写寄存器函数
  149. /****************************************************************************************************/
  150. uint SPI_RW_Reg(uchar reg, uchar value)
  151. {
  152.         uint status;
  153.         
  154.         CSN = 0;                   // CSN low, init SPI transaction
  155.         status = SPI_RW(reg);      // select register
  156.         SPI_RW(value);             // ..and write value to it..
  157.         CSN = 1;                   // CSN high again
  158.         
  159.         return(status);            // return nRF24L01 status uchar
  160. }
  161. /****************************************************************************************************/
  162. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  163. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  164. /****************************************************************************************************/
  165. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  166. {
  167.         uint status,uchar_ctr;
  168.         
  169.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  170.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  171.         
  172.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  173.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  174.         
  175.         CSN = 1;                           
  176.         
  177.         return(status);                    // return nRF24L01 status uchar
  178. }
  179. /*********************************************************************************************************
  180. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  181. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  182. /*********************************************************************************************************/
  183. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  184. {
  185.         uint status,uchar_ctr;
  186.         
  187.         CSN = 0;            //SPI使能      
  188.         status = SPI_RW(reg);   
  189.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  190.                 SPI_RW(*pBuf++);
  191.         CSN = 1;           //关闭SPI
  192.         return(status);    //
  193. }
  194. /****************************************************************************************************/
  195. /*函数:void SetRX_Mode(void)
  196. /*功能:数据接收配置
  197. /****************************************************************************************************/
  198. void SetRX_Mode(void)
  199. {
  200.         CE=0;
  201.         SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  202.         CE = 1;
  203.         inerDelay_us(130);    //延时不能太短
  204. }
  205. /******************************************************************************************************/
  206. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  207. /*功能:数据读取后放如rx_buf接收缓冲区中
  208. /******************************************************************************************************/
  209. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  210. {
  211.     unsigned char revale=0;
  212.         sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
  213.         if(RX_DR)                                // 判断是否接收到数据
  214.         {
  215.             CE = 0;                         //SPI使能
  216.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  217.                 revale =1;                        //读取数据完成标志
  218.         }
  219.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  220.         return revale;
  221. }
  222. /***********************************************************************************************************
  223. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  224. /*功能:发送 tx_buf中数据
  225. /**********************************************************************************************************/
  226. void nRF24L01_TxPacket(unsigned char * tx_buf)
  227. {
  228.         CE=0;                        //StandBy I模式        
  229.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址
  230.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 装载数据        
  231. //        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);                    // IRQ收发完成中断响应,16位CRC,主发送
  232.         CE=1;                 //置高CE,激发数据发送
  233.         inerDelay_us(10);
  234. }
  235. //************************************主函数************************************************************
  236. void main(void)
  237. {
  238.         uchar temp =0;        
  239.     init_NRF24L01() ;
  240.         nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
  241.         Delay(6000);
  242. //        P0=0xBF;
  243.         while(1)
  244.         {        
  245.                 nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
  246.                 LED=0;
  247.                 Delay(10000);      //可变
  248.                 SPI_RW_Reg(WRITE_REG+STATUS,0XFF);  
  249.                 LED=1;
  250.                 Delay(8000);
  251.                 }
  252.         
  253. }
复制代码


第二套程序的问题就是  接收端无论如何都无数据传入PC  好蛋疼的说
求高手答疑。


16

主题

590

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2987
威望
1599
贡献
34
兑换币
939
注册时间
2012-11-17
在线时间
677 小时
1#
发表于 2013-6-23 11:42:19 | 只看该作者
可以用蓝牙
回复

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 20:02 , Processed in 0.091494 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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