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

📄 main.c

📁 AMIC wireless RF transceiver A7121 firmware source code.
💻 C
📖 第 1 页 / 共 2 页
字号:

        _nop_();
        address = address << 1;
        SpiClk = 0;
    }

    _nop_();

    //send data code
    for(i = 0; i < 16; i++)
    {
        SpiClk = 1;

        if(dataWord & 0x8000)
            SpiRxd = 1;
        else
            SpiRxd = 0;

        dataWord = dataWord<< 1;
        _nop_();
        SpiClk = 0;
    }

    _nop_();
    SpiCs = 1; //Disable A7121 SPI
    _nop_();
    SpiRxd = 1;
}

/*********************************************************************
** SpiRead
*********************************************************************/
Uint16 SpiRead(Uint8 address)
{
    Uint8 i;
    Uint16 spiData;

    spiData=0;
    SpiClk=0;
    SpiTxd = 1;

    SpiCs  = 0; //Enable A7121 SPI
    _nop_();

    //send address code
    address=(address<<2) | 0x00;//fill read bit
    for(i = 0; i < 8; i++)
    {
        SpiClk = 1;

        if(address & 0x80)
            SpiRxd = 1;
        else
            SpiRxd = 0;

        _nop_();
        address = address << 1;
        SpiClk = 0;
    }

    _nop_();

    //read data code
    for(i = 0; i < 16; i++)
    {
        SpiClk = 1;
        _nop_();

        if(SpiTxd)
            spiData = (spiData << 1) | 0x01;  // SpiRxd: read "1"
        else
            spiData = spiData << 1;           // SpiRxd: read "0"

        SpiClk = 0;
    }

    _nop_();
    SpiCs = 1;
    SpiRxd = 1;

    return spiData;
}

/*********************************************************************
*FIFOWrite
*********************************************************************/
void FIFOWrite(Uint8 source)
{
    Uint8 i;

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

        if(source & 0x80)
            FIFOData = 1;
        else
            FIFOData = 0;

        _nop_();
        source = source << 1;
        FIFOClk = 0;
    }

    _nop_();
    FIFOData=1;
}

/*********************************************************************
*FIFORead
*********************************************************************/
Uint8 FIFORead(void)
{
    Uint8 i;
    Uint8 tmp=0;

    for(i = 0; i < 8; i++)
    {
        FIFOClk = 1;
        _nop_();
        if(FIFOData)
            tmp = (tmp << 1) | 0x01;
        else
            tmp  = tmp << 1;

        FIFOClk = 0;
     }

     return tmp;
}

/*********************************************************************
**  SYNth_En
*********************************************************************/
void SYNth_En(void)
{
    ModeCtlReg |= 0x0004; //enable synth bit
    SpiWrite(ModeCtlReg, MODE_CONTROL_REG);
    Delay10us(15); //delay 150us for pll settling time
}

/*********************************************************************
**  SYNth_Di
*********************************************************************/
void SYNth_Di(void)
{
    ModeCtlReg &= (~0x0004); //disable synth bit
    SpiWrite(ModeCtlReg, MODE_CONTROL_REG);
}

/*********************************************************************
** ResetRF
*********************************************************************/
void ResetRF(void)
{
	//hardware reset
    ResetPin = 0;
    _nop_();
    ResetPin = 1;

    // or register reset
    //SpiWrite(0x0002,MODE_CONTROL_REG);//reset enable
	//delay();
	//SpiWrite(0x0003,MODE_CONTROL_REG);//reset disable
}

/*********************************************************************
**  FIFOWr_En
*********************************************************************/
void FIFOWr_En(void)
{
    FifoCtlReg |= 0x0004;
    SpiWrite(FifoCtlReg, FIFO_CONTROL_REG);
}

/*********************************************************************
**  FIFOWr_Di
*********************************************************************/
void FIFOWr_Di(void)
{
    FifoCtlReg &= ~0x0004;
    SpiWrite(FifoCtlReg, FIFO_CONTROL_REG);
}

/*********************************************************************
**  FIFORd_En
*********************************************************************/
void FIFORd_En(void)
{
    FifoCtlReg |= 0x0010;
    SpiWrite(FifoCtlReg, FIFO_CONTROL_REG);
}

/*********************************************************************
**  FIFORd_Di
*********************************************************************/
void FIFORd_Di(void)
{
    FifoCtlReg &= ~0x0010;
    SpiWrite(FifoCtlReg, FIFO_CONTROL_REG);
}

/*********************************************************************
** setFreq
*********************************************************************/
void SetFreq(Uint8 ch)
{
    Uint16 tmp;

    tmp = Freq_Base + ch;		//freq 2400MHz + offset ch
    tmp |= FreqBank[ch]<<13;	//find BNK[2:0] value
    SpiWrite(tmp, SYNTH1_REG);
}

/*********************************************************************
** SetTRC
*********************************************************************/
void SetTRC(Uint8 trc)
{
	if (trc)
	{
    	ModeCtlReg |= 0x0008;
    	SpiWrite(ModeCtlReg, MODE_CONTROL_REG);//set TRC=1
    }
    else
	{
	    ModeCtlReg &= (~0x0008);
	    SpiWrite(ModeCtlReg, MODE_CONTROL_REG);//set TRC=0
	}
}

/*********************************************************************
** TxPacket
*********************************************************************/
void TxPacket(void)
{
    Uint8 i;

    //write data to fifo
	FIFOWr_En();
    for (i=0; i<64; i++)
        FIFOWrite(PN9_Tab[i]);
    FIFOWr_Di();

    SetFreq(52);						//freq 2452MHz
    SetTRC(1);							//set bit TRC=1
    Ms1Pin = 1; 						//enter Tx mode
    Delay10us(6); 						//delay 60us for tx settling time

    CdTxenPin = 1; 						//start modulation
   	while(!FpRdy);						//wait until FP_RDY=1
    delay();							//delay>4us
	CdTxenPin = 0;
    Ms1Pin = 0; 						//quit Tx mode, enter synthesizer mode
}

/*********************************************************************
** RxPacket
*********************************************************************/
void RxPacket(void)
{
    Uint8 i;
    Uint8 RecvData;
    Uint8 tmp;

    Err_BitCnt=0; //clear Err_BitCnt
	FIFORd_En(); //rx fifo enable
    for (i=0; i<64; i++)
    {
        RecvData = FIFORead();

        if((RecvData ^ PN9_Tab[i])!=0)
        {
            tmp = RecvData ^ PN9_Tab[i];
            Err_BitCnt += (BitCount_Tab[tmp>>4] + BitCount_Tab[tmp & 0x0F]);
        }
    }
	FIFORd_Di(); //rx fifo disable
}

/*********************************************************************
** WaitRx
*********************************************************************/
void WaitRx(void)
{
	SetFreq(50);						//freq 2450MHz
	SetTRC(0);							//set bit TRC=0
	Ms1Pin = 1; 						//enter Rx mdoe
	while(FpRdy==0);					//wait FP_RDY=1
	Ms1Pin = 0;							//exit Rxmode, enter synthesizer mode
}

/*********************************************************************
** WaitAck
*********************************************************************/
Uint8 WaitAck(void)
{
	SetFreq(50);						//freq 2450MHz
	SetTRC(0);							//set bit TRC=0
	Ms1Pin = 1; 						//enter Rx mdoe

	Rst_Timer0();						//reload timer0
	TR0=1;								//start timer0
	while(TimeoutFlag==0 && FpRdy==0);	//wait timerout or data ready
	if (TimeoutFlag==1)
	{
		Ms1Pin=0;						//exit rx mode
		return 0;						//return 0
	}

    TR0=0;								//stop timer0
    Ms1Pin = 0;							//exit rx mode
    return 1;							//return 1
}

/*********************************************************************
** MeasureRSSI
*********************************************************************/
void MeasureRSSI(void)
{
	Uint16 tmp;
	Uint8 rssiValue;

	Ms1Pin = 1;	//enter rx mode
	Delay10us(6); //delay 60us for pll settling time

	SpiWrite(0x0005, CALIBRATION_CONTROL2_REG);	//ERSS=1
	do
	{
		tmp = SpiRead(CALIBRATION_CONTROL2_REG);
		tmp &= 0x0004;
	}
	while (tmp!=0); //check bit ERSS ok?
	Ms1Pin = 0;	//exit rx mode
	rssiValue = (SpiRead(RSSI_REG) & 0xFF00)>>8;
	_nop_();
}

⌨️ 快捷键说明

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