新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > C8051F的nRF24L01 PTR6000無線收發(fā)

        C8051F的nRF24L01 PTR6000無線收發(fā)

        作者: 時間:2016-11-30 來源:網(wǎng)絡 收藏

        //接收函數(shù),接收返回1表示有數(shù)據(jù)收到
        uchar nRF24L01_RxPacket(uchar *rx_buf)
        {
        uchar sta;
        uchar revale=0;
        SPI_RW_Reg(WRITE_REG+CONFIG,0X0F);
        SPI_RW_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//定義接收通道號

        本文引用地址:http://www.104case.com/article/201611/324033.htm

        CE_HIGH; //開始接收數(shù)據(jù)
        delay(130);

        sta=SPI_Read(READ_REG+STATUS);//接收狀態(tài)寄存器,用于判斷是否收到數(shù)據(jù)
        if(sta&0x40)
        {
        CE_LOW; //結束接收數(shù)據(jù)
        SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
        revale=0xff;
        }

        SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收復位
        return revale;
        }


        void nRF24L01_TxPacket(uchar *tx_buf) //發(fā)送函數(shù)
        {
        CE_LOW;

        SPI_RW_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //給發(fā)送寄存器寫入地址,寬度為TX_ADR_WIDTH

        SPI_RW_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//給接收寄存器寫入地址,寬度也為TX_ADR_WIDTH
        SPI_Read_Buf(RX_ADDR_P0,rx_buf,TX_ADR_WIDTH);

        SPI_RW_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH); //向發(fā)送寄存器寫入TX_PLOAD_WIDTH寬度的數(shù)據(jù),

        SPI_RW_Reg(WRITE_REG+CONFIG,0X0E); //配置為PWR_UP位,使能CRC,16位校驗,發(fā)送模式

        CE_HIGH;
        delay(100);
        CE_LOW;

        }

        void nRF24L01_Config() //nRF24L01的配置函數(shù)
        {
        CE_LOW;//芯片使能
        CSN_HIGH;//SPI復位

        SPI_RW_Reg(WRITE_REG+CONFIG,0X0F); //使能接收模式
        SPI_Read(CONFIG);
        SPI_RW_Reg(WRITE_REG+EN_AA,0X01);//數(shù)據(jù)通道0自動應答
        SPI_Read(EN_AA);
        SPI_RW_Reg(WRITE_REG+EN_RXADDR,0X01); //通道0允許
        SPI_RW_Reg(WRITE_REG+SETUP_AW,0X02); //設置地址寬度為4字節(jié)
        SPI_RW_Reg(WRITE_REG+SETUP_RETR,0X1A);//建立自動重發(fā),500+86us,10次重發(fā)
        SPI_RW_Reg(WRITE_REG+RF_CH,0x02);//設置工作通道頻率
        SPI_RW_Reg(WRITE_REG+RF_SETUP,0X07);//設置工作通道傳輸速率為1Mbps,發(fā)射功率為0dBm
        SPI_RW_Reg(WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//設置通道0有效數(shù)據(jù)寬度RX_PLOAD_WIDTH

        }


        void SPI(void) //SPI初始化
        {
        SPI0CFG=0x40;
        SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三線主方式
        SPI0CKR=0x2f; //SPI時鐘頻率設置為150kHz 0x6f 0x2f
        }

        void Interrupt_int(void) //中斷設定
        {
        IE=0x40; //允許SPI中斷請求
        IP=0x00; //SPI為低優(yōu)先級
        }

        void pio(void) // 端口配置
        {
        P0MDIN=0xff; //禁止模擬輸入,0為模擬,1為數(shù)字
        P0MDOUT=0xff; //0為開漏,1為推挽(ff)
        P0SKIP=0x00;

        P1MDIN=0xff;
        P1MDOUT=0xff; //低四位用于138


        P2MDIN=0xff; //禁止模擬輸入,0為模擬,1為數(shù)字
        P2MDOUT=0xff; //0為開漏,1為推挽(ff)

        P3MDIN=0xff;
        P3MDOUT=0xff; //低四位用于138

        XBR0=0x02;
        XBR1=0x40;

        //P0=0xff;
        }

        void sysclk(void);
        void pio(void);
        void SPI(void);
        void Interrupt_int(void);
        void delay(uint i);
        void dat_int(void);

        void main(void) //主程序
        {
        PCA0MD &= ~0x40;// 關閉看門狗
        pio();
        sysclk();
        SPI(); //SPI0DAT是SPI的數(shù)據(jù)寄存器
        Interrupt_int();
        EA=0;
        dat_int();
        nRF24L01_Config(); //nRF24L01的配置函數(shù)


        while(1)
        {
        //nRF24L01_TxPacket(tx_buf);

        nRF24L01_RxPacket(rx_buf);
        sta=SPI_Read(READ_REG+FIFO_STATUS);
        P1=rx_buf[2];

        delay(10000);
        if(rx_buf[2]==0xc7)break;
        }
        while(1)
        {
        nRF24L01_TxPacket(tx_buf); //發(fā)送函數(shù)

        sta=SPI_Read(READ_REG+STATUS); //發(fā)送程序復位
        if(sta&0x20)
        {
        c=1;
        SPI_RW_Reg(WRITE_REG+STATUS,sta);

        CSN_LOW; //清除發(fā)送寄存器的值
        SPI_RW(FLUSH_TX);
        CSN_HIGH;
        }

        delay(10000);
        }
        }


        上一頁 1 2 3 下一頁

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 和顺县| 通化市| 蒙城县| 棋牌| 兴山县| 岱山县| 集安市| 昌宁县| 曲松县| 井冈山市| 五家渠市| 石林| 福安市| 江安县| 灵武市| 锦州市| 磴口县| 准格尔旗| 尚义县| 桑日县| 大冶市| 宜兴市| 泽库县| 潞城市| 略阳县| 四会市| 东乌珠穆沁旗| 宝丰县| 浦县| 林口县| 丹巴县| 泽普县| 友谊县| 衡东县| 个旧市| 维西| 宁夏| 珲春市| 连城县| 吉安市| 淅川县|