久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: NRF24L01無線模塊多機通信單片機程序 上位機+下位機 [打印本頁]

作者: huyun    時間: 2015-6-4 13:55
標題: NRF24L01無線模塊多機通信單片機程序 上位機+下位機
最近在接了一個項目,要求各個設備能夠聯網(不是互聯網)控制。nrf24l01剛好有這個功能。但是之前只做過一對一的通信,還是用例程的那一種。我在想,用兩個地址,共用同一個通道應該也可以完成。后來他又要求發過去的數據還要能回傳,這下我只好來研究多通道通信了。

多機通信和一對一通信基本上相同,就是要配置其他通道的地址和使能其他通道的有效數據寬度,還有自動應答。

這是接收機的:

​void NRF24L01_Init_RX(void)
{   
CE=0;   
CSN=1;   
SCK=0;   
SPI_Write_Buf(WRITE_REG + TX_ADDR, RX_ADDRESS, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH);
SPI_Write_Reg(WRITE_REG + EN_AA, 0x3f);
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3f);
SPI_Write_Reg(WRITE_REG + RF_CH, 40);
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_Write_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH);
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F);
SPI_Write_Reg(WRITE_REG + CONFIG, 0x0f);
}

​由于我用的是KeilC51和MDK5共存的,所以注釋復制過來之后就成了亂碼,在此貼圖一張:

NRF24L01_Init_Rx(void)
​下面就到了發送機了的配置了:

void NRF24L01_Init_TX(uint8_t *ADDRn)
{   
CE=0;
CSN=1;
SCK=0;
SPI_Write_Buf(WRITE_REG + TX_ADDR, (uint8_t*)ADDRn, TX_ADR_WIDTH);
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, (uint8_t*)ADDRn, RX_ADR_WIDTH);
SPI_Write_Reg(WRITE_REG + EN_AA, 0x3f);
SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3f);
SPI_Write_Reg(WRITE_REG + RF_CH, 40);
SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH);
SPI_Write_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH);
SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xff);
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f);
SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E);
}

同樣:


NRF24L01_Init_TX(uint8_t *ADDRn)
​發送給其他通道,只要改成其他通道的地址就可以了,不用改通道號,現在還不知道為什么。

接下來就是發送函數:

uint8_t nRF24L01_TxPacket(unsigned char * tx_buf)
{
uint8_t Return_Flag=0;
CE=0;
SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);
Delayms(2);
Return_Flag = Check_ACK(1);
return Return_Flag;
}

​由于我是通過電腦串口控制上位機,發給某一個下位機,然后再發回到我的上位機中,最后回傳到電腦,所以沒有數據搶答的問題。

最后再說一句,要配置第N個​的通道,前N個通道也必須被配置,要不然配置不成功。

最后貼上上位機程序:
  1. #include <stc12c5a.H>
  2. #include <intrins.h>
  3. #include "nrf24l01.h"
  4. #include "delay.h"
  5. #define uint32_t unsigned int
  6. #define uint8_t unsigned char

  7. uint8_t const RX_ADDRESS[TX_ADR_WIDTH]= {0x01,0x13,0x5C,0x0C,0x03};        //本地地址
  8. uint8_t const RX_ADDRESS1[TX_ADR_WIDTH]={0x02,0x13,0x5C,0x0C,0x03}; //本地地址1


  9. extern uint8_t Rx_Buf[32];
  10. extern uint8_t Tx_Buf[32];

  11. /**********************************RNF24L01狀態標志位************************************************/
  12. uint8_t         bdata sta;   
  13. sbit        RX_DR        =sta^6;
  14. sbit        TX_DS        =sta^5;
  15. sbit        MAX_RT        =sta^4;

  16. /**********************************NRF24L01管腳與單片機接口定義**************************************/


  17. sbit  MISO =P3^4;
  18. sbit  MOSI =P3^6;
  19. sbit SCK =P3^3;
  20. sbit  CE =P3^2;
  21. sbit CSN =P3^5;
  22. sbit IRQ =P3^7;



  23. /***************************************************************************
  24. 函數名稱:uchar SPI_RW(uint8_t dat)
  25. 函數功能:NRF24L01的SPI寫時序
  26. 函數備注:
  27. ***************************************************************************/
  28. uint8_t SPI_RW(uint8_t dat)
  29. {
  30.         uint8_t i;
  31.            for(i=0;i<8;i++)
  32.            {
  33.                 MOSI = (dat & 0x80);         
  34.                 dat = (dat << 1);           
  35.                 SCK = 1;                     
  36.                 dat |= MISO;                         
  37.                 SCK = 0;                              
  38.            }
  39.     return(dat);                             
  40. }

  41. /***************************************************************************
  42. 函數名稱:uint8_t SPI_Read(uint8_t cmd_reg)
  43. 函數功能:NRF24L01的SPI讀時序
  44. 函數備注:
  45. ***************************************************************************/
  46. uint8_t SPI_Read(uint8_t cmd_reg)
  47. {
  48.         uint8_t value;
  49.        
  50.         CSN = 0;               
  51.         SPI_RW(cmd_reg);            
  52.         value = SPI_RW(0);   
  53.         CSN = 1;               
  54.        
  55.         return(value);        
  56. }

  57. /***************************************************************************
  58. 函數名稱:void SPI_Write_Reg(uint8_t cmd_reg, uint8_t value)
  59. 函數功能:寫入NRF24L01寄寄存器和從NRF24L01寄存器中讀出
  60. 函數備注:
  61. ***************************************************************************/
  62. void SPI_Write_Reg(uint8_t cmd_reg, uint8_t value)
  63. {       
  64.         CSN = 0;                  
  65.         SPI_RW(cmd_reg);     
  66.         SPI_RW(value);            
  67.         CSN = 1;                  
  68. }

  69. /***************************************************************************
  70. 函數名稱:uint8_t SPI_Read_Buf(uint8_t cmd_reg, uint8_t *pBuf, uint8_t num)
  71. 函數功能:從NRF24L01寄存器中讀出數據
  72. 函數備注:reg:為寄存器地址,pBuf:為待讀出數據地址,uint8_t:讀出數據的個數
  73. ***************************************************************************/
  74. uint8_t SPI_Read_Buf(uint8_t cmd_reg, uint8_t *pBuf, uint8_t num)
  75. {
  76.         uint8_t status,i;
  77.        
  78.         CSN = 0;                                   
  79.         status = SPI_RW(cmd_reg);                      
  80.         for(i=0;i<num;i++)   pBuf[i] = SPI_RW(0);           
  81.         CSN = 1;                           
  82.        
  83.         return(status);                    
  84. }

  85. /***************************************************************************
  86. 函數名稱:void SPI_Write_Buf(uint8_t cmd_reg, uint8_t *pBuf, uint8_t num)
  87. 函數功能:在NRF24L01寄存器中寫入數據
  88. 函數備注:reg:為寄存器地址,pBuf:為待寫入數據地址,uint8_t:寫入數據的個數
  89. ***************************************************************************/
  90. void SPI_Write_Buf(uint8_t cmd_reg, uint8_t *pBuf, uint8_t num)
  91. {
  92.         uint8_t i;       
  93.         CSN = 0;            //SPI使能      
  94.         SPI_RW(cmd_reg);   
  95.         for(i=0; i<num; i++)   SPI_RW(*pBuf++);
  96.         CSN = 1;           //關閉SPI
  97. }

  98. /***************************************************************************
  99. 函數名稱:uint8_t nRF24L01_RxPacket(uint8_t* rx_buf)
  100. 函數功能:數據讀取后放入rx_buf接收緩沖區中
  101. 函數備注:
  102. ***************************************************************************/
  103. uint8_t nRF24L01_RxPacket(uint8_t* rx_buf)
  104. {
  105.    uint8_t flag;
  106.         CE = 1;                          //很重要!啟動接收!
  107.         Delayms(1);
  108.         sta=SPI_Read(READ_REG+STATUS);        // 讀取狀態寄存其來判斷數據接收狀況           //寄存器前面要加是讀還是寫
  109.         if(RX_DR)                                // 判斷是否接收到數據  如果置1則說明接到數據并且放置在接收緩存器
  110.         {
  111.            CE = 0;                
  112.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //這本來就是指令,不用加,意思說去緩存器里讀
  113.                 flag =1;                        //讀取數據完成標志
  114.         }
  115.         SPI_Write_Reg(WRITE_REG+STATUS,sta);   //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標志
  116.         return flag;
  117. }




  118. /**************************************************
  119. 函數:Check_ACK(bit clear)
  120. 描述:檢查接收設備有無接收到數據包,設定沒有收到應答信
  121.             號是否重發
  122. /**************************************************/
  123. uint8_t Check_ACK(bit clear)
  124. {
  125.         while(IRQ);
  126.         sta = SPI_RW(NOP);                    // 返回狀態寄存器
  127.         if(MAX_RT)
  128.                 if(clear)                         // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
  129.                         SPI_RW(FLUSH_TX);   //清空寄存器,很重要!!!
  130.         SPI_Write_Reg(WRITE_REG + STATUS, sta);  // 清除TX_DS或MAX_RT中斷標志
  131.         IRQ = 1;
  132.         if(TX_DS)
  133.                 return(0x01);
  134.         else
  135.                 return(0x00);
  136. }


  137. /***************************************************************************
  138. 函數名稱:void nRF24L01_TxPacket(unsigned char * tx_buf)
  139. 函數功能:發送 tx_buf中數據
  140. 函數備注:
  141. ***************************************************************************/
  142. uint8_t nRF24L01_TxPacket(unsigned char * tx_buf)
  143. {
  144.         uint8_t Return_Flag=0;
  145.         CE=0;                        //StandBy I模式       
  146.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                          // 裝載數據  WR_TX_PLOAD本來就是指令  不用加   將數據放入發送緩存器       
  147.         CE=1;                 //置高CE,激發數據發送
  148.         Delayms(2);
  149.         Return_Flag = Check_ACK(1);
  150.         return Return_Flag;
  151. }


  152. /***************************************************************************
  153. 函數名稱:void NRF24L01_Init_TX(void)
  154. 函數功能:初始化NRF24L01
  155. 函數備注:在調用NRF24L01作為發射時,都要先調用該函數對NRF24L01進行初始化
  156. ***************************************************************************/
  157. void NRF24L01_Init_TX(uint8_t *ADDRn)
  158. {   
  159.         /*待機模式*/
  160.         CE=0;
  161.         CSN=1;
  162.         SCK=0;
  163.         /*裝載數據*/
  164.         SPI_Write_Buf(WRITE_REG + TX_ADDR, (uint8_t*)ADDRn, TX_ADR_WIDTH);//寫TX節點地址
  165.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, (uint8_t*)ADDRn, RX_ADR_WIDTH); //設置TX節點地址,主要為了使能ACK          
  166.         /*配置寄存器*/
  167.         SPI_Write_Reg(WRITE_REG + EN_AA, 0x3f); //使能通道所有的自動應答   
  168.         SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3f);//使能通道所有的接收地址  
  169.         SPI_Write_Reg(WRITE_REG + RF_CH, 40);//設置RF通道為40   收發必須一致!
  170.         SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //選擇通道0的有效數據寬度           
  171.         SPI_Write_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //選擇通道1的有效數據寬度           
  172.         SPI_Write_Reg(WRITE_REG + SETUP_RETR, 0xff);//自動重發  4000+86us    重發15次
  173.         SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0f); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟  收發必須一致!                 
  174.         SPI_Write_Reg(WRITE_REG + CONFIG, 0x0E);  //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷                         
  175. }


  176. /***************************************************************************
  177. 函數名稱:void NRF24L01_Init_RX(void)
  178. 函數功能:初始化NRF24L01
  179. 函數備注:在調用NRF24L01作為接收時,都要先調用該函數對NRF24L01進行初始化
  180. ***************************************************************************/
  181. void NRF24L01_Init_RX(void)
  182. {   
  183.         /*待機模式*/
  184.         CE=0;   
  185.         CSN=1;   
  186.         SCK=0;   
  187.         /*裝載數據*/
  188.         SPI_Write_Buf(WRITE_REG + TX_ADDR, RX_ADDRESS, TX_ADR_WIDTH);//寫TX節點地址            
  189.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH);  //設置TX節點地址,主要為了使能ACK
  190.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P1, RX_ADDRESS1, RX_ADR_WIDTH);  //設置TX節點地址,主要為了使能ACK
  191.         /*配置寄存器*/
  192.         SPI_Write_Reg(WRITE_REG + EN_AA, 0x3f);//使能通道0的自動應答
  193.         SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x3f); //使能通道0的接收地址   
  194.         SPI_Write_Reg(WRITE_REG + RF_CH, 40); //設置RF通道為40   收發必須一致!
  195.         SPI_Write_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //選擇通道0的有效數據寬度
  196.         SPI_Write_Reg(WRITE_REG + RX_PW_P1, RX_PLOAD_WIDTH); //選擇通道1的有效數據寬度
  197.         SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x0F); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟  收發必須一致!
  198.         SPI_Write_Reg(WRITE_REG + CONFIG, 0x0f); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷
  199. }
復制代碼




1發2發1.zip

309.64 KB, 下載次數: 553, 下載積分: 黑幣 -5


作者: 南天白云    時間: 2015-6-4 18:38
謝謝!資料下載,我不知道與別人的有什么不一樣?
作者: 上帝武裝    時間: 2015-6-18 11:28
感謝樓主,我最近也在這個無線模塊,我的數據刷新有問題,參考下樓主的
作者: 上帝武裝    時間: 2015-6-18 11:28
不知道樓主這個數據刷新是如何處理的
作者: zajzaj111    時間: 2015-7-3 16:07
很好的東西
作者: flybaby    時間: 2015-9-6 13:59
非常感謝樓主無私奉獻
作者: ludaijin    時間: 2015-10-19 13:16
太強了,頂起
作者: jiakuo25    時間: 2015-10-19 16:58
本帖最后由 jiakuo25 于 2015-10-19 17:00 編輯

頂一下


作者: 騰飛的龍    時間: 2015-10-19 23:21
上位機的源碼不全啊、
作者: jie100    時間: 2016-1-1 00:10
非常感謝
作者: 風中有你    時間: 2016-1-15 18:28
還是不太懂啊,比如一對十,各個接收單元如何知道主機是對它發數據?
作者: xuanyifeng    時間: 2016-4-6 14:23
如何可以獲得黑幣呀,新手不懂
作者: xuanyifeng    時間: 2016-4-6 17:35
xuanyifeng 發表于 2016-4-6 14:23
如何可以獲得黑幣呀,新手不懂

謝謝你,太給力了,能先獎勵點么,嘿嘿嘿
作者: xuanyifeng    時間: 2016-4-6 20:42
好的,十分感謝
作者: xuanyifeng    時間: 2016-4-6 20:49
xuanyifeng 發表于 2016-4-6 17:35
謝謝你,太給力了,能先獎勵點么,嘿嘿嘿

別人下載資源,自己可以獎勵黑幣么?如何設置呢
作者: admin    時間: 2016-4-6 21:17
xuanyifeng 發表于 2016-4-6 20:49
別人下載資源,自己可以獎勵黑幣么?如何設置呢

設置出售附件即可,不過要工程師級別才可以。
作者: 文家燕    時間: 2016-4-12 22:30
hao  zi liao
作者: cheff    時間: 2016-10-10 10:29
不錯的學習資料,謝謝樓主
作者: 滴~電子小白    時間: 2016-10-19 14:25
感謝樓主的無私分享
作者: sywangjunqing    時間: 2017-3-21 11:58
正想研究一下 謝謝!
作者: ~IOT夙愿    時間: 2017-4-8 22:15
感謝樓主分享
作者: MRluo    時間: 2017-4-24 21:34
感謝樓主
作者: 流行雙杰    時間: 2017-4-26 17:49
謝謝分享,正在學習
作者: 仰望星空753521    時間: 2017-4-26 19:25
主要協議得寫對,還得穩定,不卡死
作者: 13118302007    時間: 2017-4-27 09:52
1-1,1-2都簡單,有沒有1-3到1-6的我參考一下
作者: 獨孤俠    時間: 2017-10-1 21:36

不錯的學習資料,謝謝樓主
作者: yeyan16900    時間: 2017-10-9 14:22
不錯謝謝分享
作者: xiong731    時間: 2017-11-28 21:08
感謝樓主的無私分享
作者: luokuipeng    時間: 2017-12-19 14:59

感謝樓主的無私分享
作者: WANG1995    時間: 2018-3-8 00:25
還是有用的
作者: bhjyqjs    時間: 2018-3-11 16:58
感謝樓主的無私奉獻
作者: Demon丶    時間: 2018-6-5 13:18
謝謝樓主
作者: HPC005    時間: 2018-6-5 15:33

謝謝分享! 51黑有你更精彩!!!
作者: guolh    時間: 2018-7-20 16:04
支持!!!!!!!!!!!!!
作者: redtxd    時間: 2018-8-15 07:04
謝謝樓主分享,正在學習該項目。
作者: redtxd    時間: 2018-8-27 16:56
謝謝老師分享,我也在做電腦發送地址的方式與多個nrf24l01終端通信,但是一直沒有成功。
作者: mm1113512    時間: 2019-1-19 20:42
謝謝分享
作者: _晨昏線    時間: 2019-3-17 19:25
樓主,想知道NRF24L01多對一的的發送,對于接受端是如何判斷是由哪個發送端發送的數據,又要如何處理?
作者: odiwuano    時間: 2019-9-7 13:43
我也下載來膜拜一下
作者: chunzz    時間: 2019-9-8 02:27
也來看看
作者: jnshuhe    時間: 2019-9-8 07:37
非常感謝,非常好
作者: frank123098    時間: 2019-10-9 10:08
請問樓主有一對一的資料,借鑒參考一下嗎?最近在學習這個模塊
作者: big_zhuang    時間: 2019-11-24 22:29
謝謝!資料下載,我不知道與別人的有什么不一樣?
作者: 莫詩書    時間: 2020-5-3 10:12
多謝樓主了
作者: raindrop1976    時間: 2020-5-24 11:47
學習了,謝謝說明
作者: 12334345    時間: 2021-1-30 10:55
這是一對多嗎
作者: bugall    時間: 2021-1-30 21:58
有沒有實測距離啊,這個模塊到底能穿多元
作者: rs2020    時間: 2022-1-20 14:03

也有一個WS2812 時鐘程序,60燈驅動. 參考學習一下.
作者: 小new    時間: 2023-5-10 11:00
我在想。這個上位機地址要配置,是通過窗口調試工具嗎?就是AT+RAX=那個,但是它只能改一個本地地址和發送地址,這設置成有兩個本地地址,這怎么操作的呀





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国外成人在线视频网站 | 国产成人高清 | 欧美一区在线视频 | 国产精品久久国产精品久久 | 九九热在线视频观看这里只有精品 | 久久精品视频9 | 青青草原精品99久久精品66 | 国产精品久久久久久吹潮 | 国产激情一区二区三区 | 黄色大片观看 | 欧美精品久久久久 | 欧美电影大全 | 久久久久黑人 | 天堂中文av| 精品无码久久久久久久动漫 | 久久成人精品视频 | 欧美小视频在线观看 | 亚洲一区 中文字幕 | 国产欧美一区二区三区日本久久久 | 成人网在线 | 日本不卡一区二区三区在线观看 | 亚洲精品福利视频 | 伊人狠狠| 天天天天天天天干 | 国内精品视频在线观看 | 玖玖精品视频 | 激情黄色在线观看 | 色婷婷在线视频 | 欧美日本在线 | 又爽又黄axxx片免费观看 | 国产精品污污视频 | 亚洲啊v | 国产精品久久久久久久久久久久久 | 亚洲精品久久久久久下一站 | 青青久久久 | 奇米av | 911网站大全在线观看 | 99reav| 91九色在线观看 | 国产精品一区二区视频 | 亚洲一区二区精品视频在线观看 |