欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 單片機+NRF2401收發一體程序 [打印本頁]

作者: isdasjkdajk    時間: 2021-4-18 20:02
標題: 單片機+NRF2401收發一體程序
NRF2401收發一套程序只需要修改參數即可實現收發功能。


單片機源程序如下:
  1. #include "NRF24L01.h"

  2. xdata u8 TxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //發送地址
  3. xdata u8 RxAddr[5] = {0x01,0x10,0x34,0x43,0x20}; //接收地址

  4. void NRF_IO_Init(void)
  5. {
  6.         SCK = 0;
  7. }

  8. u8 NRF_SPI_RW(u8 byte)
  9. {
  10.         u8 i = 0;
  11.         for(i=0;i<8;i++)
  12.         {
  13.                 MOSI = (byte&0x80);
  14.                 byte <<= 1;
  15.                 SCK = 1;
  16.                 byte|=MISO;
  17.                 SCK=0;
  18.         }
  19.        
  20.         return byte;
  21. }


  22. void NRF_WriteReg(u8 regaddr,u8 regval)
  23. {
  24.           CSN = 0;
  25.                 NRF_SPI_RW(regaddr+W_REG);
  26.           NRF_SPI_RW(regval);
  27.           CSN = 1;
  28. }

  29. u8 NRF_ReadReg(u8 regaddr)
  30. {
  31.           CSN = 0;
  32.                 NRF_SPI_RW(regaddr+R_REG);
  33.           regaddr = NRF_SPI_RW(NOP);
  34.           CSN = 1;
  35.                 return regaddr;
  36. }


  37. void NRF_WriteBytes(u8 regaddr,u8*nrfaddr,u8 len)
  38. {
  39.                 u8 i = 0;
  40.           CSN = 0;
  41.                 NRF_SPI_RW(regaddr+W_REG);
  42.           for(i = 0;i<len;i++)
  43.           {
  44.                    NRF_SPI_RW(nrfaddr[i]);
  45.                 }
  46.           CSN = 1;
  47. }

  48. void NRF_ReadBytes(u8 regaddr,u8*nrfaddr,u8 len)
  49. {
  50.                 u8 i = 0;
  51.           CSN = 0;
  52.                 NRF_SPI_RW(regaddr+R_REG);
  53.           for(i = 0;i<len;i++)
  54.           {
  55.                    nrfaddr[i] = NRF_SPI_RW(NOP);
  56.                 }
  57.           CSN = 1;
  58. }


  59. u8 NRF_CheckDev(void)
  60. {
  61.         u8 i  = 0;
  62.   xdata u8 rbuf[5] = {0};
  63.         NRF_WriteBytes(TX_ADDR,TxAddr,5);
  64.         NRF_ReadBytes(TX_ADDR,rbuf,5);
  65.         for(i=0;i<5;i++)
  66.         {
  67.                 if(TxAddr[i]!=rbuf[i])
  68.                 {
  69.                         return 0xff;
  70.                 }
  71.         }
  72.         return 0x0;
  73. }


  74. void NRF_SendMode(void)
  75. {
  76.         NRF_WriteBytes(TX_ADDR,TxAddr,5);    //設置發送地址               
  77.         NRF_WriteReg(EN_AA,0x01);                         //允許P0自動應答
  78.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  79.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //自動應答地址
  80.         NRF_WriteReg(RF_CH,40);                         //頻率
  81.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度
  82.         NRF_WriteReg(CONFIG,0x0e);                 //發送模式       

  83. }

  84. void NRF_RecvMode(void)
  85. {
  86.         NRF_WriteReg(EN_RXADDR,0x01);                 //P0接收
  87.         NRF_WriteBytes(RX_ADDR_P0,RxAddr,5); //接收地址
  88.         NRF_WriteReg(EN_AA,0x01);                         //允許P0自動應答
  89.         NRF_WriteReg(RF_CH,40);                         //頻率
  90.         NRF_WriteReg(RF_SETUP,0x07);                 //功率和速度                       
  91.         NRF_WriteReg(RX_PW_P0,32);         //數據有效寬度
  92.         NRF_WriteReg(CONFIG,0x0f);                 //接收模式

  93. }


  94. //返回值 0 存在設備 1 設備有問題
  95. //參數 0 發送模式   1接收模式
  96. u8 NRF_CONFIG(u8 mode)
  97. {
  98.          
  99.                 NRF_IO_Init();
  100.                 if(NRF_CheckDev()) //檢測設備存在
  101.           {
  102.                                 return 0xff;
  103.                 }

  104.                 switch(mode)
  105.                 {

  106.                         case NRF_TX:NRF_SendMode();                             
  107.                                      break; //發送
  108.                         case NRF_RX:NRF_RecvMode();
  109.                                                                          break; //接收
  110.                        
  111.                         default: return 0xff;
  112.                 }
  113.                
  114.           return 0x00;
  115. }


  116. void NRF_SendData(u8 *sbuf,u8 len)
  117. {
  118.                 CE = 0;
  119.     CSN = 0;
  120.                 if(len>32)len = 32; //限制最大32個字節
  121.           NRF_SPI_RW(WR_TX_PLOAD); //發送fifo地址
  122.           while(len--)
  123.                 {
  124.                   NRF_SPI_RW(*sbuf++);
  125.                 }
  126.                 CSN = 1;
  127.                 CE = 1;
  128. }



  129. void NRF_RecvData(u8 *sbuf,u8 len)
  130. {
  131.     CSN = 0;
  132.                 if(len>32)len = 32; //限制最大32個字節
  133.           NRF_SPI_RW(RD_RX_PLOAD);
  134.           while(len--)
  135.                 {
  136.                  *sbuf=NRF_SPI_RW(NOP);
  137.                         sbuf++;
  138.                 }
  139.                 CSN = 1;
  140. }


  141. u8 NRF_TxOrRxPack(u8 mode,u8 *pbuf,u8 len,u8 timeout)
  142. {
  143.                 static xdata u16 cnt = 0;
  144.                 static xdata u8 SRMode = 0;
  145.           u8 status = 0;
  146.                 if(++cnt>timeout)
  147.                 {
  148.                           cnt = 0;
  149.                           if(mode==NRF_TX) //發送模式
  150.                                 {
  151.                                                 switch(SRMode)
  152.                                                 {
  153.                                                         case 0:NRF_SendData(pbuf,len);SRMode++;
  154.                                                                     break;
  155.                                                         case 1:if(IRQ==0){
  156.                                                                                         status =NRF_ReadReg(STATUS);
  157.                                                                                         NRF_WriteReg(STATUS,status);
  158.                                                                                         if(status&MAX_TX)
  159.                                                                                         {
  160.                                                                                                         NRF_WriteReg(FLUSH_TX,0xff);
  161.                                                                                                         SRMode = 0;
  162.                                                                                                         return MAX_TX; //達到最大重發次數
  163.                                                                                         }
  164.                                                                                         if(status&TX_OK)
  165.                                                                                         {
  166.                                                                                                   SRMode = 0;
  167.                                                                                                         return TX_OK; //成功
  168.                                                                                         }
  169.                                                                                 }
  170.                                                                                 break;
  171.                                                         default: SRMode = 0;
  172.                                                 }
  173.                                 }
  174.                                  if(mode==NRF_RX) //接收模式
  175.                                 {
  176.                                                 status =NRF_ReadReg(STATUS);
  177.                               NRF_WriteReg(STATUS,status); //清除標志位
  178.                                                 if(status&RX_OK) //收到數據
  179.                                           {
  180.                                                         NRF_RecvData(pbuf,len);
  181.                                                         NRF_WriteReg(FLUSH_RX,0xff);//收到數據將RX FIFO清空
  182.                                                         return RX_OK;
  183.                                           }
  184.                                 }
  185.                 }
  186.                
  187.                 return 0xff; //其他錯誤
  188. }
復制代碼

所有資料51hei提供下載:
NRF24L01(整理后).zip (90.47 KB, 下載次數: 102)



作者: usaboy    時間: 2021-4-19 00:19
very good job, thank you sir!
作者: isdasjkdajk    時間: 2021-5-9 11:06
這個代碼是利用狀態機實現的,需要代碼無阻塞
作者: 山川慕白    時間: 2022-4-2 14:38
想問下頭文件#include <STC89C5xRC.H>為什么編譯提示有問題
作者: lxm_991    時間: 2022-4-3 23:59
謝謝分享  正準備研究一下
作者: isdasjkdajk    時間: 2022-5-20 17:29
山川慕白 發表于 2022-4-2 14:38
想問下頭文件#include 為什么編譯提示有問題

需要添加stc的頭文件,用reg52.h 也行可能就是需要改一下




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1