msp430与A7105实现单工通信
}
//=====================================================================
//====================================================================
//功能,写入 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 co
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);
}*/
}
//=========================================================
msp430A7105单工通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
