找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于两个nrf24l01之间通信

[复制链接]
跳转到指定楼层
楼主
ID:741924 发表于 2020-5-1 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. 发射
  2. #include "reg52.h"
  3. #include "string.h"

  4. // 宏定义
  5. #define     uchar       unsigned char
  6. #define     uint        unsigned int

  7. #define     TX_ADR_WIDTH    5  // 5字节宽度的发送/接收地址
  8. #define     TX_PLOAD_WIDTH  4  // 数据通道有效数据宽度

  9. // LED灯及按键位定义
  10. sbit LED = P2^0;
  11. sbit KEY1 = P3^1;
  12. sbit KEY2 = P3^2;
  13. sbit BEEP = P1^5;

  14. uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定义一个静态发送地址

  15. uchar RX_BUF[TX_PLOAD_WIDTH];
  16. uchar TX_BUF[TX_PLOAD_WIDTH];
  17. uchar flag;
  18. uchar DATA = 0x01;
  19. uchar bdata sta;
  20. sbit  RX_DR     = sta^6;
  21. sbit  TX_DS     = sta^5;
  22. sbit  MAX_RT    = sta^4;

  23. // NRF24L01 模块引脚位定义
  24. sbit CE  =  P1^2;
  25. sbit CSN =  P1^3;
  26. sbit SCK =  P1^7;
  27. sbit MOSI= P1^1;
  28. sbit MISO= P1^6;
  29. sbit IRQ = P1^4;



  30. /********************** 下面的指令设置 和 寄存器地址设置     ***********************
  31. * ******************* 参考深圳市云佳科技有限公司给的PDF文档 ***********************
  32. * *******************           NRF24L01模块说明书        ***********************
  33. */
  34. /*  
  35.     SPI(nRF24L01) 指令设置
  36.     指令格式
  37.     <命令字  : 由高位到低位(每字节)>
  38.     <数据字节: 低字节到高字节,每一字节高位在前>
  39. */
  40. #define READ_REG    0x00  // Define read command to register
  41. #define WRITE_REG   0x20  // Define write command to register
  42. #define RD_RX_PLOAD 0x61  // Define RX payload register address
  43. #define WR_TX_PLOAD 0xA0  // Define TX payload register address
  44. #define FLUSH_TX    0xE1  // 清除 TX FIFO寄存器  应用于发射模式下
  45. #define FLUSH_RX    0xE2  // 清除 RX FIFO寄存器  应用于接收模式下。
  46. #define REUSE_TX_PL 0xE3  // 重新使用上一包有效数据。 当CE=1,数据包被不断重新发射 发射过程中必须禁止数据包重利用功能
  47. #define NOP         0xFF  // 空操作。可以用来读状态寄存器

  48. /*  
  49.     SPI(nRF24L01) registers(addresses)
  50.     一下寄存器都是默认只使用 数据通道0 不开启其他通道
  51. */
  52. #define CONFIG      0x00  // 'Config' register address
  53. #define EN_AA       0x01  // 'Enable Auto Acknowledgment' register address
  54. #define EN_RXADDR   0x02  // 'Enabled RX addresses' register address
  55. #define SETUP_AW    0x03  // 'Setup address width' register address
  56. #define SETUP_RETR  0x04  // 'Setup Auto. Retrans' register address
  57. #define RF_CH       0x05  // 'RF channel' register address
  58. #define RF_SETUP    0x06  // 'RF setup' register address
  59. #define STATUS      0x07  // 'Status' register address
  60. #define OBSERVE_TX  0x08  // 'Observe TX' register address
  61. #define CD          0x09  // 'Carrier Detect' register address
  62. #define RX_ADDR_P0  0x0A  // 'RX address pipe0' register address
  63. #define RX_ADDR_P1  0x0B  // 'RX address pipe1' register address
  64. #define RX_ADDR_P2  0x0C  // 'RX address pipe2' register address
  65. #define RX_ADDR_P3  0x0D  // 'RX address pipe3' register address
  66. #define RX_ADDR_P4  0x0E  // 'RX address pipe4' register address
  67. #define RX_ADDR_P5  0x0F  // 'RX address pipe5' register address
  68. #define TX_ADDR     0x10  // 'TX address' register address
  69. #define RX_PW_P0    0x11  // 'RX payload width, pipe0' register address
  70. #define RX_PW_P1    0x12  // 'RX payload width, pipe1' register address
  71. #define RX_PW_P2    0x13  // 'RX payload width, pipe2' register address
  72. #define RX_PW_P3    0x14  // 'RX payload width, pipe3' register address
  73. #define RX_PW_P4    0x15  // 'RX payload width, pipe4' register address
  74. #define RX_PW_P5    0x16  // 'RX payload width, pipe5' register address
  75. #define FIFO_STATUS 0x17  // 'FIFO Status Register' register address

  76. // 毫秒级延时
  77. void delay_ms(uint z)
  78. {
  79.         uint x, y;
  80.         for (x = z; x > 0; x--)
  81.                 for (y = 123; y > 0; y--);

  82. }


  83. // led闪烁
  84. void blink(char i)
  85. {
  86.     while(i--)
  87.     {
  88.         LED = 1;
  89.         delay_ms(500);
  90.         LED = 0;
  91.         delay_ms(500);
  92.     }

  93. }

  94. // 初始化IO
  95. void init_io(void)
  96. {
  97.     CE  = 0;        // 待机
  98.     CSN = 1;        // SPI禁止
  99.     SCK = 0;        // SPI时钟置低
  100.     IRQ = 1;        // 中断复位
  101.     LED = 1;        // 关闭指示灯
  102. }


  103. /*******************************************************************
  104. @func                : SPI_RW(uchar byte)
  105. @brief                : 写一个字节到24L01 同时读出一个字节
  106. @pram                : byte : 要写入24l01的字节
  107. @retval        : 返回读取的字节
  108. *******************************************************************/
  109. uchar SPI_RW(uchar byte)
  110. {
  111.     uchar   bit_ctr;
  112.     // output 8-bits
  113.     for (bit_ctr = 0; bit_ctr < 8; bit_ctr++)
  114.     {
  115.         MOSI = (byte & 0x80);   // output ‘byte’  MSB to MOSI
  116.         byte = (byte << 1);     // shift next bit into MSB..
  117.         SCK = 1;                // Set SCK high.. 24L01 read 1-bit from MOSI and output 1-bit to MISO
  118.         byte |= MISO;           // capture current MISO bit
  119.         SCK = 0;                // ..then set SCK low again
  120.     }

  121.     return (byte);  // return read byte
  122. }


  123. /*******************************************************************
  124. @func                : SPI_RW_Reg(BYTE reg, BYTE value)
  125. @brief                : 向寄存器reg写一个字节,同时返回状态字节
  126. @pram                : reg  : 要写数据的寄存器地址
  127.               value: 要写入寄存器的数据
  128. @retval        : 返回状态寄存器
  129. @NOTE                : 其他提示
  130. *******************************************************************/
  131. uchar SPI_RW_Reg(uchar reg, uchar value)
  132. {
  133.     uchar status;
  134.     CSN = 0;                // CSN low, init SPI transaction, start transmitting data
  135.     status = SPI_RW(reg);   // select register and return status byte
  136.     SPI_RW(value);          // ..and write value to it..
  137.     CSN = 1;                // CSN high again, transmission end
  138.     return(status);         // return nRF24L01 status byte
  139. }


  140. /*******************************************************************
  141. @func                : SPI_Read(uchar reg)
  142. @brief                : 从reg寄存器读一字节
  143. @pram                : reg  : 要读取数据的寄存器地址
  144. @retval        : 返回寄存器数据
  145. *******************************************************************/
  146. uchar SPI_Read(uchar reg)
  147. {
  148.         uchar reg_val;
  149.     CSN = 0;
  150.         SPI_RW(reg);
  151.         reg_val = SPI_RW(0);  
  152.         CSN = 1;            
  153.         return(reg_val);  
  154. }


  155. /*******************************************************************
  156. @func                : SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
  157. @brief                : 从reg寄存器读 bytes 个字节  通常用来读取接收通道
  158. @pram                : reg  : 要从中读取数据的寄存器
  159.               pBuf : 存储读取的数据
  160.               bytes: 读取的字节数
  161. @retval        : 返回状态寄存器
  162. @NOTE                : 其他提示
  163. *******************************************************************/
  164. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
  165. {
  166.     uchar status,byte_ctr;
  167.     CSN = 0;                    // Set CSN low, init SPI tranaction
  168.     status = SPI_RW(reg);       // Select register to read & return status byte
  169.    
  170.     for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
  171.         pBuf[byte_ctr] = SPI_RW(0); //逐个字节从nRF24L01读出
  172.     CSN = 1;                    // set CSN high, stop transaction
  173.     return(status);             // return nRF24L01 status byte
  174. }


  175. /*******************************************************************
  176. @func                : SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
  177. @brief                : 往reg寄存器写入 bytes 个字节  通常用来写入发射通道或接收/发送地址
  178. @pram                : reg  : 要写入数据的寄存器
  179.               pBuf : 要写入的的数据
  180.               bytes: 写入的字节数
  181. @retval        : 返回状态寄存器
  182. @NOTE                : 其他提示
  183. *******************************************************************/
  184. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
  185. {
  186.     uchar status,byte_ctr;
  187.     CSN = 0;                // Set CSN low, init SPI tranaction
  188.     status = SPI_RW(reg);   // Select register to write to & return status byte
  189.    
  190.     for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
  191.         SPI_RW(*pBuf++);    // 逐个字节写入nRF24L01
  192.     CSN = 1;                // Set CSN high again 结束数据传输
  193.     return(status);         // 返回状态寄存器
  194. }


  195. /*******************************************************************
  196. @func                : RX_Mode(void)
  197. @brief                : 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
  198. @pram                : None
  199. @retval        : None
  200. *******************************************************************/
  201. void RX_Mode(void)
  202. {
  203.     CE = 0;
  204.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
  205.     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);  
  206.     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
  207.     SPI_RW_Reg(WRITE_REG + RF_CH, 40);  
  208.     SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
  209.     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
  210.     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
  211.     delay_ms(150);
  212.     CE = 1;               
  213. }


  214. /*******************************************************************
  215. @func                : TX_Mode(uchar * BUF)
  216. @brief                : 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
  217.               130us后启动发射,数据发送结束后,发送模块自动转入接收
  218.               模式等待应答信号
  219. @pram                : BUF : 要发送的数据
  220. @retval        : None
  221. *******************************************************************/
  222. void TX_Mode(uchar *BUF)
  223. {
  224.     CE = 0;
  225.     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
  226.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
  227.     SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
  228.     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);  
  229.     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
  230.     SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
  231.     SPI_RW_Reg(WRITE_REG + RF_CH, 40);  
  232.     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
  233.     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
  234.     delay_ms(150);
  235.     CE = 1;
  236. }



  237. /*******************************************************************
  238. @func                : Check_ACK(bit clear)
  239. @brief                : 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发
  240. @pram                : clear : 判断是否清楚标志位
  241. @retval        : 返回0x00 或 0xff
  242. *******************************************************************/
  243. uchar Check_ACK(bit clear)
  244. {
  245.     delay_ms(200);
  246.     while(IRQ);             // 等待数据接收完成
  247.     sta = SPI_RW(NOP);      // 返回状态寄存器
  248.     if(TX_DS)
  249.     {
  250.         blink(3);
  251.     }
  252.     //blink(5);
  253.     if(MAX_RT)
  254.         if(clear)                         // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
  255.             SPI_RW(FLUSH_TX);
  256.     SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中断标志
  257.     IRQ = 1;
  258.     if(TX_DS)
  259.         return(0x00);
  260.     else
  261.         return(0xff);
  262. }


  263. // 按键扫描
  264. void CheckButtons()
  265. {
  266.     if(KEY1 == 0)
  267.     {
  268.         delay_ms(10);
  269.         if(KEY1 == 0)
  270.         {
  271.                         while(!KEY1);
  272.             TX_BUF[0] = 1;          // 数据送到缓存
  273.             TX_Mode(TX_BUF);        // 把nRF24L01设置为发送模式并发送数据
  274.             Check_ACK(0);           // 等待发送完毕,清除TX FIFO
  275.             delay_ms(250);
  276.             delay_ms(250);
  277.         }
  278.     }

  279.     if(KEY2 == 0)
  280.     {
  281.         delay_ms(10);
  282.         if(KEY2 == 0)
  283.         {
  284.                         while(!KEY2);
  285.             TX_BUF[0] = 2;          // 数据送到缓存
  286.             TX_Mode(TX_BUF);            // 把nRF24L01设置为发送模式并发送数据
  287.             Check_ACK(0);               // 等待发送完毕,清除TX FIFO
  288.             delay_ms(250);
  289.             delay_ms(250);
  290.         }
  291.     }
  292. }



  293. void main(void)
  294. {
  295.     init_io();                      // 初始化IO
  296.     while(1)
  297.     {
  298.         CheckButtons();           // 按键扫描
  299.     }
  300. }
复制代码
  1. <div>接收</div><div>#include "reg52.h"
  2. </div>#include "string.h"


  3. // 宏定义
  4. #define     uchar       unsigned char
  5. #define     uint        unsigned int
  6. #define     ulong        unsigned long

  7. #define     TX_ADR_WIDTH    5  // 5字节宽度的发送/接收地址
  8. #define     TX_PLOAD_WIDTH  4  // 数据通道有效数据宽度

  9. // LED灯及按键位定义
  10. sbit LED = P2^0;
  11. sbit KEY1 = P3^1;
  12. sbit KEY2 = P3^2;
  13. sbit BEEP = P1^5;

  14. uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};  // 定义一个静态发送地址

  15. uchar RX_BUF[TX_PLOAD_WIDTH];
  16. uchar TX_BUF[TX_PLOAD_WIDTH];
  17. uchar flag;
  18. uchar DATA = 0x01;
  19. uchar bdata sta;// 状态寄存器
  20. sbit  RX_DR     = sta^6;
  21. sbit  TX_DS     = sta^5;
  22. sbit  MAX_RT         = sta^4;

  23. // NRF24L01 模块引脚位定义
  24. sbit CE   =  P1^2;
  25. sbit CSN  =  P1^3;
  26. sbit SCK  =  P1^7;
  27. sbit MOSI =  P1^1;
  28. sbit MISO =  P1^6;
  29. sbit IRQ  =  P1^4;


  30. /*  
  31.     SPI(nRF24L01) 指令设置
  32.     指令格式
  33.     <命令字  : 由高位到低位(每字节)>
  34.     <数据字节: 低字节到高字节,每一字节高位在前>
  35. */
  36. #define READ_REG    0x00  // Define read command to register
  37. #define WRITE_REG   0x20  // Define write command to register
  38. #define RD_RX_PLOAD 0x61  // Define RX payload register address
  39. #define WR_TX_PLOAD 0xA0  // Define TX payload register address
  40. #define FLUSH_TX    0xE1  // 清除 TX FIFO寄存器  应用于发射模式下
  41. #define FLUSH_RX    0xE2  // 清除 RX FIFO寄存器  应用于接收模式下。
  42. #define REUSE_TX_PL 0xE3  // 重新使用上一包有效数据。 当CE=1,数据包被不断重新发射 发射过程中必须禁止数据包重利用功能
  43. #define NOP         0xFF  // 空操作。可以用来读状态寄存器

  44. /*  
  45.     SPI(nRF24L01) registers(addresses)
  46.     一下寄存器都是默认只使用 数据通道0 不开启其他通道
  47. */
  48. #define CONFIG      0x00  // 'Config' register address
  49. #define EN_AA       0x01  // 'Enable Auto Acknowledgment' register address
  50. #define EN_RXADDR   0x02  // 'Enabled RX addresses' register address
  51. #define SETUP_AW    0x03  // 'Setup address width' register address
  52. #define SETUP_RETR  0x04  // 'Setup Auto. Retrans' register address
  53. #define RF_CH       0x05  // 'RF channel' register address
  54. #define RF_SETUP    0x06  // 'RF setup' register address
  55. #define STATUS      0x07  // 'Status' register address
  56. #define OBSERVE_TX  0x08  // 'Observe TX' register address
  57. #define CD          0x09  // 'Carrier Detect' register address
  58. #define RX_ADDR_P0  0x0A  // 'RX address pipe0' register address
  59. #define RX_ADDR_P1  0x0B  // 'RX address pipe1' register address
  60. #define RX_ADDR_P2  0x0C  // 'RX address pipe2' register address
  61. #define RX_ADDR_P3  0x0D  // 'RX address pipe3' register address
  62. #define RX_ADDR_P4  0x0E  // 'RX address pipe4' register address
  63. #define RX_ADDR_P5  0x0F  // 'RX address pipe5' register address
  64. #define TX_ADDR     0x10  // 'TX address' register address
  65. #define RX_PW_P0    0x11  // 'RX payload width, pipe0' register address
  66. #define RX_PW_P1    0x12  // 'RX payload width, pipe1' register address
  67. #define RX_PW_P2    0x13  // 'RX payload width, pipe2' register address
  68. #define RX_PW_P3    0x14  // 'RX payload width, pipe3' register address
  69. #define RX_PW_P4    0x15  // 'RX payload width, pipe4' register address
  70. #define RX_PW_P5    0x16  // 'RX payload width, pipe5' register address
  71. #define FIFO_STATUS 0x17  // 'FIFO Status Register' register address



  72. // 毫秒级延时
  73. void delay_ms(uint z)
  74. {
  75.         uint x,y;
  76.         for(x=z;x>0;x--)
  77.                 for(y=123;y>0;y--);
  78. }

  79. // led闪烁
  80. void blink(char i)
  81. {
  82.     while(i--)
  83.     {
  84.         LED = 1;
  85.         delay_ms(500);
  86.         LED = 0;
  87.         delay_ms(500);
  88.     }
  89. }


  90. // 初始化IO
  91. void init_io(void)
  92. {
  93.     CE  = 0;        // 待机
  94.     CSN = 1;        // SPI禁止
  95.     SCK = 0;        // SPI时钟置低
  96.     IRQ = 1;        // 中断复位
  97.     LED = 1;        // 关闭指示灯
  98. }


  99. /*******************************************************************
  100. @func                : SPI_RW(uchar byte)
  101. @brief                : 写一个字节到24L01 同时读出一个字节
  102. @pram                : byte : 要写入24l01的字节
  103. @retval        : 返回读取的字节
  104. @NOTE                : 其他提示
  105. *******************************************************************/
  106. uchar SPI_RW(uchar byte)
  107. {
  108.     uchar   bit_ctr;
  109.     // output 8-bits
  110.     for (bit_ctr = 0; bit_ctr < 8; bit_ctr++)
  111.     {
  112.         MOSI = (byte & 0x80);   // output ‘byte’  MSB to MOSI
  113.         byte = (byte << 1);     // shift next bit into MSB..
  114.         SCK = 1;                // Set SCK high.. 24L01 read 1-bit from MOSI and output 1-bit to MISO
  115.         byte |= MISO;           // capture current MISO bit
  116.         SCK = 0;                // ..then set SCK low again
  117.     }

  118.     return (byte);  // return read byte
  119. }


  120. /*******************************************************************
  121. @func                : SPI_RW_Reg(BYTE reg, BYTE value)
  122. @brief                : 向寄存器reg写一个字节,同时返回状态字节
  123. @pram                : reg  : 要写数据的寄存器地址
  124.               value: 要写入寄存器的数据
  125. @retval        : 返回状态寄存器
  126. @NOTE                : 其他提示
  127. *******************************************************************/
  128. uchar SPI_RW_Reg(uchar reg, uchar value)
  129. {
  130.     uchar status;
  131.     CSN = 0;                // CSN low, init SPI transaction, start transmitting data
  132.     status = SPI_RW(reg);   // select register and return status byte
  133.     SPI_RW(value);          // ..and write value to it..
  134.     CSN = 1;                // CSN high again, transmission end
  135.     return(status);         // return nRF24L01 status byte
  136. }


  137. /*******************************************************************
  138. @func                : SPI_Read(uchar reg)
  139. @brief                : 从reg寄存器读一字节
  140. @pram                : reg  : 要读取数据的寄存器地址
  141. @retval        : 返回寄存器数据
  142. *******************************************************************/
  143. uchar SPI_Read(uchar reg)
  144. {
  145.         uchar reg_val;
  146.     CSN = 0;                    // CSN置低,开始传输数据
  147.         SPI_RW(reg);                // 选择寄存器
  148.         reg_val = SPI_RW(0);        // 然后从该寄存器读数据
  149.         CSN = 1;                    // CSN拉高,结束数据传输
  150.         return(reg_val);            // 返回寄存器数据

  151. }


  152. /*******************************************************************
  153. @func                : SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
  154. @brief                : 从reg寄存器读 bytes 个字节  通常用来读取接收通道
  155. @pram                : reg  : 要从中读取数据的寄存器
  156.               pBuf : 存储读取的数据
  157.               bytes: 读取的字节数
  158. @retval        : 返回状态寄存器
  159. @NOTE                : 其他提示
  160. *******************************************************************/
  161. uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar bytes)
  162. {
  163.     uchar status, byte_ctr;
  164.     CSN = 0;                    // Set CSN low, init SPI tranaction
  165.     status = SPI_RW(reg);       // Select register to read & return status byte
  166.    
  167.     for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
  168.         pBuf[byte_ctr] = SPI_RW(0); //逐个字节从nRF24L01读出
  169.     CSN = 1;                    // set CSN high, stop transaction
  170.     return(status);             // return nRF24L01 status byte
  171. }


  172. /*******************************************************************
  173. @func                : SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
  174. @brief                : 往reg寄存器写入 bytes 个字节  通常用来写入发射通道或接收/发送地址
  175. @pram                : reg  : 要写入数据的寄存器
  176.               pBuf : 要写入的的数据
  177.               bytes: 写入的字节数
  178. @retval        : 返回状态寄存器
  179. @NOTE                : 其他提示
  180. *******************************************************************/
  181. uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
  182. {
  183.     uchar status, byte_ctr;
  184.     CSN = 0;                // Set CSN low, init SPI tranaction
  185.     status = SPI_RW(reg);   // Select register to write to & return status byte
  186.    
  187.     for (byte_ctr = 0; byte_ctr < bytes; byte_ctr++)
  188.         SPI_RW(*pBuf++);    // 逐个字节写入nRF24L01
  189.     CSN = 1;                // Set CSN high again 结束数据传输
  190.     return(status);         // 返回状态寄存器
  191. }


  192. /*******************************************************************
  193. @func                : RX_Mode(void)
  194. @brief                : 这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包
  195. @pram                : None
  196. @retval        : None
  197. *******************************************************************/
  198. void RX_Mode(void)
  199. {
  200.     CE = 0;
  201.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);   
  202.     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      
  203.     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);   
  204.     SPI_RW_Reg(WRITE_REG + RF_CH, 40);   
  205.     SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
  206.     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   
  207.     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
  208.     delay_ms(150);
  209.     CE = 1;                                    
  210. }


  211. /*******************************************************************
  212. @func                : TX_Mode(uchar * BUF)
  213. @brief                : 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),
  214.               130us后启动发射,数据发送结束后,发送模块自动转入接收
  215.               模式等待应答信号
  216. @pram                : BUF : 要发送的数据
  217. @retval        : None
  218. *******************************************************************/
  219. void TX_Mode(uchar * BUF)
  220. {
  221.     CE = 0;
  222.     SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);     
  223.     SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);  
  224.     SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH);
  225.     SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
  226.     SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
  227.     SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a);
  228.     SPI_RW_Reg(WRITE_REG + RF_CH, 40);
  229.     SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);
  230.     SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
  231.     delay_ms(150);
  232.     CE = 1;
  233. }


  234. /*******************************************************************
  235. @func                : Check_ACK(bit clear)
  236. @brief                : 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发
  237. @pram                : clear : 判断是否清楚标志位
  238. @retval        : 返回0x00 或 0xff
  239. *******************************************************************/
  240. uchar Check_ACK(bit clear)
  241. {
  242.     //delay_ms(200);
  243.     while(IRQ);             // 等待数据接收完成
  244.     sta = SPI_RW(NOP);      // 返回状态寄存器
  245.     if(TX_DS)
  246.     {
  247.         //blink(3);
  248.     }
  249.     //blink(5);
  250.     if(MAX_RT)
  251.         if(clear)                         // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发
  252.             SPI_RW(FLUSH_TX);
  253.     SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中断标志
  254.     IRQ = 1;
  255.     if(TX_DS)
  256.         return(0x00);
  257.     else
  258.         return(0xff);
  259. }


  260. // 按键扫描
  261. /*void CheckButtons()
  262. {
  263.     P3 |= 0x00;
  264.     if(!(P3 & 0x01))                    // 读取P3^0状态
  265.     {
  266.         delay_ms(20);
  267.         if(!(P3 & 0x01))                // 读取P3^0状态
  268.         {
  269.             TX_BUF[0] = ~DATA;          // 数据送到缓存
  270.             //TX_BUF[0] = 0xff;          // 数据送到缓存
  271.             TX_Mode(TX_BUF);            // 把nRF24L01设置为发送模式并发送数据            
  272.             //LED = ~DATA;                // 数据送到LED显示
  273.             Check_ACK(0);               // 等待发送完毕,清除TX FIFO
  274.             delay_ms(250);
  275.             delay_ms(250);
  276.             LED = 1;                    // 关闭LED
  277.             RX_Mode();                    // 设置为接收模式
  278.             while(!(P3 & 0x01));
  279.             DATA <<= 1;
  280.             if(!DATA)
  281.                 DATA = 0x01;
  282.         }
  283.     }


  284. }  */



  285. void main(void)
  286. {
  287.     init_io();                      // 初始化IO
  288.         RX_Mode();                                                // 设置为接收模式

  289.     while(1)
  290.     {
  291.         sta = SPI_Read(STATUS);      // 读状态寄存器
  292.         //delay_ms(200);
  293.         if(RX_DR)                    // 判断是否接受到数据
  294.         {
  295.             SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  // 从RX FIFO读出数据
  296.             flag = 1;
  297.         }
  298.         SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中断标志

  299.         if(flag)                   // 接受完成
  300.         {
  301.             if(RX_BUF[0] == 1)      // RX_BUF[0] = 1 则蜂鸣器响一下
  302.             {
  303.                 BEEP = 0;
  304.                 delay_ms(500);
  305.                 BEEP = 1;
  306.                 delay_ms(500);
  307.             }

  308.             if(RX_BUF[0] == 2)  // RX_BUF[0] = 2 则LED闪烁三下
  309.             {
  310.                 BEEP = 0;
  311.                 delay_ms(500);
  312.                 BEEP = 1;
  313.                 delay_ms(500);
  314.                 BEEP = 0;
  315.                 delay_ms(500);
  316.                 BEEP = 1;
  317.                 delay_ms(500);
  318.                 BEEP = 0;
  319.                 delay_ms(500);
  320.                 BEEP = 1;
  321.                 delay_ms(500);
  322.             }
  323.             flag = 0;               // 清标志
  324.             delay_ms(250);
  325.             delay_ms(250);
  326.             LED = 1;                // 关闭LED
  327.         }
  328.     }
  329. }
复制代码




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

使用道具 举报

沙发
ID:1 发表于 2020-5-2 13:55 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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