新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > RF1100SE單片機C8051F310程序

        RF1100SE單片機C8051F310程序

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

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

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


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


        uchar SPI_RW(uchar byte) //用SPI讀寫一字節(jié)的數(shù)據(jù)
        {
        uchar rbyte;
        SPI0DAT=byte;
        while(!SPIF);
        rbyte=SPI0DAT;
        SPIF=0;
        return rbyte;
        }

        void SPI_WR_Strobe(uchar strobe) //寫入濾波命令
        {
        CSN_LOW;
        while (MISO);
        SPI_RW(strobe);
        while(MISO);
        CSN_HIGH;
        }


        void POWER_UP_RESET_CC1100(void) //上電復(fù)位
        {
        CSN = 1;
        delay(10);
        CSN = 0;
        delay(10);
        CSN = 1;
        delay(500);
        SPI_WR_Strobe(SRES); //復(fù)位CC1100
        }

        uchar SPI_RW_Reg(uchar reg,uchar value) //向寄存器寫一字節(jié)的數(shù)據(jù),同時返回狀態(tài)字
        {
        uchar status;
        CSN_LOW;
        while(MISO);
        SPI0DAT=reg;
        while(!SPIF);
        status=SPI0DAT;
        SPIF=0;
        SPI0DAT=value;
        while(!SPIF);
        SPIF=0;
        CSN_HIGH;
        return(status);
        }


        uchar SPI_Read_Reg(uchar reg) //從寄存器讀出一字節(jié)的數(shù)據(jù)
        {
        uchar byte;
        CSN_LOW;
        while (MISO);
        SPI0DAT=reg|READ_SINGLE ;
        while(!SPIF);
        SPIF=0;
        SPI0DAT=0x00;
        while(!SPIF);
        byte=SPI0DAT;
        SPIF=0;
        CSN_HIGH;
        return byte;
        }


        uchar SPI_Read_Buf(uchar reg,uchar *pBuf,uchar bytes) //從reg讀出bytes字節(jié)的數(shù)據(jù)
        {
        uchar status,byte_ctr;
        CSN_LOW;
        while (MISO);
        status=SPI_RW(reg|READ_BURST);
        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字節(jié)的數(shù)據(jù)
        {
        uchar status,byte_ctr;
        CSN_LOW;
        while (MISO);
        status=SPI_RW(reg|WRITE_BURST);
        for(byte_ctr=0;byte_ctr SPI_RW(pBuf[byte_ctr]);
        CSN_HIGH;
        return status;
        }

        //接收函數(shù),接收返回1表示有數(shù)據(jù)收到
        uchar RF1100CE_RxPacket(uchar *rx_buf,uchar *length)
        {
        ucharstatus[2];
        uchar packetLength;
        uchar i=(*length)*4; // 具體多少要根據(jù)datarate和length來決定

        SPI_WR_Strobe(SRX); //進入接收模式指令
        delay(10);

        while (GDO0)
        {
        delay(10);
        --i;
        if(i<1)
        return 0;
        }

        if(SPI_Read_Reg(RXBYTES+READ_BURST) & BYTES_IN_RXFIFO) //如果接的字節(jié)數(shù)不為0
        {
        packetLength = SPI_Read_Reg(RX_FIFO);//讀出第一個字節(jié),此字節(jié)為該幀數(shù)據(jù)長度
        if (packetLength <= *length) //如果所要的有效數(shù)據(jù)長度小于等于接收到的數(shù)據(jù)包的長度
        {
        SPI_Read_Buf(RX_FIFO, rx_buf, packetLength); //讀出所有接收到的數(shù)據(jù)
        *length = packetLength; //把接收數(shù)據(jù)長度的修改為當(dāng)前數(shù)據(jù)的長度

        SPI_Read_Buf(RX_FIFO, status, 2); //讀出CRC校驗位
        SPI_WR_Strobe(SFRX); //清洗接收緩沖區(qū)
        return (status[1] & CRC_OK); //如果校驗成功返回接收成功
        }
        else
        {
        *length = packetLength;
        SPI_WR_Strobe(SFRX); //清洗接收緩沖區(qū)
        return 0;
        }
        }
        else
        return 0;
        }

        //發(fā)送函數(shù)
        void RF1100CE_TxPacket(uchar *tx_buf,uchar size)
        {
        SPI_RW_Reg(TX_FIFO, size);
        SPI_RW_Buf(TX_FIFO, tx_buf, size); //寫入要發(fā)送的數(shù)據(jù)


        SPI_WR_Strobe(STX); //進入發(fā)送模式發(fā)送數(shù)據(jù)

        while (!GDO0);
        while (GDO0);

        SPI_WR_Strobe(SFTX); //清除發(fā)送緩沖寄存器
        SPI_WR_Strobe(SIDLE);//進入休眠模式
        }

        void RF1100CE_Config(void) //RF1100CE的配置函數(shù)
        {
        CSN_HIGH;//SPI復(fù)位

        SPI_RW_Reg(FSCTRL1, 0x08);//頻率合成器控制
        SPI_RW_Reg(FSCTRL0, 0x00);
        SPI_RW_Reg(FREQ2, 0x10);//頻率控制詞匯
        SPI_RW_Reg(FREQ1, 0xa7);
        SPI_RW_Reg(FREQ0, 0x62);
        SPI_RW_Reg(MDMCFG4, 0x5b);//調(diào)制器配置
        SPI_RW_Reg(MDMCFG3, 0xf8);
        SPI_RW_Reg(MDMCFG2, 0x03);
        SPI_RW_Reg(MDMCFG1, 0x22);
        SPI_RW_Reg(MDMCFG0, 0xf8);

        SPI_RW_Reg(CHANNR, 0x00);//信道數(shù)
        SPI_RW_Reg(DEVIATN, 0x47);
        SPI_RW_Reg(FREND1, 0xb6);
        SPI_RW_Reg(FREND0, 0x10);
        SPI_RW_Reg(MCSM0, 0x18);
        SPI_RW_Reg(FOCCFG, 0x1d);
        SPI_RW_Reg(BSCFG, 0x1c);
        SPI_RW_Reg(AGCTRL2, 0xc7);
        SPI_RW_Reg(AGCTRL1, 0x00);
        SPI_RW_Reg(AGCTRL0, 0xb2);

        SPI_RW_Reg(FSCAL3, 0xea);//頻率合成器校準(zhǔn)
        SPI_RW_Reg(FSCAL2, 0x2a);
        SPI_RW_Reg(FSCAL1, 0x00);
        SPI_RW_Reg(FSCAL0, 0x11);
        SPI_RW_Reg(FSTEST, 0x59);//產(chǎn)品測試
        SPI_RW_Reg(TEST2, 0x81);//不同的測試設(shè)置
        SPI_RW_Reg(TEST1, 0x35);
        SPI_RW_Reg(TEST0, 0x09);
        SPI_RW_Reg(IOCFG2, 0x0b);
        SPI_RW_Reg(IOCFG0, 0x06);//GDO輸出腳配置

        SPI_RW_Reg(PKTCTRL1, 0x04);//數(shù)據(jù)包自動控制,無地址檢測,包含兩個狀態(tài)字節(jié)
        SPI_RW_Reg(PKTCTRL0, 0x05);//開啟CC2400支持,采用可變長度數(shù)據(jù)包
        SPI_RW_Reg(ADDR, 0x00);//設(shè)置地址
        SPI_RW_Reg(PKTLEN, 0x10);//有效允許最大數(shù)據(jù)包長度16個字節(jié)

        SPI_WR_Strobe(SFRX);
        SPI_WR_Strobe(SFTX);
        SPI_WR_Strobe(SIDLE);

        }


        void SPI(void) //SPI初始化
        {
        SPI0CFG=0x40; //時鐘極性為低,即剛開始時鐘要為低電平
        SPI0CN=0x01; //0000 0001最后一位是SPI使能位 SPI工作在三線主方式
        SPI0CKR=0x2f; //SPI時鐘頻率設(shè)置為150kHz 0x6f 0x2f
        }

        void Interrupt_int(void) //中斷設(shè)定
        {
        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;

        }


        上一頁 1 2 下一頁

        關(guān)鍵詞: RF1100SE單片機C8051F31

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 张家港市| 沅陵县| 兰坪| 马龙县| 友谊县| 子长县| 安塞县| 霞浦县| 定边县| 峨山| 辽源市| 临江市| 修水县| 罗山县| 临武县| 南昌市| 汉寿县| 临澧县| 方城县| 闵行区| 泰来县| 金秀| 昆明市| 漳州市| 迁安市| 通州区| 泾川县| 柳江县| 崇文区| 弥勒县| 宿州市| 酒泉市| 汾阳市| 嵩明县| 专栏| 临邑县| 合川市| 荥经县| 阿拉尔市| 青阳县| 清丰县|