新聞中心

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

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

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

先說一下大致流程:

本文引用地址:http://m.butianyuan.cn/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;//實現(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下進行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處理程序,留作擴展
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)閉