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

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

STM8學習之nRF24L01

作者:佚名   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年08月20日   【字體:

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

收發(fā)過程:
發(fā)送 - 等待應(yīng)答 - (自動重發(fā))- 產(chǎn)生中斷
接收 - 等待應(yīng)答 - 產(chǎn)生中斷
取消等待應(yīng)答便可以實現(xiàn)單獨調(diào)試發(fā)送方了,等發(fā)送方調(diào)試成功再調(diào)接收方。

SPI模擬函數(shù):
 
u8 SPI_RW(u8 byte)
{       
        u8 i;
        for(i=0;i < 8;i++)
        {
                if((byte & 0x80) == 0)   //數(shù)據(jù)從最高位一位一位地輸出到nRF24L01的MOSI
                {       MOSI = 0;       }
                else
                {       MOSI = 1;       }
                
                byte = (byte << 1);      //向左循環(huán)8次,完成從高位輸出,低位輸入一個字節(jié)的同步模擬         
                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置低,開始傳輸數(shù)據(jù)
status = SPI_RW(reg);  // 選擇寄存器,同時返回狀態(tài)字
SPI_RW(value);            // 然后寫數(shù)據(jù)到該寄存器
CSN = 1;                    // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(status);             // 返回狀態(tài)寄存器
}
 
u8 SPI_Read(u8 reg)
{
u8 reg_val;
CSN = 0;                     // CSN置低,開始傳輸數(shù)據(jù)
SPI_RW(reg);               // 選擇寄存器
reg_val = SPI_RW(0);    // 然后從該寄存器讀數(shù)據(jù)
CSN = 1;                     // CSN拉高,結(jié)束數(shù)據(jù)傳輸
return(reg_val);            // 返回寄存器數(shù)據(jù)
}

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

// 接受數(shù)據(jù)函數(shù)
u8 RxPacket(u8* rx_buf)
{
        u8 revale=0;
sta = SPI_Read(STATUS); // 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況
if(RX_DR)         // 判斷是否接收到數(shù)據(jù)
{
                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; // 讀取數(shù)據(jù)完成標志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta);   // 接收到數(shù)據(jù)后RX_DR置高,寫1清中斷標志,同時清除RX FIFOS?
        //SPI_RW_Reg(FLUSH_RX, 0Xff);
return revale; // 是否接受到數(shù)據(jù)的標志位
}
 
// 發(fā)送數(shù)據(jù)函數(shù)
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);             // 裝載數(shù)據(jù)
//SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);    // IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送
CE=1;                                             //置高CE,激發(fā)數(shù)據(jù)發(fā)送
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應(yīng)答允許 
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  // 允許接收地址只有頻道0,如果需要多頻道可以參考Page21  
SPI_RW_Reg(WRITE_REG + RF_CH, 0);                // 設(shè)置信道工作為2.4GHZ,收發(fā)必須一致      
//SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00); // disable the retr  (TX mode)
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); // 設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);   // 設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0X0F);     // 0x0f for RX (0x0e for TX mode)
delay_ms(1);
}
 
第一步:
寄存器的讀寫操作。寫進(如CONFIG)一個值,然后讀出,可以檢查nRF24L01是否正常,引腳配置與連接是否正確,SPI模擬時序函數(shù)是否可用等。
第二步:
然后再只調(diào)發(fā)送端。把自動應(yīng)答關(guān)閉。
SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自動應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X00);  //無接收通道
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0X00);  //取消自動重發(fā)功能
第三步:
最后調(diào)接收端,同樣先把自動應(yīng)答關(guān)閉。
SPI_RW_Reg(WRITE_REG + EN_AA, 0X00); //取消通道0自動應(yīng)答
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0X01);  //使能接收通道0
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产成人a亚洲精品 | 美女一区 | 欧美啪啪 | 久久久99国产精品免费 | 在线视频中文字幕 | www成人免费视频 | 一区二区免费在线观看 | 国产三级 | 天堂亚洲 | 免费看黄色小视频 | 国产精品视频一区二区三区四区国 | av网站在线播放 | 日本亚洲欧美 | 一区二区三区四区视频 | 国产精品网址 | 久久久久久久av | 精品久久久久国产免费第一页 | 欧美性网 | 欧美午夜精品久久久久久浪潮 | 久久合久久 | 国产精品免费一区二区三区 | 国产成人在线播放 | 国产电影一区二区三区爱妃记 | 亚洲免费一区二区 | 日韩精品极品视频在线观看免费 | 日韩视频免费看 | 91精品亚洲 | re久久| 国产精品久久久久久婷婷天堂 | 在线视频一区二区三区 | 久久久久久中文字幕 | 91视频在线| 久久爆操 | 中文字幕日韩一区 | av一区二区在线观看 | 免费黄色a视频 | 免费久久精品 | 久精品久久 | 亚洲国产精品人人爽夜夜爽 | a亚洲精品 | 中文字幕在线视频精品 |