新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > msp430與A7105實現單工通信

        msp430與A7105實現單工通信

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

        先說一下大致流程:

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

        Master端:
        1)timer=0ms 發送數據(采用調頻發送)

        Slaver端:

        2)timer=2ms接收數據,并送給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;//實現調頻的變量
        uint RxCnt;//計數
        uint tmpbuf[64]={0};
        uint timer;


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


        //============================================================
        //RF初始設定

        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
        //===================================================================

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

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

        //fuction.c 文件

        //功能:函數聲明

        //代碼:

        //=====================================================
        //函數聲明
        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 文件

        //功能:初始化,及功能函數

        //代碼:

        //=======================================================================
        //delays,延時函數
        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下進行2400波特率通信
        //波特調整
        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;
        }
        }
        //===================================================================

        //===================================================================
        //設置頻道的程序
        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處理程序,留作擴展
        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 校準
        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"

        //=====================================================
        //主函數
        //=====================================================
        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)
        {//發送
        while(timer!=2);
        SetCH(HopTab[Seq]);
        StrobeCmd(CMD_TX);//發送命令
        while(P2IN & 0X02);//等待發送完
        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;

        }



        關鍵詞: msp430A7105單工通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 平江县| 鹿邑县| 子长县| 德化县| 新乡市| 齐齐哈尔市| 泊头市| 饶阳县| 漯河市| 剑川县| 高雄县| 资溪县| 筠连县| 忻城县| 陆河县| 望谟县| 康乐县| 五华县| 汝阳县| 广丰县| 夏邑县| 方城县| 凤山市| 余干县| 吉林市| 巴马| 安徽省| 太谷县| 民乐县| 竹溪县| 深泽县| 蕉岭县| 吴桥县| 湖口县| 泽库县| 偏关县| 于都县| 绵竹市| 黄平县| 新闻| 鄂伦春自治旗|