在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > msp430與A7105實(shí)現(xiàn)單工通信

            msp430與A7105實(shí)現(xiàn)單工通信

            作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
            A7105是一款性價比不錯的RF。單個人認(rèn)為它的實(shí)現(xiàn)比較麻煩,好在還有手冊,有參考程序,總算是實(shí)現(xiàn)了,現(xiàn)在拿來與大家分享一下。

            先說一下大致流程:

            本文引用地址:http://www.biyoush.com/article/201611/316463.htm

            Master端:
            1)timer=0ms 發(fā)送數(shù)據(jù)(采用調(diào)頻發(fā)送)

            Slaver端:

            2)timer=2ms接收數(shù)據(jù),并送給PC

            程序代碼:

            //===================================================================================

            //data.h 文件

            //功能:常量與全局變量定義

            //代碼:

            //=========================================================
            //常量定義
            #define uint unsigned int
            #define SCS BIT7
            #define SCK BIT6
            #define SDIO BIT5
            #define GPIO1 BIT1
            #define GPIO2 BIT0
            #define maslv 0
            #define MODE_REG 0x00
            #define IDCODE_REG 0x06
            #define PLL1_REG 0x0F
            #define FIFO_REG 0x05
            #define VCOCAL1_REG 0x25
            #define CALIBRATION_REG 0x22
            #define VCOCCAL_REG 0x24
            #define VCOCAL2_REG 0x26
            #define VCOCAL1_REG 0x25
            #define CMD_STBY 0xA0
            #define CMD_TX 0xD0
            #define CMD_RX 0xC0
            #define CMD_PLL 0xB0
            //==============================================================

            //===================================================================
            uint Seq;//實(shí)現(xiàn)調(diào)頻的變量
            uint RxCnt;//計數(shù)
            uint tmpbuf[64]={0};
            uint timer;


            //====================================================================


            //============================================================
            //RF初始設(shè)定

            const uint A7105Config[]=
            {
            0x00, // reset register,onlyreset,not use no config

            0x42,//mode register

            0x00,//Calibratin register,only read,not use no config

            0x3F,//FIFo1 register

            0x00,//FIFO2 register

            0x00,//FIFO register

            0x00,//IDDATA register

            0x00,//rcosc1 register

            0x00,//rcosc2 register

            0x00,//rcosc3 register

            0x00,//cko register

            0x01,//gpio1 register

            0x21,//gpio2 register

            0x05,//clock register

            0x00,//datarate register

            0x50,//pll1 register

            0x9E,//pll2 register

            0x4B,//pll3 register

            0x00,//pll4 register

            0x02,//pll5 register

            0x16,//tx1 register

            0x2B,//tx2 register

            0x12,//delay1 register

            0x00,//delay2 register

            0x62,//rx register

            0x80,//rxgain1 register

            0x80,//rxgain2 register

            0x00,//rxgain3 register

            0x0A,//rxgain4 register

            0x32,//rssi register

            0xC3,//ADC register

            0x07,//code1 register

            0x16,//code2 register

            0x00,//code3 register

            0x00,//ifcal1 register

            0x00,//ifcal2 register, only read

            0x00,//vcoccal register

            0x00,//vcocal1 register

            0x3B,//vcocal2 register

            0x00,//battery register

            0x17,//txtest register

            0x47,//rxdem1 register

            0x80,//rxdem2 register

            0x03,//cpc register

            0x01,//crystal register

            0x45,//plltest register

            0x18,//vcotest1 register

            0x00,//vcotest2 register

            0x01,//ifat register

            0x0F,//rscale register

            0x00 //filtertest



            };
            //=============================================================

            //=============================================================
            const uint ID_Tab[4]={0x54,0x75,0xC5,0x2A};//ID code
            //============================================================

            //============================================================
            const uint PN9_Tab[]={
            0x00,0x83,0xDF,0x17,0x32,0x09,0x4E,0xD1,
            0xE7,0xCD,0x8A,0x91,0xC6,0xD5,0xC4,0xC4,
            0x40,0x21,0x18,0x4E,0x55,0x86,0xF4,0xDC,
            0x8A,0x15,0xA7,0xEc,0x92,0xDF,0x93,0x53,
            0x30,0x18,0xCA,0x43,0xBF,0xA2,0xC7,0x59,
            0x67,0x8F,0xBA,0x0D,0x6D,0xD8,0x2D,0x7D,
            0x54,0x0A,0x57,0x97,0x70,0x39,0xD2,0x7A,
            0xEa,0x24,0x33,0x85,0xED,0x9A,0x1D,0xE0


            };//Tish table are 64bytes PN9 pseduorandom code
            //===================================================================

            //==================================================================
            //自由定義的調(diào)頻值
            uint HopTab[]=
            {
            20,//2410
            40,//2420
            80,//2440
            120,//2460
            160,//2480
            };
            //===================================================================

            //==========================================================

            //fuction.c 文件

            //功能:函數(shù)聲明

            //代碼:

            //=====================================================
            //函數(shù)聲明
            void A7105_Reset(void);
            void A7105_WriteReg(uint,uint);
            uint A7105_ReadReg(uint);
            void ByteSend(uint src);
            uint ByteRead(void);
            void A7105_WriteID(void);
            void A7105_WriteFIFO(void);

            void A7105_Config(void);
            void A7105_Cal(void);
            void RxPacket(void);
            void StrobeCmd(uint);
            void SetCH(uint);
            void WaitBit_0(uint,uint);
            void SelVCOBand(uint,uint);
            void initRF(void);
            void Init_Clk(void);
            void Init_Timer(void);
            void init_IO(void);
            void init_uart(void);

            //================================================================


            //====================================================================

            //stdio.c 文件

            //功能:初始化,及功能函數(shù)

            //代碼:

            //=======================================================================
            //delays,延時函數(shù)
            void delays(unsigned int z)
            {
            unsigned int a;
            for(a=0;a }
            //========================================================================
            //指示燈
            //說明,主板燈亮,從不亮
            void init_zhishi(uint src)
            {
            P4DIR=0X04;
            if(src)
            P4OUT |=0X04;
            else
            P4OUT &=0X00;
            }
            //===============================================================================

            //============================================================================
            //uart,串口通信
            void init_uart(void)
            {
            UCTL0=SWRST;
            UTCTL0=SSEL0;
            //在1MHZ下進(jìn)行2400波特率通信
            //波特調(diào)整
            UBR00 = 0x0D;
            UBR10 = 0x00;
            UMCTL0 = 0x6B;
            UCTL0 |=CHAR;
            ME1 |=UTXE0 +URXE0;

            P3SEL |=0x30;
            P3DIR |=0x10;
            UCTL0 &= ~SWRST; //初始化
            IE1 |=URXIE0;
            do
            {
            IFG1 &=~OFIFG;
            delays(5000);
            }

            while(IFG1 & OFIFG !=0);
            }
            //=============================================================================
            //I/O初始化
            void init_IO(void)
            {
            P2DIR |=SCS |SCK | SDIO;
            P2DIR &=~GPIO1;
            P2DIR &=~GPIO2;
            }
            //=================================================================
            //===================================================================
            // 時鐘模塊晶振初始化
            voidInit_Clk()
            {
            inti;
            do
            {
            BCSCTL1&=~XT2OFF;//turn on XT2
            IFG1&=~OFIFG;//high frequency crystal is stable
            for(i=0; i < 2000; i++)
            {}
            }while((IFG1 & OFIFG) !=0);

            //MClk=6M / 1=6M ;
            //SMClk=6M / 8=750K
            BCSCTL2|=SELM_2 + DIVM_0 + SELS + DIVS_3;
            }
            //===================================================================

            //====================================================================
            void Init_Timer()
            {
            TACTL=TBSSEL_2+MC_1+TACLR;
            TACCTL0=CCIE;
            TACCR0=750;

            }
            void init_uartRX()
            { uint i;
            for(i=0;i<64;i++)
            {
            while(!(IFG1 & UTXIFG0));
            TXBUF0 =tmpbuf[i];
            while(!(IFG1 & UTXIFG0));
            TXBUF0=n;
            delays(50000);
            }

            }

            //==============================================================
            //功能,Reset_RF
            void A7105_Reset(void)
            {
            A7105_WriteReg(MODE_REG,0x00);
            }
            //=============================================================
            //=============================================================
            //功能,WriteID,并檢測
            void A7105_WriteID(void)
            {
            uint i;
            uint d1,d2,d3,d4;
            uint addr;
            addr=IDCODE_REG;//send adress 0x60
            P2OUT &=~SCS;
            ByteSend(addr);
            for(i=0;i<4;i++)
            ByteSend(ID_Tab[i]);
            P2OUT |=SCS;
            //FOR CHECK
            addr=IDCODE_REG |0x40;

            P2OUT &=~SCS;

            ByteSend(addr);
            d1=ByteRead();
            d2=ByteRead();
            d3=ByteRead();
            d4=ByteRead();
            P2OUT |=SCS;

            }
            //==================================================================

            //=================================================================
            //功能,對Control Register 寫入
            void A7105_WriteReg(uint addr,uint dataByte)
            {
            uint i;
            P2OUT&=~SCS;
            addr |=0x00;
            P2DIR |=SDIO;
            for(i=0;i<8;i++)
            {
            if(addr & 0x80)
            {
            P2OUT|=SDIO;
            }
            else
            {
            P2OUT &=~SDIO;
            }
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;
            addr=addr<<1;
            }
            _NOP();
            for(i=0;i<8;i++)
            {
            if(dataByte & 0x80)
            P2OUT |=SDIO;
            else
            P2OUT &=~SDIO;
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;
            dataByte=dataByte<<1;
            }
            P2OUT |=SCS;

            }
            //===================================================================

            //==================================================================
            uint A7105_ReadReg(uint addr)
            {
            uint i;
            uint tmp;
            P2DIR |=SDIO;
            P2OUT &=~SCS;
            addr |=0x40;

            for(i=0;i<8;i++)
            {
            if(addr & 0x80)
            P2OUT |=SDIO;
            else
            P2OUT &=~SDIO;
            _NOP();
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;
            addr=addr<<1;
            }
            _NOP();
            P2DIR &=~SDIO;
            //FOR READ DATA
            for(i=0;i<8;i++)
            {
            if(P2OUT & 0x20 )
            tmp=(tmp<<1) | 0x01;
            else
            tmp=tmp<<1;
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;
            }
            P2OUT |=SCS;
            return tmp;

            }
            //=====================================================================


            //====================================================================
            //功能,寫入 1個 byte
            void ByteSend(uint src)
            {
            uint i;
            P2DIR |=SDIO;
            for(i=0;i<8;i++)
            {
            if(src & 0x80)
            P2OUT |=SDIO;
            else
            P2OUT &=~SDIO;
            _NOP();
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;
            src=src<<1;
            }
            }
            //==================================================================

            //=================================================================
            //功能,讀出1個byte
            uint ByteRead(void)
            {
            uint i,tmp;
            P2DIR &=~SDIO;//sdio pull high
            for(i=0;i<8;i++)
            {
            if(P2IN & 0x20 )
            tmp=(tmp<<1) |0x01;
            else
            tmp=tmp<<1;
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;

            }
            return tmp;
            }
            //==================================================================

            //==================================================================
            //功能,寫入4個bit
            void Send4Bit(uint src)
            {
            uint i;
            P2DIR |=SDIO;
            for(i=0;i<4;i++)
            {
            if(src & 0x80)
            P2OUT |=SDIO;
            else
            P2OUT &=~SDIO;
            _NOP();
            P2OUT |=SCK;
            _NOP();
            P2OUT &=~SCK;
            src=src<<1;
            }
            }
            //===================================================================

            //===================================================================
            //設(shè)置頻道的程序
            void SetCH(uint ch)
            {
            A7105_WriteReg(PLL1_REG,ch);
            }

            //====================================================================

            //====================================================================
            //功能,初始化 Master端的RF chip
            void initRF(void)
            {
            P2OUT |=SCS;
            P2OUT &=~SCK;
            P2OUT |=SDIO;
            //P2OUT |=GPIO1;
            //P2OUT |=GPIO2;
            A7105_Reset();//reset A7105 RF chip
            A7105_WriteID();//write ID code
            A7105_Config();//config A7105 chip
            A7105_Cal();//calibration IF,vco,vcoc
            }
            //====================================================================

            //====================================================================
            //功能,TX FIFO寫入資料
            void A7105_WriteFIFO(void)
            {
            uint i;
            uint cmd;
            cmd=FIFO_REG;//send address 0x05,bit cmd=0,r/w=0
            P2OUT &=~SCS;
            ByteSend(cmd);
            for(i=0;i<64;i++)
            ByteSend(PN9_Tab[i]);
            P2OUT |=SCS;

            }
            //===================================================================

            //===================================================================
            //功能,Strobe 命令寫入
            void StrobeCmd(uint cmd)
            {
            P2OUT &=~SCS;
            Send4Bit(cmd);
            P2OUT |=SCS;

            }
            //===================================================================

            //=================================================================
            //功能,從RX FIFO 中讀出資料
            void RxPacket(void)
            {
            uint i;
            uint recv;
            // uint tmp;
            uint cmd;
            RxCnt++;
            cmd=FIFO_REG |0x40;//address 0x05,bit cmd=0,r/w=1
            P2OUT &=~SCS;
            ByteSend(cmd);
            for(i=0;i<64;i++)
            {
            recv=ByteRead();
            recv&=0xff;
            tmpbuf[i]=recv;
            /*if(recv^PN9_Tab[i]!=0);
            { tmp=recv^PN9_Tab[i];
            Err_BitCnt+=(BitCount_Tab[tmp>>4]+BitCount_Tab[tmp & 0x0F]);
            }*/
            }
            P2OUT |=SCS;

            }
            //=====================================================================

            //====================================================================
            //Error state處理程序,留作擴(kuò)展
            void Err_State(void)
            {
            }
            //====================================================================

            //====================================================================
            //WaitBit 程序
            void WaitBit_0(uint reg,uint nbit)
            {
            do
            {

            }
            while(A7105_ReadReg(reg)& nbit);
            }
            //=====================================================================

            //=====================================================================
            //
            void SelVCOBand(uint vb1,uint vb2)
            {
            uint diff1,diff2;
            if(vb1>=4)

            diff1=vb1-4;
            else
            diff1=4-vb1;
            if(vb2>=4)
            diff2=vb2-4;
            else
            diff2=4-vb2;
            if(diff1==diff2 || diff1>diff2)
            A7105_WriteReg(VCOCAL1_REG,(vb1 |0x08));//manual setting vb1 value
            else
            A7105_WriteReg(VCOCAL1_REG,(vb2 |0x08));//manual setting vb2 value


            }
            //====================================================================================

            //=====================================================================
            //功能,IF,VCO,VCO current 校準(zhǔn)
            void A7105_Cal(void)
            {
            uint tmp;
            uint fb,fbcf;
            uint vb1,vbcf1,dvt1;
            uint vb2,vbcf2,dvt2;
            StrobeCmd(CMD_STBY);
            //calibration IF proceduce
            A7105_WriteReg(CALIBRATION_REG,0X01);
            WaitBit_0(CALIBRATION_REG,0x01);
            //for check
            /*tmp=A7105_ReadReg(IFCAL1_REG);
            fb=tmp & 0x0F;
            fbcf=(tmp>>4) & 0x01;
            if(fbcf==1)
            {
            Err_State();
            while(1);


            }*/
            //calibration vco procedure
            A7105_WriteReg(VCOCCAL_REG,0x13);
            A7105_WriteReg(VCOCAL2_REG,0x3B);
            SetCH(0);//setting 2400MHz
            A7105_WriteReg(CALIBRATION_REG,0x02);
            WaitBit_0(CALIBRATION_REG,0X02);
            tmp=A7105_ReadReg(VCOCAL1_REG);
            vb1=tmp & 0x07;
            vbcf1=(tmp>>3)&0x01;
            dvt1=(tmp>>4)&0x03;
            SetCH(160);//setting 2480MHz
            A7105_WriteReg(CALIBRATION_REG,0X02);
            WaitBit_0(CALIBRATION_REG,0x02);

            tmp=A7105_ReadReg(VCOCAL1_REG);
            vb2=tmp & 0x07;
            vbcf2=(tmp>>3) & 0x01;
            dvt2=(tmp>>4) & 0x03;
            SelVCOBand(vb1,vb2);
            /*if(vbcf1==1 && vbcf2==1)
            {
            ERR_Sate();
            while(1);
            }*/

            }
            //=========================================================

            //==========================================================
            //功能,初始化程序
            void A7105_Config(void)
            {
            uint i;
            //0x00,mode register,for test
            //0x05 fifo data register
            //0x06 id code register
            // 0x23 if calibrationII,only read
            // 0x32 filter test register
            for(i=0x01;i<0x04;i++)
            A7105_WriteReg(i,A7105Config[i]);
            for(i=0x07;i<0x22;i++)
            A7105_WriteReg(i,A7105Config[i]);
            for(i=0x24;i<=0x31;i++)
            A7105_WriteReg(i,A7105Config[i]);

            }
            //=============================================================

            //================================================================

            //main.c 文件

            //功能:程序入口

            //代碼:


            #include "io430.h"
            #include "in430.h"
            #include "data.h"
            #include "fuction.c"
            #include "stdio.c"

            //=====================================================
            //主函數(shù)
            //=====================================================
            int main( void )
            {
            // Stop watchdog timer to prevent time out reset
            WDTCTL = WDTPW + WDTHOLD;
            Init_Clk();
            Init_Timer();
            init_IO();
            init_uart();
            _EINT();
            if(maslv)
            { init_zhishi(100);
            initRF();
            StrobeCmd(CMD_STBY);
            A7105_WriteFIFO();
            Seq=0;
            timer=0;
            while(1)
            {//發(fā)送
            while(timer!=2);
            SetCH(HopTab[Seq]);
            StrobeCmd(CMD_TX);//發(fā)送命令
            while(P2IN & 0X02);//等待發(fā)送完
            Seq++;
            if(Seq>4)
            Seq=0;
            }
            }
            else
            {
            init_zhishi(0);
            initRF();
            StrobeCmd(CMD_STBY);
            RxCnt=0;
            Seq=0;
            while(1)
            {
            while(timer!=0);
            SetCH(HopTab[Seq]-1);
            StrobeCmd(CMD_RX);
            while((P1IN&0x02) && timer<=3);//等待
            if(timer>3)
            {
            StrobeCmd(CMD_PLL);
            Seq++;
            if(Seq>4)
            Seq=0;
            }
            // timer=2;//reoffest
            RxPacket();
            Seq++;
            if(Seq>4)
            Seq=0;
            init_uartRX();

            }
            }
            // return 0;
            }
            //=======================================================
            //中斷
            //========================================================
            #pragma vector=TIMERA0_VECTOR
            __interrupt void TimerA_(void)
            {
            timer++;
            if(timer>20)
            timer=0;

            }



            關(guān)鍵詞: msp430A7105單工通

            評論


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

            關(guān)閉