您的位置 首页 ADAS

msp430与A7105完成单工通讯

A7105是一款性价比不错的RF。单个人认为它的实现比较麻烦,好在还有手册,有参考程序,总算是实现了,现在拿来与大家分享一下。先说一下大…

A7105是一款性价比不错的RF。单个人认为它的完成比较费事,好在还有手册,有参阅程序,总算是完成了,现在拿来与我们共享一下。

先说一下大致流程:

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;

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/273090.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部