⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARMIC公司的2.4G无线收发应用C51语言源程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
**                                                                          **
**                         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 + -