📄 accept.c
字号:
/*********************************************************************
** Device: A7125 **
** File: main.c **
** **
** Description: **
** This file is a sample code for your reference. **
** **
** Copyright (C) 2008 AMICCOM Corp. **
** **
*********************************************************************/
#include <reg52.h>
#include "define.h"
#include "a7125reg.h"
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
// I/O Declaration //
// TODO: USER NEED CHANGE THIS SET TO FIT SYSTEM. //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
sbit SCS = P1^7;
sbit SCK = P1^4;
sbit SDIO = P1^5;
sbit GIO1 = P1^3;
sbit GIO2 = P1^2;
sbit LED1 = P3^7;
#define RF_WTR GIO1
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
// Global Variable Declaration //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
Uint8 idata RfBuf[64];
Uint8 idata TmpUint8;
//-----------------------------------------------------------------------------
// 64 bytes PN9 pseudo random code
//-----------------------------------------------------------------------------
const Uint8 code PN9_Tab[]=
{ 0xFF,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,0x34,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
};
//-----------------------------------------------------------------------------
// RF ID code
//-----------------------------------------------------------------------------
const Uint8 code ID_Tab[4] =
{
0x54, 0x75, 0xC5, 0x2A
};
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// NOTE !!
// !! THIS CONFIG TABLE ONLY USE ON RF CRYSTAL = 16MHz !!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
const Uint16 code A7125Config[] =
{
// address name Descript
// ------- ---- ---------
0x00, //0x00 MODE register, only reset, not use on config
0x62, //0x01 MODE CTRL register, FIFO mode, Enable ARSSI, Enable AIF
0x00, //0x02 CALIBRATION register,
0x3F, //0x03 FIFO1 register,
0x00, //0x04 FIFO2 register,
0x00, //0x05 FIFO register, for fifo read/write
0x00, //0x06 IDDATA register, for idcode
0x00, //0x07 RCOSC1 register,
0x00, //0x08 RCOSC2 register,
0x00, //0x09 RCOSC3 register,
0x00, //0x0A CKO register,
0x01, //0x0B GIO1 register, WTR
0x01, //0x0C GIO2 register, WTR
0x1F, //0x0D DATARATE register,
0x50, //0x0E PLL1 register,
0x0E, //0x0F PLL2 register, RFbase 2400.001MHz
0x96, //0x10 PLL3 register,
0x00, //0x11 PLL4 register,
0x04, //0x12 PLL5 register,
0x3C, //0x13 chanel group I,
0x78, //0x14 chanel group II,
0xD7, //0x15 TX1 register,
0x40, //0x16 TX2 register,
0x10, //0x17 DELAY1 register,
0x61, //0x18 DELAY2 register,
0x62, //0x19 RX register,
0xA0, //0x1A RXGAIN1 register,
0x00, //0x1B RXGAIN2 register,
0x00, //0x1C RXGAIN3 register,
0xD2, //0x1D RXGAIN4 register,
0x00, //0x1E RSSI register,
0xE2, //0x1F ADC register,
0x07, //0x20 CODE1 register,
0x56, //0x21 CODE2 register,
0x2A, //0x22 CODE3 register,
0x06, //0x23 IFCAL1 register,
0x00, //0x24 IFCAL2 register, only read
0x05, //0x25 VCOCCAL register,
0x44, //0x26 VCOCAL1 register,
0x80, //0x27 VCOCAL2 register,
0x30, //0x28 VCO DEV Cal. I register,
0x20, //0x29 VCO DEV Cal. II register,
0x80, //0x2A VCO DEV Cal. III register,
0x00, //0x2B VCO Mod. delay register
0x7A, //0x2C BATTERY register,
0x2F, //0x2D TXTEST register,
0x47, //0x2E RXDEM1 register,
0x80, //0x2F RXDEM2 register,
0xF1, //0x30 CPC1 register,
0x11, //0x31 CPC2 register,
0x04, //0x32 CRYSTAL register,
0x45, //0x33 PLLTEST register,
0x18, //0x34 VCOTEST register,
0x10, //0x35 RF Analog Test
0xFF, //0x36 IFAT register,
0x37, //0x37 Channel select register,
0xFF //0x38 VRB register
};
/*********************************************************************
** function Declaration
*********************************************************************/
void A7125_WriteReg(Uint8, Uint8);
Uint8 A7125_ReadReg(Uint8);
void StrobeCmd(Uint8 src);
void ByteSend(Uint8 src);
void A7125_Reset(void);
void A7125_WriteID(void);
void initRF(void);
void A7125_Config(void);
void A7125_Cal(void);
Uint8 ByteRead(void);
void ReadFIFO(Uint8 length);
void WriteFIFO(Uint8 length);
void Delay1ms(Uint8 n);
/*********************************************************************
* main loop
*********************************************************************/
void main(void)
{ //unsigned int aa;
unsigned char flag=0;
LED1=0;
Delay1ms(50); // 等待晶体稳定
initRF();
StrobeCmd(CMD_STBY);
A7125_WriteReg(TXTEST_REG,0x17); // 发送功率0DB
//A7125_WriteReg(DATARATE_REG,0x1F); // 速率2M
A7125_WriteReg( DATARATE_REG, 0x5F ); //1M
A7125_WriteReg(MODECTRL_REG,0x62); // FIFO模式
A7125_WriteReg(PLL1_REG,160); // 频道100
A7125_WriteReg(CODE1_REG,0x0F); // 使能CRC检测
A7125_WriteReg(FIFO1_REG,8-1); // set FIFO length
StrobeCmd(CMD_RX); //设置成接收模式
while(1)
{
//A7125_WriteReg(FIFO1_REG,8-1); // set FIFO length
// StrobeCmd(CMD_RX); //设置成接收模式
while(GIO1);
GIO1=1; LED1=0; TmpUint8 = A7125_ReadReg(MODE_REG); if((TmpUint8&0x20)==0) { ReadFIFO(8); //读数据
// Delay1ms(1);
WriteFIFO( 8 ); // 写数据
//Delay1ms(1);
//A7125_WriteReg(PLL1_REG,160); // 频道100
StrobeCmd( CMD_TX ); //发送数据
//while( RF_WTR );
while(GIO1); // 等待发送完成
GIO1=1; LED1=1;
}
initRF();
A7125_WriteReg(FIFO1_REG,8-1);
StrobeCmd(CMD_RX);
}
}
/*********************************************************************
** Err_State
*********************************************************************/
void Err_State(void)
{
//ERR display
//Error Proc...
while(1)
{
;
}
}
/************************************************************************
** A7125_WriteReg
************************************************************************/
void A7125_WriteReg(Uint8 addr, Uint8 dataByte)
{
Uint8 i;
SCS = 0;
addr |= 0x00; //bit cmd=0,r/w=0
for(i = 0; i < 8; i++)
{
if(addr & 0x80)
SDIO = 1;
else
SDIO = 0;
SCK = 1;
_nop_();
SCK = 0;
addr = addr << 1;
}
_nop_();
//send data byte
for(i = 0; i < 8; i++)
{
if(dataByte & 0x80)
SDIO = 1;
else
SDIO = 0;
SCK = 1;
_nop_();
SCK = 0;
dataByte = dataByte << 1;
}
SCS = 1;
}
/************************************************************************
** A7125_ReadReg
************************************************************************/
Uint8 A7125_ReadReg(Uint8 addr)
{
Uint8 i;
Uint8 tmp;
SCS = 0;
addr |= 0x40; //bit cmd=0,r/w=1
for(i = 0; i < 8; i++)
{
if(addr & 0x80)
SDIO = 1;
else
SDIO = 0;
_nop_();
SCK = 1;
_nop_();
SCK = 0;
addr = addr << 1;
}
_nop_();
SDIO = 1;
//read data
for(i = 0; i < 8; i++)
{
if(SDIO)
tmp = (tmp << 1) | 0x01;
else
tmp = tmp << 1;
SCK = 1;
_nop_();
SCK = 0;
}
SCS = 1;
return tmp;
}
/*********************************************************************
** Strobe Command
*********************************************************************/
void StrobeCmd(Uint8 src)
{
Uint8 i;
SCS = 0;
for(i = 0; i < 8; i++)
{
if(src & 0x80)
SDIO = 1;
else
SDIO = 0;
_nop_();
SCK = 1;
_nop_();
SCK = 0;
src = src << 1;
}
SCS = 1;
}
/************************************************************************
** ByteSend
************************************************************************/
void ByteSend(Uint8 src)
{
Uint8 i;
for(i = 0; i < 8; i++)
{
if(src & 0x80)
SDIO = 1;
else
SDIO = 0;
_nop_();
SCK = 1;
_nop_();
SCK = 0;
src = src << 1;
}
}
/************************************************************************
** WriteID
************************************************************************/
void A7125_WriteID(void)
{
Uint8 i;
Uint8 addr;
addr = IDCODE_REG; //send address 0x06, bit cmd=0, r/w=0
SCS = 0;
ByteSend(addr);
for (i=0; i < 4; i++)
ByteSend(ID_Tab[i]);
SCS = 1;
}
/************************************************************************
** Reset_RF
************************************************************************/
void A7125_Reset(void)
{
A7125_WriteReg(MODE_REG, 0x00); //reset RF chip
}
/*********************************************************************
** CHGroupCal
*********************************************************************/
void CHGroupCal(Uint8 ch)
{
Uint8 tmp;
Uint8 vb,vbcf;
Uint8 vcb,vccf;
A7125_WriteReg(PLL1_REG, ch);
A7125_WriteReg(CALIBRATION_REG, 0x1C);
do
{
tmp = A7125_ReadReg(CALIBRATION_REG);
tmp &= 0x1C;
}
while (tmp);
//for check
tmp = A7125_ReadReg(VCOCAL1_REG);
vb = tmp & 0x07;
vbcf = (tmp >>3) & 0x01;
tmp = A7125_ReadReg(VCOCCAL_REG);
vcb = tmp & 0x0F;
vccf= (tmp >> 4) & 0x01;
if (vbcf || vccf)
Err_State();//error
}
/*********************************************************************
** calibration
*********************************************************************/
void A7125_Cal(void)
{
Uint8 tmp;
Uint8 fb,fbcf,fcd;
Uint8 dvt;
//calibration RSSI,IF procedure
StrobeCmd(CMD_PLL);
A7125_WriteReg(CALIBRATION_REG, 0x03);
do
{
tmp = A7125_ReadReg(CALIBRATION_REG);
tmp &= 0x03;
}
while (tmp);
//calibration VCO dev,VBC,VCC procedure
CHGroupCal(30); //calibrate channel group Bank I
CHGroupCal(90); //calibrate channel group Bank II
CHGroupCal(150); //calibrate channel group Bank III
StrobeCmd(CMD_STBY); //return to STBY state
//for check
tmp = A7125_ReadReg(IFCAL1_REG);
fb = tmp & 0x0F;
fbcf = (tmp >>4) & 0x01;
tmp = A7125_ReadReg(IFCAL2_REG);
fcd = tmp & 0x1F;
tmp = A7125_ReadReg(VCOCAL2_REG);
dvt = tmp;
if (fbcf)
Err_State(); //error
}
/*********************************************************************
** A7125_Config
*********************************************************************/
void A7125_Config(void)
{
Uint8 i;
//0x00 mode register, for reset
//0x05 fifo data register
//0x06 id code register
//0x24 IF calibration II, only read
for ( i=0x01; i<=0x38; i++ )
{
if ( (i==0x05) || (i==0x06) || (i==0x24) )
continue;
A7125_WriteReg( i, A7125Config[i] );
}
}
/*********************************************************************
** initRF
*********************************************************************/
void initRF(void)
{
//init io pin
SCS = 1;
SCK = 0;
SDIO = 1;
GIO1 = 1;
GIO2 = 1;
A7125_Reset(); //reset A7125 RF chip
A7125_WriteID(); //write ID code
A7125_Config(); //config A7125 chip
A7125_Cal(); //calibration IF,vco, vcoc
}
//**********************************************************************
// ByteRead
//**********************************************************************
Uint8 ByteRead(void)
{
Uint8 i,tmp;
SDIO = 1; //sdio pull high
for(i = 0; i < 8; i++)
{
if(SDIO)
tmp = (tmp << 1) | 0x01;
else
tmp = tmp << 1;
SCK = 1;
_nop_();
SCK = 0;
}
return tmp;
}
//**********************************************************************
// ReadFIFO
//**********************************************************************
void ReadFIFO(Uint8 length)
{
Uint8 i;
SCS = 0;
ByteSend(FIFO_REG | 0x40);
for(i = 0; i <length; i++)
RfBuf[i] = ByteRead();
SCS=1;
}
//**********************************************************************
// WriteFIFO
//**********************************************************************
void WriteFIFO(Uint8 length)
{
Uint8 i;
A7125_WriteReg( FIFO1_REG, length-1); // set FIFO length
StrobeCmd(CMD_TFR); // Reset TX FIFO point
SCS=0;
ByteSend(FIFO_REG);
for(i=0; i <length; i++)
ByteSend(PN9_Tab[i]);
SCS=1;
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
// DELAY 1MS FUNCTION //
// USER NEED CHANGE THIS FUNCTION TO FIT SYSTEM. //
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
void Delay1ms(Uint8 n)
{
Uint8 i, j;
while(n--)
{
for(j = 0; j < 6; j ++)
{
for(i = 0; i < 235; i ++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -