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

📄 main.c

📁 ARMIC公司的2.4G无线收发应用C51语言源程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
        return varBank;
}

/*****************************************************************************
**  Function    : initA7121.                                                **
**                                                                          **
**  HISTORY     : 2005/6/15 Jones created.                                  **
**                                                                          **
**  Description : Init AMIC A7121                                           **
**                                                                          **
/****************************************************************************/
void initA7121(void)
{
    Uint8   i;
    Uint16  tempValue;
#ifdef SPI_CHECK
    Uint16   readData;
#endif
 
 
    // Step 1: Reset RFIC
    ResetPin = LOW;
    ResetPin = HIGH;

    // Step 2: Set a7121 TO STBY mode
    Ms0Pin    = HIGH;     //standy mode MS[1:0]="0b01"
    Ms1Pin    = LOW;
    //SpiClk    = LOW;
    //CdTxenPin = LOW;    //disable CDTXEN
    
    //Step 3: system clock and mode control setting
    if(DataRateSet == DATA_RATE_1M)
    {   //data rate 1Mbps @xtal=18MHz
         //BBOut ratio = 17,datarate ratio = 17, IF ratio = 8
        SpiWrite(0x2231, SYSTEM_CLK_REG);
#ifdef SPI_CHECK
        readData = SpiRead(SYSTEM_CLK_REG);
#endif
        //synthesizer off,tx state,1Mbps,bi-directional TRX,BBout on 
        SpiWrite(0x039B, MODE_CONTROL_REG);
    }
    else
    {   //data rate 3Mbps @xtal=18MHz
        //BBOut ratio = 5,datarate ratio = 5, IF ratio = 3
        SpiWrite(0x0CA5, SYSTEM_CLK_REG);
#ifdef SPI_CHECK
        readData = SpiRead(SYSTEM_CLK_REG);
#endif
        //synthesizer off,tx state,3Mbps,bi-directional TRX,BBout on 
        SpiWrite(0x03FB, MODE_CONTROL_REG);
    }

    // Step 4: VCO calibration
    if(DataRateSet == DATA_RATE_1M)
    {
        for(i = 0; i < FREQUENCY_NO; i++)
            FreqBank[i] = CalibrationVCO(i);
    }
    else
    { 
        for (i = 0; i < FREQUENCY_NO; i++)
            FreqBank[i] = CalibrationVCO(i);
    }

    // Step 5: TX & RX mode control setting
    //deviation 160k-0xffc4/250k-0xffd0
    SpiWrite(0xFFD0, TX_CONTROL1_REG);
    SpiWrite(0xE23F, TX_CONTROL2_REG);

    //enable fifo,average,recovery clock position=3, ETH ='110'
    SpiWrite(0x06F6, RX_CONTROL1_REG);
    //vga=0dB,data filter=5
    SpiWrite(0x0028, RX_CONTROL2_REG);

    //Step 6: FIFO setting
    //fifo read/write disable,input data pin=TXD
    SpiWrite(0x0FC0, FIFO_CONTROL_REG);
   
   
    //Step 7: Access code setting
    for (i = 0; i < 9; i++)
        SpiWrite((AccessCodeTab[i] << 8) | AccessCodeTab[i], ACCESS_CODE_REG); 
    
    //Step 8: IFC, DFC, DEMC, RHC & RLC calibration setting
    //rssi after sx syn
    SpiWrite(0x01F2, CALIBRATION_CONTROL1_REG);
    //packet indictor
    SpiWrite(0x0001, CALIBRATION_CONTROL2_REG);
    //default setting
    SpiWrite(0x0D83, ADC_REG);
   
    //auto calibration
    SpiWrite(0x0003, CALIBRATION_CONTROL2_REG);//enable calibration process

    do
    {
        tempValue = SpiRead(CALIBRATION_CONTROL1_REG);
        tempValue = tempValue & 0x2E00;
    }
    while (tempValue != 0x2E00);//check calibration ok?

    //rx control 2
    SpiWrite(0x002F, RX_CONTROL2_REG);//vga=20dB,data filter=5
}

/*****************************************************************************
**  Function    : initMcu.                                                  **
**                                                                          **
**  HISTORY     : 2005/6/15 Jones created.                                  **
**                                                                          **
**  Description : Init Winbond W77LE58.                                     **
**                                                                          **
/****************************************************************************/
void initMcu(void)
{
    // init Timer0
    TMOD &= 0xF0;
    TMOD |= 0x01;   // 16 bits timer
    ET0 = LOW;
    TR0 = LOW;
}

/*****************************************************************************
**  Function    : writeFifo.                                                **
**                                                                          **
**  HISTORY     : 2005/6/16 Jones created.                                  **
**                                                                          **
**  Description : Write data to tx FIFO                                     **
**                                                                          **
/****************************************************************************/
void writeFifo(void)
{
    Uint8   i, j;
    Uint8   wData;

    for(j = 0; j < FRAME_LIGHT; j ++)
    {
        wData = TxFrame[j];

        for(i = 0; i < 8; i++)
        {
            FClock = HIGH;
    
            if(wData & 0x80)
                Txd = HIGH;
            else
                Txd = LOW;
    
            FClock = LOW;
            wData <<= 1;
        }
    }
}

/*****************************************************************************
**  Function    : readWriteFifo.                                            **
**                                                                          **
**  HISTORY     : 2005/6/16 Jones created.                                  **
**                                                                          **
**  Description : Write data to Tx FIFO & Read data from Rx FIFO            **
**                                                                          **
/****************************************************************************/
void readWriteFifo(void)
{
    Uint8   i, j;
    Uint8   wData;
    Uint8   rData;

    for(j = 0; j < FRAME_LIGHT; j ++)
    {
        wData = TxFrame[j];

        for(i = 0; i < 8; i++)
        {
            rData <<= 1;

            FClock = HIGH;
    
            if(wData & 0x80)
                Txd = HIGH;
            else
                Txd = LOW;

            if(TRxD)
                rData |= 1;//read "1"

            FClock = LOW;
            wData <<= 1;
        }
        
        RxFrame[j] = rData;
    }
}

/*****************************************************************************
**  Function    : delay.                                                    **
**                                                                          **
**  HISTORY     : 2005/6/16 Jones created.                                  **
**                                                                          **
**  Description : delay.                                                    **
**                                                                          **
/****************************************************************************/
void delay(Uint8 time)
{
    while(time != 0) time --;
} 

/*****************************************************************************
**  Function    : main                                                      **
**                                                                          **
**  HISTORY     : 2004/11/16  Jones created                                 **
**                                                                          **
**  Description : Main function for StartA7121.                             **
**                                                                          **
*****************************************************************************/
void main(void)
{
#ifdef MASTER_MODE
    MyType      = MASTER;
#else
    MyType      = SLAVE;
#endif

#ifdef DATA_RATE_3M_MODE
    DataRateSet = DATA_RATE_3M;
#else // DATA_RATE_1M_MODE
    DataRateSet = DATA_RATE_1M;
#endif

    TimeOutFlag = LOW;
    Frequency   = 0;

    initMcu();
    initA7121();

    if(MyType == MASTER)
    {
        setTxMode();
        writeFifo();
        Ms1Pin    = HIGH;
        delay(30);
        CdTxenPin = HIGH;
        delay(80);
        CdTxenPin = LOW;
        setRxMode();
        TL0 = 0x00;
        TH0 = 0xEF;
        ET0 = HIGH;
        TR0 = HIGH;
        EA  = HIGH;   // Enable all interrupt
    }
    else
    {
        setRxMode();
    }

    for( ; ; )
    {
        if(MyType == MASTER && TimeOutFlag == HIGH)
        {
             // Disable timer0
            TimeOutFlag = LOW;
            TR0         = LOW;
            ET0         = LOW;

            Frequency++;    // Change Frequency
            if(Frequency == FREQUENCY_HOPPING_NO)
                Frequency = 0;

            setTxMode();
            writeFifo();
            Ms1Pin    = HIGH;
            delay(30);
            CdTxenPin = HIGH;
            delay(80);
            CdTxenPin = LOW;
            setRxMode();
            // enable timer0
            TL0 = 0x00;
            TH0 = 0xEF;
            ET0 = HIGH;
            TR0 = HIGH;
        }

        if(RxSync == HIGH)
        {
            if(MyType == MASTER)
            {   // Disable timer0
                TR0 = LOW;
                ET0 = LOW;

                // Enable timer0
                TL0 = 0x00;
                TH0 = 0xEF;
                ET0 = HIGH;
                TR0 = HIGH;
                
                Frequency++;    // Change Frequency
                if(Frequency == FREQUENCY_HOPPING_NO)
                    Frequency = 0;
            }

            delay(30);
            setTxMode();
            readWriteFifo();
            Ms1Pin    = HIGH;
            delay(30);
            CdTxenPin = HIGH;
            delay(80);
            CdTxenPin = LOW;

            if(MyType == SLAVE)
            {
                Frequency++;    // Change Frequency
                if(Frequency == FREQUENCY_HOPPING_NO)
                    Frequency = 0;
            }
            
            setRxMode();
        }
    }   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -