微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > msp430与A7105实现单工通信

msp430与A7105实现单工通信

时间:11-13 来源:互联网 点击:

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

//====================================================================
//功能,写入 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);
}*/

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top