?? 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 + -