📄 a7102.c
字号:
addr &= 0x0f;
/* 写A7102-参数配置命令 */
Byte_Write(addr);
/* 写A7102-参数配置数据 */
Word_Write(parameter);
iSPI_Scs = positive;
}
/***********************************************
函 数: A7102_Register_Read()
功 能: 读控制数据从A7102内部寄存器
输 入: addr
输 出: parameter
描 述: /
***********************************************/
unsigned int A7102_Register_Read(unsigned char addr)
{
unsigned int parameter;
iSPI_Sck = negative;
delay_A7102_us();
iSPI_Scs = negative;
addr &= 0x0f;
addr |= 0x80;
/* 读A7102-参数配置命令 */
Byte_Write(addr);
declare_sdo_input();
/* 读A7102-参数配置数据 */
parameter = Word_Read();
declare_sdo_output();
iSPI_Scs = positive;
/* 返回读取数值 */
return (parameter);
}
/***********************************************
函 数: A7102_Status_Transmit()
功 能: A7102设置为发射状态
输 入: /
输 出: /
描 述: A7102使用12.8M晶体为基准源
***********************************************/
void A7102_Status_Transmit(void)
{
#if mode_switch
iSPI_Tre = negative;
iSPI_Trs = positive;
iSPI_Tre = positive;
#else
#if mode_fifo
/* standby mode */
A7102_Register_Write(Reg_ModeControl,0x00d0);
/* TX frequency */
A7102_Register_Write(Reg_PLL_II,C_Tx_Frequency);
/* 校准值 */
A7102_Register_Write(Reg_Calibration,TX_Freq_Calibration);
/* transimit mode */
A7102_Register_Write(Reg_ModeControl,0x00d8);
#else
/* standby mode */
A7102_Register_Write(Reg_ModeControl,0x0050);
/* TX frequency */
A7102_Register_Write(Reg_PLL_II,C_Tx_Frequency);
/* 校准值 */
A7102_Register_Write(Reg_Calibration,TX_Freq_Calibration);
/* transimit mode */
A7102_Register_Write(Reg_ModeControl,0x0058);
#endif
#endif
}
/***********************************************
函 数: A7102_Receiver_Enable()
功 能: A7102接收使能
输 入: /
输 出: /
描 述: A7102使用12.8M晶体为基准源
***********************************************/
void A7102_Receiver_Enable(void)
{
#if mode_fifo
A7102_Register_Write(Reg_ModeControl,0x00c8);
#else
A7102_Register_Write(Reg_ModeControl,0x0048);
#endif
}
/***********************************************
函 数: A7102_Status_Receiver()
功 能: A7102设置为接收状态
输 入: /
输 出: /
描 述: A7102使用12.8M晶体为基准源
***********************************************/
void A7102_Status_Receiver(void)
{
#if mode_switch
iSPI_Tre = negative;
iSPI_Trs = negative;
iSPI_Tre = positive;
#else
#if mode_fifo
/* standby mode */
A7102_Register_Write(Reg_ModeControl,0x00c0);
/* RX frequency */
A7102_Register_Write(Reg_PLL_II,C_Rx_Frequency);
/* 校准值 */
A7102_Register_Write(Reg_Calibration,RX_Freq_Calibration);
/* enable receive mode */
A7102_Receiver_Enable();
#else
/* standby mode */
A7102_Register_Write(Reg_ModeControl,0x0040);
/* RX frequency */
A7102_Register_Write(Reg_PLL_II,C_Rx_Frequency);
/* 校准值 */
A7102_Register_Write(Reg_Calibration,RX_Freq_Calibration);
/* enable receive mode */
A7102_Receiver_Enable();
#endif
#endif
}
/***********************************************
函 数: A7102_Calibration_Frequency()
功 能: 频率校准IF和VCO
输 入: frequency(PLL II寄存器)
输 出: /
描 述: A7102使用12.8M晶体为基准源
***********************************************/
unsigned int A7102_Calibration_Frequency(unsigned int frequency)
{
unsigned int temp;
/* 设置频率 */
A7102_Register_Write(Reg_PLL_II,frequency);
/* 读出校准寄存器内值 */
temp = A7102_Register_Read(Reg_ModeControl);
/* 打开校准功能 */
temp |= 0x0006;
A7102_Register_Write(Reg_ModeControl,temp);
/* 等待校准完成 */
do
{
temp = A7102_Register_Read(Reg_ModeControl);
}while(temp&0x0006);
/* 获取校准的IF和VCO的补偿值 */
temp = A7102_Register_Read(Reg_Calibration);
/* MVBS =1,MIFS = 1,在状态切换时使用手动校准 */
temp &= 0x00ef;
temp |= 0x4910;
/* 返回校准的IF和VCO的补偿值 */
return temp;
}
/***********************************************
函 数: A7102_Config_Chip()
功 能: 配置A7102参数寄存器
输 入: /
输 出: /
描 述: A7102使用12.8M晶体为基准源
***********************************************/
void A7102_Config_Chip(void)
{
uint temp = 0x0000;
iSPI_Tre = negative;
iSPI_Trs = negative;
/* rate = 50kbps,IF = 100k,CSC[2:0] = 001,System clock = 64*IF = 6.4M */
A7102_Register_Write(Reg_SystemClock,0x0079);
/* TX = 434MHZ * 2 = (12.8mhz/(RRC[3:0]+1)) * (IP[7:0]+(FP[15:0]/65535)),RRC[3:0] = 0000,IP[7:0] = 0100 0011 */
/* MDIV = 0,IP选择范围32 - 127 */
A7102_Register_Write(Reg_PLL_I,0x0043);
/* FP[15:0],默认434Mhz */
A7102_Register_Write(Reg_PLL_II,0xcfff);
/* default 0x0000,无调校 */
A7102_Register_Write(Reg_PLL_III,0x0000);
/* PDL[2:0] =011,HFB =0(<500mhz),VCS[1:0] =00,CPS =0(normal),CPC[1:0] =01(charge pump 1mA) */
/* VCS[1:0] = 01,VCO电流控制为1,SDPW = 1 */
A7102_Register_Write(Reg_PLL_IV,0x066c);
#if mode_modulation
/* TME =1,发射带调制,GS =0,高斯滤波器关闭,FX = 12.8M,FDP = 101,FD = 0010 0000,
频偏 fdev = FX/(RRC[3:0]+1)*(FD[7:0]*(2^(FDP[2:0]))/8/65536),
= 12800khz * 32 * (2^5) /(2^19)
= 25khz */
A7102_Register_Write(Reg_TXI,0x1520);
#else
/* TME =0,发射未带调制,GS =0,高斯滤波器关闭,FX = 12.8M,
频偏 fdev = FX/(RRC[3:0]+1)*(FD[7:0]*(2^(FDP[2:0]))/8/65536),
= 12800khz * 128 * (2^5) /(2^19)
= 100khz */
A7102_Register_Write(Reg_TXI,0x0580);
#endif
/* 发射功率设置为最大功率 */
A7102_Register_Write(Reg_TXII,0x0337);
/* MPL[1:0] = 01,SLF[2:0] = 100,ETH[1:0] = 00,无位错误选择,DMOS = 0,DMG[1:0] = 01,增益X3 */
/* BW[1:0] = 00,50Khz,ULS= 1,下旁波带,HGM =1,高增益 */
A7102_Register_Write(Reg_RXI,0x1813);
/* Amic推荐值 */
A7102_Register_Write(Reg_RXII,0x500b);
/* CDM =1,carrier 打开 */
A7102_Register_Write(Reg_ADC,0x0000);
/* TX fifo <8字节,RX fifo > 56字节时报警, */
A7102_Register_Write(Reg_FIFO,0x4000|(C_FIFO_Byte-1));
/* MCS = 0,Manchester打开,FECS = 0,FEC打开,CRCS =0,CRC打开,IDL =1,id code =4字节,PML[1:0] = 11,前导4字节 */
A7102_Register_Write(Reg_Code,0x150f);
#if mode_switch
/* 打开位时钟,管脚控制收发,无载波侦测 */
A7102_Register_Write(Reg_PinControl,0x0222);
#else
// 打开位时钟,寄存器控制收发,无载波侦测 */
A7102_Register_Write(Reg_PinControl,0x0022);
#endif
/* VTL[2:0] = 100,VTH = VDD-0.5V, VTH[2:0] = 100,VTL =0.5V */
A7102_Register_Write(Reg_Calibration,0x4886);
A7102_Register_Write(Reg_ModeControl,0x00e0); //STB2==>syn mode
//delay 80us
for(temp = 0;temp < 0xffff;temp++)
{
_nop_();
_nop_();
}
}
/***********************************************
函 数: Initialisation_RF()
功 能: 上电初始化A7102
输 入: /
输 出: /
描 述: /
***********************************************/
void Initialisation_RF(void)
{
uint i;
iSPI_PowerOn = negative;
/* A7102稳定时间延迟配置 */
for(i = 0;i < 0xffff;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
iSPI_PowerOn = positive;
/* A7102稳定时间延迟配置 */
for(i = 0;i < 0xffff;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
A7102_Reset_Chip();
for(i = 0;i < 0xffff;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/* XCC =1(crystal high current),XS =1(crystal on) */
/* CGS = 0,因为使用标准12.8mhz晶体 */
A7102_Register_Write(Reg_Crystal,0x0015);
for(i = 0;i < 0xffff;i++)
{
_nop_();
_nop_();
}
/* FMT =0,normal mode,FMS =1,FIFO mode,CER = 1,RF chip 使能,PLLE = 0,使用12.8Mhz标准晶体,PLL关闭 */
A7102_Register_Write(Reg_ModeControl,0x00c0); //STB1==>standby mode
//delay 0.5ms
for(i = 0;i < 0xffff;i++)
{
_nop_();
_nop_();
}
A7102_Id_Write(&id_buff);
A7102_Id_Read(&rece_buff);
A7102_Config_Chip();
TX_Freq_Calibration = A7102_Calibration_Frequency(C_Tx_Frequency);
RX_Freq_Calibration = A7102_Calibration_Frequency(C_Rx_Frequency);
/* reset fifo */
A7102_Reset_FifoRX();
A7102_Reset_FifoTX();
/* 默认接收状态 */
A7102_Status_Receiver();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -