<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          先說一下大致流程:

          本文引用地址:http://www.ex-cimer.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;//計(jì)數(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í)函數(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;
          }
          //=================================================================
          //===================================================================
          // 時(shí)鐘模塊晶振初始化
          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個(gè) 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個(gè)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個(gè)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)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();