1. <th id="uou7b"></th>
        2. <tbody id="uou7b"></tbody>
          <tbody id="uou7b"></tbody>
        3. <span id="uou7b"></span>

          <tbody id="uou7b"></tbody>
          <em id="uou7b"></em>

          專注電子技術學習與研究
          當前位置:單片機教程網 >> STM32 >> 瀏覽文章

          STM8學習之nRF24L01

          作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月20日   【字體:

          nRF24L01是收發雙方都要編程的,同時調試一旦出錯,不易判斷哪方出錯,所以可以采用分開調試。

          收發過程:
          發送 - 等待應答 - (自動重發)- 產生中斷
          接收 - 等待應答 - 產生中斷
          取消等待應答便可以實現單獨調試發送方了,等發送方調試成功再調接收方。

          SPI模擬函數:
           
          u8 SPI_RW(u8 byte)
          {       
                  u8 i;
                  for(i=0;i < 8;i++)
                  {
                          if((byte & 0x80) == 0)   //數據從最高位一位一位地輸出到nRF24L01的MOSI
                          {       MOSI = 0;       }
                          else
                          {       MOSI = 1;       }
                          
                          byte = (byte << 1);      //向左循環8次,完成從高位輸出,低位輸入一個字節的同步模擬         
                          SCK = 1;   //上升沿輸入nRF24L01的MOSI
                          
                          if(MISO == 1)
                          {       byte |= 1;      }
                          else
                          {       byte |= 0;      }     //可以不寫,沒有實際作用,方便查看與理解
                          SCK = 0;                     //下降沿輸入單片機MISO
                  }
                  return (byte);
                  
          }
           
          u8 SPI_RW_Reg(u8 reg, u8 value)
          {
          u8 status;
                  CSN = 0;                    // CSN置低,開始傳輸數據
          status = SPI_RW(reg);  // 選擇寄存器,同時返回狀態字
          SPI_RW(value);            // 然后寫數據到該寄存器
          CSN = 1;                    // CSN拉高,結束數據傳輸
          return(status);             // 返回狀態寄存器
          }
           
          u8 SPI_Read(u8 reg)
          {
          u8 reg_val;
          CSN = 0;                     // CSN置低,開始傳輸數據
          SPI_RW(reg);               // 選擇寄存器
          reg_val = SPI_RW(0);    // 然后從該寄存器讀數據
          CSN = 1;                     // CSN拉高,結束數據傳輸
          return(reg_val);            // 返回寄存器數據
          }

           
          u8 SPI_Read_Buf(u8 reg, u8 *pBuf, u8 bytes)
          {
          u8 status, i;
          CSN = 0;                    // CSN置低,開始傳輸數據
          status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
          for(i=0; i
              pBuf[i] = SPI_RW(0);    // 逐個字節從nRF24L01讀出
          CSN = 1;                    // CSN拉高,結束數據傳輸
          return(status);             // 返回狀態寄存器
          }
           
          u8 SPI_Write_Buf(u8 reg, u8 *pBuf, u8 bytes)
          {
          u8 status, i;
          CSN = 0;                    // CSN置低,開始傳輸數據
          status = SPI_RW(reg);       // 選擇寄存器,同時返回狀態字
          delay_us(10);
          for(i=0; i
          SPI_RW(*pBuf++);        // 逐個字節寫入nRF24L01
          CSN = 1;                    // CSN拉高,結束數據傳輸
          return(status);             // 返回狀態寄存器
          }
           
          void SetRX_Mode(void)
          {
          //CE=0; //可以不進行拉低操作,考慮此時的效率
          //SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);  // IRQ收發完成中斷響應,16位CRC ,主接收
                  CE = 1;             // 從Standby I模式進入RX模式,開始接受數據
          delay_us(1500); // 需要一定的延時,具體時間等待驗證(手冊上寫的是130us)
          }

          // 接受數據函數
          u8 RxPacket(u8* rx_buf)
          {
                  u8 revale=0;
          sta = SPI_Read(STATUS); // 讀取狀態寄存其來判斷數據接收狀況
          if(RX_DR)         // 判斷是否接收到數據
          {
                          CE = 0; // SPI使能
          SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH); // read receive payload from RX_FIFO buffer
                          //SPI_RW_Reg(FLUSH_RX, 0Xff);
          revale =1; // 讀取數據完成標志
          }
          SPI_RW_Reg(WRITE_REG+STATUS,sta);   // 接收到數據后RX_DR置高,寫1清中斷標志,同時清除RX FIFOS?
                  //SPI_RW_Reg(FLUSH_RX, 0Xff);
          return revale; // 是否接受到數據的標志位
          }
           
          // 發送數據函數
          void TxPacket(u8* tx_buf)
          {
          CE=0;                                      //StandBy I模式
          SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 裝載接收端地址
          SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);             // 裝載數據
          //SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);    // IRQ收發完成中斷響應,16位CRC,主發送
          CE=1;                                             //置高CE,激發數據發送
          delay_us(1000);                                              //延時時間待最小確定,是否是130us?
          }
           
          // 初始化TX or RX Mode
          void init_nRF(void)
          {
          delay_us(1000);
          CE=0;      // chip enable
          CSN=1;   // Spi disable 
          SCK=0;   // Spi clock line init high
          SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);      // 寫本地地址
          SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 寫接收端地址
          SPI_RW_Reg(WRITE_REG + EN_AA, 0x00);           // 頻道0自動 ACK應答允許 
          SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21  
          SPI_RW_Reg(WRITE_REG + RF_CH, 0);                // 設置信道工作為2.4GHZ,收發必須一致      
          //SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00); // disable the retr  (TX mode)
          SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // 設置接收數據長度,本次設置為32字節
          SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // 設置發射速率為1MHZ,發射功率為最大值0dB
          SPI_RW_Reg(WRITE_REG + CONFIG, 0X0F);     // 0x0f for RX (0x0e for TX mode)
          delay_ms(1);
          }
           
          第一步:
          寄存器的讀寫操作。寫進(如CONFIG)一個值,然后讀出,可以檢查nRF24L01是否正常,引腳配置與連接是否正確,SPI模擬時序函數是否可用等。
          第二步:
          然后再只調發送端。把自動應答關閉。
          SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自動應答
          SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X00);  //無接收通道
          SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00);  //取消自動重發功能
          第三步:
          最后調接收端,同樣先把自動應答關閉。
          SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自動應答
          SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X01);  //使能接收通道0
          關閉窗口

          相關文章

          日日噜噜夜夜狠狠久久无码区

              1. <th id="uou7b"></th>
              2. <tbody id="uou7b"></tbody>
                <tbody id="uou7b"></tbody>
              3. <span id="uou7b"></span>

                <tbody id="uou7b"></tbody>
                <em id="uou7b"></em>