新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C8051F的nRF24L01 PTR6000無線收發

        C8051F的nRF24L01 PTR6000無線收發

        作者: 時間:2016-11-30 來源:網絡 收藏



        /************************發送部分*********************/

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

        #include
        #include
        #include
        #include
        #include

        #define uint unsigned int
        #define uchar unsigned char

        //nRF24L01的數據寬度,地址寬度,以及數據定義
        #define TX_ADR_WIDTH 4 //地址數據
        #define RX_PLOAD_WIDTH 4 //接收的有效數據寬度
        #define TX_PLOAD_WIDTH 4 //發送的有效數據寬度
        #define BUSY SPI0CFG&0x80


        uchar TX_ADDRESS[]={0xe7,0xe7,0xe7,0xe7}; //傳送接收端地址
        uchar shuzu[4]={0x99,0x99,0xc7,0x99}; //要發送的有效數據
        uchar rx_buf[4]={0x00,0x00,0x00,0x00}; //接收的數據緩存
        uchar a,b,i;
        ucharsta;

        //引腳定義2274
        #define CSN_HIGH CSN=1
        #define CSN_LOW CSN=0
        #define CE_HIGH CE=1
        #define CE_LOW CE=0

        sbit CE=P0^5;
        sbit CSN=P0^6;
        sbit IRQ=P0^4;
        sbit c=P0^7;

        //24L01寄存器地址
        #define CONFIG 0X00//配置寄存器地址
        #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
        #define RX_ADDR_P2 0X0C
        #define RX_ADDR_P3 0X0D
        #define RX_ADDR_P4 0X0E
        #define RX_ADDR_P5 0X0F
        #define TX_ADDR 0X10//發送地址寄存器地址
        #define RX_PW_P0 0X11//接收地址通道0有效數據寬度
        #define RX_PW_P1 0X12
        #define RX_PW_P2 0X13
        #define RX_PW_P3 0X14
        #define RX_PW_P4 0X15
        #define RX_PW_P5 0X16
        #define FIFO_STATUS 0X17//FIFO狀態寄存器
        //SPI命令字
        #define READ_REG 0X00//讀寄存器命令
        #define WRITE_REG 0X20//寫寄存器命令
        #define RD_RX_PLOAD 0X61//讀有效數據命令
        #define WR_TX_PLOAD 0XA0//寫有效數據命令
        #define FLUSH_TX 0XE1//清除TX_FIFO應用于發射模式
        #define FLUSH_RX 0XE2//清除RX_FIFO應用于接收模式
        #define REUSE_TX_PL 0XE3//重新使用上一包有效數據
        #define NOP 0XFF//空操作指令

        void dat_int(void)
        {
        CSN_HIGH;
        CE_LOW;
        a=0;
        c=0;
        }


        void sysclk(void) //內部晶振
        {
        OSCICL=0xb3; // 0x83
        OSCICN=0xc2; //二分頻
        CLKSEL=0x00;
        }

        //延時子函數us
        void delay(uint i)
        {
        while(i--)
        ;
        }

        uchar SPI_RW(uchar byte) //用SPI讀寫一字節的數據
        {
        uchar rbyte;

        SPI0DAT=byte;
        while(!SPIF);
        rbyte=SPI0DAT;
        SPIF=0;
        delay(15);
        return rbyte;
        }


        uchar SPI_RW_Reg(uchar reg,uchar value) //向寄存器寫一字節的數據,同時返回狀態字
        {
        uchar status;
        CSN_LOW;
        SPI0DAT=reg;
        while(!SPIF);
        delay(20);
        status=SPI0DAT;
        SPIF=0;
        SPI0DAT=value;
        while(!SPIF);
        SPIF=0;
        CSN_HIGH;
        return(status);
        }


        uchar SPI_Read(uchar reg) //從寄存器讀出一字節的數據
        {
        uchar byte;
        CSN_LOW;
        SPI0DAT=reg;
        while(!SPIF);
        delay(20);
        SPI0DAT=0x00;
        SPIF=0;
        while(!SPIF);
        byte=SPI0DAT;
        SPIF=0;
        CSN_HIGH;
        return byte;
        }


        uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes) //從reg讀出bytes字節的數據
        {
        uchar status,byte_ctr;
        CSN_LOW;

        status=SPI_RW(reg);
        for(byte_ctr=0;byte_ctr pBuf[byte_ctr]=SPI_RW(0);

        CSN_HIGH;
        return status;
        }


        uchar SPI_RW_Buf(uchar reg,uchar *pBuf,uchar bytes) //向reg寫入bytes字節的數據
        {
        uchar status,byte_ctr;
        CSN_LOW;

        status=SPI_RW(reg);
        for(byte_ctr=0;byte_ctr SPI_RW(pBuf[byte_ctr]);

        CSN_HIGH;
        returnstatus;
        }

        //接收函數,接收返回1表示有數據收到
        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);//定義接收通道號

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

        sta=SPI_Read(READ_REG+STATUS);//接收狀態寄存器,用于判斷是否收到數據
        if(sta&0x40)
        {
        CE_LOW; //結束接收數據
        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) //發送函數
        {
        CE_LOW;

        SPI_RW_Buf(WRITE_REG+TX_ADDR,TX_ADDRESS,TX_ADR_WIDTH); //給發送寄存器寫入地址,寬度為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); //向發送寄存器寫入TX_PLOAD_WIDTH寬度的數據,

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

        CE_HIGH;
        delay(100);
        CE_LOW;

        }


        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 公安县| 宁南县| 黄骅市| 仁化县| 南召县| 教育| 通城县| 通化县| 德庆县| 安宁市| 玉田县| 鄂尔多斯市| 荥经县| 晋宁县| 渝中区| 开阳县| 新田县| 资中县| 宁化县| 京山县| 晋城| 营口市| 蒲城县| 江津市| 康平县| 莎车县| 枣庄市| 甘泉县| 新沂市| 黑水县| 迁西县| 宁陵县| 昌吉市| 瓦房店市| 西林县| 黄陵县| 台东县| 塔河县| 龙岩市| 商城县| 渑池县|