?? main.c
字號:
/*****************************************************************************
** **
** AMIC Proprietary Document **
** StartA7121 **
** Copyright (c) 2005-2009 AMIC Technology Inc. **
** **
** No.2, Li-Hsin 6th Road, Science_Based Industrid Park, **
** Hsin_Chu City, 300, Taiwan, ROC. **
** Tel: 886-3-5679966 Fax: 886-3-5679977 **
** E-mail:info@amic.com.tw http: //www.amic.com.tw **
** **
*****************************************************************************/
#include "reg52.h"
#include "main.h"
#include "A7121.h"
/*****************************************************************************
** FILE NAME: main.c **
** **
** HISTORY : 2005/6/15 Jones created. **
** **
** FUNCTION : This file contains the routines related to StartA7121. **
** **
*****************************************************************************/
Uint8 data TxFrame[FRAME_LIGHT] = {'A', 'M', 'I', 'C',
'R', 'F', 'I', 'C',
};
Uint8 data RxFrame[FRAME_LIGHT];
Uint8 data DataRateSet;
Uint8 data TimeOutFlag;
Uint8 data MyType;
Uint8 data MyMode;
Uint8 data Frequency;
Uint8 data FreqBank[FREQUENCY_NO];
/*****************************************************************************
** Function : timer0Isr. **
** **
** HISTORY : 2004/9/27 Jones created. **
** **
** Description : Rx data timeout. **
** **
/****************************************************************************/
void timer0Isr(void) interrupt 1 using 3
{
TR0 = LOW;
ET0 = LOW;
TimeOutFlag = HIGH;
#ifdef RX_TIME_CHECK
P4 &= 0xFE;
#endif
}
/*****************************************************************************
** Function : SpiWrite. **
** **
** HISTORY : 2004/9/27 Jones created. **
** **
** Description : Write data to A7121 register. **
** **
/****************************************************************************/
void SpiWrite(Uint16 dataWord, Uint8 address)
{
Uint8 data i;
SpiClk = LOW;
SpiCs = LOW; // Enable A7121 SPI
SpiTxd = HIGH;
//send address code
address = (address << 2) | 0x80; //fill wirte bit
for(i = 0; i < 8; i++)
{
SpiClk = HIGH;
if(address & 0x80)
SpiTxd = HIGH; //bit = 1
else
SpiTxd = LOW; //bit = 0
SpiClk = LOW;
address = address << 1;
}
//send data code
for(i = 0; i < 16; i++)
{
SpiClk = HIGH;
if(dataWord & 0x8000)
SpiTxd = HIGH;
else
SpiTxd = LOW;
dataWord = dataWord << 1;
SpiClk = LOW;
}
SpiCs = HIGH;// Disable A7121 SPI
SpiTxd = HIGH;
}
/*****************************************************************************
** Function : SpiRead. **
** **
** HISTORY : 2004/9/27 Jones created. **
** **
** Description : Read data from A7121 register. **
** **
/****************************************************************************/
Uint16 SpiRead(Uint8 data address)
{
Uint8 i;
Uint16 spiData;
spiData = LOW;
SpiClk = LOW;
SpiCs = LOW; // Enable A7121 SPI
//send address code
address <<= 2;
for(i = 0; i < 8; i++)
{
SpiClk = HIGH;
if(address & 0x80)
SpiTxd = HIGH;
else
SpiTxd = LOW;
SpiClk = LOW;
address <<= 1;
}
//read data code
for(i = 0; i < 16; i++)
{
spiData <<= 1;
SpiClk = HIGH;
if(SpiRxd)
spiData |= 0x01; // SpiRxd: read "1"
SpiClk = LOW;
}
SpiCs = HIGH;
SpiRxd = HIGH;
SpiTxd = HIGH; //SpiTxd=miso
return spiData;
}
/*****************************************************************************
** Function : setTxMode **
** **
** HISTORY : 2004/10/29 Jones created **
** **
** Description: set RF in tx mode **
** **
** Frequency : 3 MHz mode 2403 ~ 2479.5 **
** 1 MHz mode 2402 ~ 2480 **
** **
*****************************************************************************/
void setTxMode(void)
{
Ms1Pin = LOW;
CdTxenPin = LOW;
if(DataRateSet == DATA_RATE_1M) // data rate 1Mbps
{ //tx mode,sync off
SpiWrite(0x03DB, MODE_CONTROL_REG);
// set Frequency
SpiWrite((0x0962 + FreqHopTable[Frequency] * 2) |
FreqBank[FreqHopTable[Frequency]] << 13, SYNTH1_REG);
//VTH = 1~1.5v, Change Cump = 500uA
SpiWrite(0x0B9B, SYNTH2_REG);
//BBout off,Tx mode,sync on
SpiWrite(0x031F, MODE_CONTROL_REG);
}
else // data rate 3Mbps
{ //tx mode,sync off
SpiWrite(0x03FB, MODE_CONTROL_REG);
// set Frequency
SpiWrite((0x0858 + FreqHopTable[Frequency] * 4) |
FreqBank[FreqHopTable[Frequency]] << 13, SYNTH1_REG);
//VTH = 1~1.5v, Change Cump = 500uA
SpiWrite(0x0B98, SYNTH2_REG);
//BBout off,Tx mode,sync on
SpiWrite(0x033F, MODE_CONTROL_REG);
}
// reset TRx FIFO
SpiWrite(0x0000, FIFO_CONTROL_REG);
SpiWrite(0x01FC, FIFO_CONTROL_REG);
}
/*****************************************************************************
** Function : setRxMode **
** **
** HISTORY : 2004/10/29 Jones created **
** **
** Description: set RF in Rx mode **
** **
** Frequency : 3 MHz mode: 2398.5 ~ 2475 **
** 1 MHz Mode: 2400 ~ 2478 **
** **
*****************************************************************************/
void setRxMode(void)
{
Ms1Pin = LOW;
CdTxenPin = HIGH;
if (DataRateSet==DATA_RATE_1M) //DATA_RATE_1MHZ
{ // Rx mode,sync off
SpiWrite(0x03D3, MODE_CONTROL_REG);
// Set frequency
SpiWrite((0x0960 + FreqHopTable[Frequency] * 2) |
FreqBank[FreqHopTable[Frequency]] << 13, SYNTH1_REG);
//VTH = 1~1.5v, Change Cump = 500uA
SpiWrite(0x0B9B, SYNTH2_REG);
//BBout off, Rx mode,sync on
SpiWrite(0x0317, MODE_CONTROL_REG);
}
else //DATA_RATE_3MHZ
{ // Rx mode,sync off
SpiWrite(0x03F3, MODE_CONTROL_REG);
// Set frequency
SpiWrite((0x0854 + FreqHopTable[Frequency] * 4) |
FreqBank[FreqHopTable[Frequency]] << 13, SYNTH1_REG);
//VTH = 1~1.5v, Change Cump = 500uA
SpiWrite(0x0B98, SYNTH2_REG);
//BBout off, Rx mode,sync on
SpiWrite(0x0337, MODE_CONTROL_REG);
}
SpiWrite(0x0F42, FIFO_CONTROL_REG);
SpiWrite(0x0F72, FIFO_CONTROL_REG);
Ms1Pin = HIGH;
}
/*****************************************************************************
** Function : CalibrationVCO **
** **
** HISTORY : 2005/3/30 JHP created **
** **
** Description: Calibration VCO band **
** **
*****************************************************************************/
Uint8 CalibrationVCO(Uint8 freq)
{
Uint8 varBank;
Uint8 ackError;
Uint8 i, j;
Uint16 ack;
Uint16 varbata;
if (DataRateSet == DATA_RATE_1M)
{
SpiWrite(0x03DF, MODE_CONTROL_REG); // synthesizer on
varbata = 0x0962 + freq * 2; // calculate frequency
varBank = 3; // init varBank value
SpiWrite(0x0B9B, SYNTH2_REG); // vth = 1~1.5v CP = 100ma
}
else
{
SpiWrite(0x03FF, MODE_CONTROL_REG); // synthesizer on
varbata = 0x0858 + freq * 4; // calculate frequency
varBank = 3; // init varBank value
SpiWrite(0x0B98, SYNTH2_REG); // vth = 1~1.5v CP = 100ma
}
for (i = 1; i <= 8 ;i ++) // retry 8 times
{
varbata=varbata & 0x1FFF;
varbata=(varbata | (varBank << 13));
SpiWrite(varbata, SYNTH1_REG);
for(j = 0; j < 180; j ++); // delay 300us
ack = SpiRead(SYNTH2_REG);
if((ack & 0xc000) == 0x4000) // vt = 01 calibration ok
{
ackError = 0;
break;
}
else if((ack & 0xc000) == 0x0000) // vt = 00 freq too low
{
if(varBank == 7)
{
ackError = 1;
break;
}
varBank++;
}
else if((ack & 0xc000) == 0xc000) // vt = 11 freq too high
{
if(varBank == 0)
{
ackError = 1;
break;
}
varBank--;
}
}
//synthesizer off
if (DataRateSet == DATA_RATE_1M)
SpiWrite(0x03DB, MODE_CONTROL_REG);
else
SpiWrite(0x03FB, MODE_CONTROL_REG);
if(ackError == 1)
return 0xff;
else
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -