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

標(biāo)題: NRF24L01無線模塊多機(jī)通信單片機(jī)程序 上位機(jī)+下位機(jī) [打印本頁]

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

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

這是接收機(jī)的:

​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共存的,所以注釋復(fù)制過來之后就成了亂碼,在此貼圖一張:

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

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)
​發(fā)送給其他通道,只要改成其他通道的地址就可以了,不用改通道號,現(xiàn)在還不知道為什么。

接下來就是發(fā)送函數(shù):

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;
}

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

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

最后貼上上位機(jī)程序:
  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狀態(tài)標(biāo)志位************************************************/
  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管腳與單片機(jī)接口定義**************************************/


  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. 函數(shù)名稱:uchar SPI_RW(uint8_t dat)
  25. 函數(shù)功能:NRF24L01的SPI寫時序
  26. 函數(shù)備注:
  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. 函數(shù)名稱:uint8_t SPI_Read(uint8_t cmd_reg)
  43. 函數(shù)功能:NRF24L01的SPI讀時序
  44. 函數(shù)備注:
  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. 函數(shù)名稱:void SPI_Write_Reg(uint8_t cmd_reg, uint8_t value)
  59. 函數(shù)功能:寫入NRF24L01寄寄存器和從NRF24L01寄存器中讀出
  60. 函數(shù)備注:
  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. 函數(shù)名稱:uint8_t SPI_Read_Buf(uint8_t cmd_reg, uint8_t *pBuf, uint8_t num)
  71. 函數(shù)功能:從NRF24L01寄存器中讀出數(shù)據(jù)
  72. 函數(shù)備注:reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uint8_t:讀出數(shù)據(jù)的個數(shù)
  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. 函數(shù)名稱:void SPI_Write_Buf(uint8_t cmd_reg, uint8_t *pBuf, uint8_t num)
  87. 函數(shù)功能:在NRF24L01寄存器中寫入數(shù)據(jù)
  88. 函數(shù)備注:reg:為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uint8_t:寫入數(shù)據(jù)的個數(shù)
  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;           //關(guān)閉SPI
  97. }

  98. /***************************************************************************
  99. 函數(shù)名稱:uint8_t nRF24L01_RxPacket(uint8_t* rx_buf)
  100. 函數(shù)功能:數(shù)據(jù)讀取后放入rx_buf接收緩沖區(qū)中
  101. 函數(shù)備注:
  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);        // 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況           //寄存器前面要加是讀還是寫
  109.         if(RX_DR)                                // 判斷是否接收到數(shù)據(jù)  如果置1則說明接到數(shù)據(jù)并且放置在接收緩存器
  110.         {
  111.            CE = 0;                
  112.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,RX_PLOAD_WIDTH); //這本來就是指令,不用加,意思說去緩存器里讀
  113.                 flag =1;                        //讀取數(shù)據(jù)完成標(biāo)志
  114.         }
  115.         SPI_Write_Reg(WRITE_REG+STATUS,sta);   //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志
  116.         return flag;
  117. }




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


  137. /***************************************************************************
  138. 函數(shù)名稱:void nRF24L01_TxPacket(unsigned char * tx_buf)
  139. 函數(shù)功能:發(fā)送 tx_buf中數(shù)據(jù)
  140. 函數(shù)備注:
  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);                          // 裝載數(shù)據(jù)  WR_TX_PLOAD本來就是指令  不用加   將數(shù)據(jù)放入發(fā)送緩存器       
  147.         CE=1;                 //置高CE,激發(fā)數(shù)據(jù)發(fā)送
  148.         Delayms(2);
  149.         Return_Flag = Check_ACK(1);
  150.         return Return_Flag;
  151. }


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


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




1發(fā)2發(fā)1.zip

309.64 KB, 下載次數(shù): 553, 下載積分: 黑幣 -5


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

頂一下


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

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

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

設(shè)置出售附件即可,不過要工程師級別才可以。
作者: 文家燕    時間: 2016-4-12 22:30
hao  zi liao
作者: cheff    時間: 2016-10-10 10:29
不錯的學(xué)習(xí)資料,謝謝樓主
作者: 滴~電子小白    時間: 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
謝謝分享,正在學(xué)習(xí)
作者: 仰望星空753521    時間: 2017-4-26 19:25
主要協(xié)議得寫對,還得穩(wěn)定,不卡死
作者: 13118302007    時間: 2017-4-27 09:52
1-1,1-2都簡單,有沒有1-3到1-6的我參考一下
作者: 獨(dú)孤俠    時間: 2017-10-1 21:36

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

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





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