新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > nRF24L01應用程序

        nRF24L01應用程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        最近用了下nRF24L01模塊,用以前調試nRF2401的電路板子進行調試。參考了別人的程序代碼,是模擬SPI的程序。結合nRF24L01的數據手冊我對程序進行了消化理解,再做修改,結合自己的電路,調試成功了。這個是收發一體的程序。
        源程序:
        #include
        #include

        #define uint unsigned int
        #define uchar unsigned char
        //****************************************IO端口定義***************************************
        //****************************************NRF24L01端口定義***************************************
        sbit MISO=P1^2;
        sbit MOSI=P1^6;
        sbitSCK =P1^3;
        sbitCE =P1^4;
        sbitCSN=P1^5;
        sbitIRQ=P1^7;
        //************************************按鍵***************************************************
        sbitKEY1=P3^4;

        //*********************************************NRF24L01*************************************
        #define TX_ADR_WIDTH 5 // 5 uints TX address width
        #define RX_ADR_WIDTH 5 // 5 uints RX address width
        #define TX_PLOAD_WIDTH 20 // 20 uints TX payload
        #define RX_PLOAD_WIDTH 20 // 20 uints TX payload
        uchar TX_ADDRESS[TX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90};//本地地址
        uchar RX_ADDRESS[RX_ADR_WIDTH]= {0x12,0x34,0x56,0x78,0x90};//接收地址
        //***************************************NRF24L01寄存器指令*******************************************************
        #define READ_REG 0x00 // 讀寄存器指令
        #define WRITE_REG 0x20 // 寫寄存器指令
        #define RD_RX_PLOAD 0x61 // 讀取接收數據指令
        #define WR_TX_PLOAD 0xA0 // 寫待發數據指令
        #define FLUSH_TX 0xE1 // 沖洗發送 FIFO指令
        #define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令
        #define REUSE_TX_PL 0xE3 // 定義重復裝載數據指令
        #define NOP 0xFF // 保留
        //*************************************SPI(nRF24L01)寄存器地址****************************************************
        #define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
        #define EN_AA 0x01 // 自動應答功能設置
        #define EN_RXADDR 0x02 // 可用信道設置
        #define SETUP_AW 0x03 // 收發地址寬度設置
        #define SETUP_RETR 0x04 // 自動重發功能設置
        #define RF_CH 0x05 // 工作頻率設置
        #define RF_SETUP 0x06 // 發射速率、功耗功能設置
        #define STATUS 0x07 // 狀態寄存器
        #define OBSERVE_TX 0x08 // 發送監測功能
        #define CD 0x09 // 地址檢測
        #define RX_ADDR_P0 0x0A // 頻道0接收數據地址
        #define RX_ADDR_P1 0x0B // 頻道1接收數據地址
        #define RX_ADDR_P2 0x0C // 頻道2接收數據地址
        #define RX_ADDR_P3 0x0D // 頻道3接收數據地址
        #define RX_ADDR_P4 0x0E // 頻道4接收數據地址
        #define RX_ADDR_P5 0x0F // 頻道5接收數據地址
        #define TX_ADDR 0x10 // 發送地址寄存器
        #define RX_PW_P0 0x11 // 接收頻道0接收數據長度
        #define RX_PW_P1 0x12 // 接收頻道0接收數據長度
        #define RX_PW_P2 0x13 // 接收頻道0接收數據長度
        #define RX_PW_P3 0x14 // 接收頻道0接收數據長度
        #define RX_PW_P4 0x15 // 接收頻道0接收數據長度
        #define RX_PW_P5 0x16 // 接收頻道0接收數據長度
        #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
        //**************************************************************************************
        void Delay(unsigned int s);
        void inerDelay_us(unsigned char n);
        void init_NRF24L01(void);
        uchar SPI_RW(uchar byte);
        uchar SPI_Read(uchar reg);
        void SetRX_Mode(void);
        uchar SPI_RW_Reg(uchar reg, uchar value);
        uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar num);
        uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar num);
        unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);
        void nRF24L01_TxPacket(unsigned char * tx_buf);
        void delayms(unsigned int count);
        //*****************************************長延時*****************************************
        void Delay(unsigned int s)
        {
        unsigned int i;
        for(i=0; ifor(i=0; i}
        //******************************************************************************************
        uchar sta; //狀態標志
        #defineRX_DR(sta & 0x40)
        #defineTX_DS(sta & 0x20)
        #defineMAX_RT(sta & 0x10)
        //***********毫秒延時程序********************/
        void delayms(unsigned int count)
        {
        unsigned int i,j;
        for(i=0;ifor(j=0;j<120;j++);
        }
        //****************************************************************************************
        //NRF24L01初始化
        void init_NRF24L01(void)
        {
        delayms(1);
        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, 0x01); // 頻道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 + RX_PW_P0, RX_PLOAD_WIDTH); //設置接收數據長度,本次設置為32字節
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //設置發射速率為1MHZ,發射功率為最大值0dB
        }
        //***************************************************************************************************
        //函數:uint SPI_RW(uint uchar)
        //功能:NRF24L01的SPI寫時序
        //***************************************************************************************************/
        uchar SPI_RW(uchar byte)
        {
        uchar i;
        for(i=0;i<8;i++) // output 8-bit
        {
        MOSI = (byte & 0x80); // output uchar, MSB to MOSI
        byte = (byte << 1); // shift next bit into MSB..
        SCK = 1; // Set SCK high..
        byte |= MISO; // capture current MISO bit
        SCK = 0; // ..then set SCK low again
        }
        return(byte); // return read uchar
        }
        //***************************************************************************************************
        //函數:uchar SPI_Read(uchar reg)
        //功能:NRF24L01的SPI時序
        /****************************************************************************************************/
        uchar SPI_Read(uchar reg)
        {
        uchar reg_val;

        CSN = 0; // CSN low, initialize SPI communication...
        SPI_RW(reg); // Select register to read from..
        reg_val = SPI_RW(0); // ..then read registervalue
        CSN = 1; // CSN high, terminate SPI communication

        return(reg_val); // return register value
        }
        //***************************************************************************************************/
        //功能:NRF24L01讀寫寄存器函數
        //***************************************************************************************************/
        uchar SPI_RW_Reg(uchar reg, uchar value)
        {
        uchar status;

        CSN = 0; // CSN low, init SPI transaction
        status = SPI_RW(reg); // select register
        SPI_RW(value); // ..and write value to it..
        CSN = 1; // CSN high again

        return(status); // return nRF24L01 status uchar
        }
        //***************************************************************************************************/
        //函數:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
        //功能: 用于讀數據,reg:為寄存器地址,pBuf:為待讀出數據地址,uchars:讀出數據的個數
        //***************************************************************************************************/
        uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar num)
        {
        uchar status,i;

        CSN = 0; // Set CSN low, init SPI tranaction
        status = SPI_RW(reg); // Select register to write to and read status uchar

        for(i=0;ipBuf[i] = SPI_RW(0); //

        CSN = 1;

        return(status); // return nRF24L01 status uchar
        }
        //********************************************************************************************************
        //函數:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
        //功能: 用于寫數據:為寄存器地址,pBuf:為待寫入數據地址,uchars:寫入數據的個數
        //********************************************************************************************************/
        uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar num)
        {
        uchar status,i;

        CSN = 0; //SPI使能
        status = SPI_RW(reg);
        for(i=0; iSPI_RW(*pBuf++);
        CSN = 1; //關閉SPI
        return(status); //
        }
        //***************************************************************************************************/
        //函數:void SetRX_Mode(void)
        //功能:數據接收配置
        //***************************************************************************************************/
        void SetRX_Mode(void)
        {
        CE=0;
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收發完成中斷響應,16位CRC,主接收
        CE = 1;
        delayms(1);
        }
        //*****************************************************************************************************/
        //函數:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
        //功能:數據讀取后放如rx_buf接收緩沖區中
        /******************************************************************************************************/
        unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
        {
        unsigned char 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
        revale =1;//讀取數據完成標志
        }
        SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數據后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清除中斷標志
        return revale;
        }
        //**********************************************************************************************************
        //函數:void nRF24L01_TxPacket(unsigned char * tx_buf)
        //功能:發送 tx_buf中數據
        //*********************************************************************************************************/
        void nRF24L01_TxPacket(unsigned char * 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,激發數據發送
        delayms(1);
        }
        //************************************主函數************************************************************
        void main(void)
        {
        unsigned char TxBuf[20]={0}; //
        unsigned char RxBuf[20]={0};
        unsigned char led_num;
        delayms(100);
        init_NRF24L01() ;
        TxBuf[1] = 0x55 ;
        nRF24L01_TxPacket(TxBuf);// Transmit Tx buffer data
        Delay(6000);
        led_num=0x00;
        while(1)
        {
        if(KEY1 ==0 )
        {
        led_num++;
        TxBuf[1] =led_num ;
        nRF24L01_TxPacket(TxBuf);// Transmit Tx buffer data
        P0=~led_num;
        Delay(5000);
        }

        //***********************************************************************************************
        SetRX_Mode(); // 每次開始發送 然后無按鍵直接跳轉到接收 一直循環。
        nRF24L01_RxPacket(RxBuf);
        if(RX_DR==0) P0=~RxBuf[1];

        }

        }


        關鍵詞: nRF24L01應用程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 阿拉善盟| 封开县| 岳普湖县| 安乡县| 浪卡子县| 石首市| 遵义市| 山东| 新昌县| 安阳市| 裕民县| 昌平区| 鄂托克旗| 兰坪| 视频| 中宁县| 武山县| 尖扎县| 岳池县| 苍梧县| 九江县| 舟曲县| 弥勒县| 西平县| 承德县| 康乐县| 永安市| 凤冈县| 灵寿县| 达州市| 天镇县| 弋阳县| 华池县| 临城县| 库伦旗| 张家港市| 德化县| 永春县| 沁阳市| 黄冈市| 阳新县|