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

📄 ia443x_rf.c

📁 silicon wireless开发套件F920+Si4432原理图,源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		break;

		/*
		 value[0] - TRUE: the sent and received data is inverted
		*/
		case pRfDataInverted:
			temp8 = SpiRfReadRegister( ModulationModeControl2 ) & 0xF7;
			if( *value == TRUE )
			{	
				temp8 |= 0x08;
			}
			SpiRfWriteAddressData((REG_WRITE | ModulationModeControl2), temp8);
		break;

		default:	
			return RF_ERROR_PARAMETER;
		break;
	}

	return RF_OK;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RFSetRfParameters(uint8 modulation_mode, uint8 arib_mode, uint8 data_rate)
  +
  + DESCRIPTION:    this function configures the RF part of the chip (both TX and RX)
  + 				for different (predefined) data rate, deviation and modulation index 
  +					requirements.
  +					The available settings can be find in the global_canstans.c file
  +
  + RETURN:         RF_OK: 				the operation was succesfull
  +                 RF_ERROR_PARAMETER: invalid parameter, the operation is ignored.
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFSetRfParameters(uint8 modulation_mode, uint8 arib_mode, uint8 data_rate)
{
	uint8 ModulationModeCtrl1_reg,temp8;

	if( modulation_mode == 2 )
	{//OOK modulation
		//check whether the input parameter valid or not
		if( data_rate > (NMBR_OF_OOK_SAMPLE_SETTING - 1))
		{
			return RF_ERROR_PARAMETER;
		}
		//set the registers according the selected RF settings
		SpiRfWriteAddressData((REG_WRITE | IFFilterBandwidth), OOKRfSettings[data_rate][0] );
		SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOversamplingRatio), OOKRfSettings[data_rate][1]);
		SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset2), OOKRfSettings[data_rate][2]);
		SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset1), OOKRfSettings[data_rate][3]);
		SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset0), OOKRfSettings[data_rate][4]);
		SpiRfWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain1), OOKRfSettings[data_rate][5]);
		SpiRfWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain0), OOKRfSettings[data_rate][6]);
		SpiRfWriteAddressData((REG_WRITE | TXDataRate1), OOKRfSettings[data_rate][7]);
		SpiRfWriteAddressData((REG_WRITE | TXDataRate0), OOKRfSettings[data_rate][8]);
		ModulationModeCtrl1_reg = OOKRfSettings[data_rate][9];
		SpiRfWriteAddressData((REG_WRITE | FrequencyDeviation), OOKRfSettings[data_rate][10]);
		//store how long does it take to send/receive 1 byte on the given data rate
		//the value represent the Timer setting, assuming, that the clock freq is 8MHz, and the timer prescaler is 32
		ByteTime = OOKRfSettings[data_rate][11];
	}
	else
	{//FSK or GFSK modulation
		if( arib_mode == TRUE )
		{//ARIB mode is selected
			//check whether the input parameter valid or not
			if( data_rate > (NMBR_OF_ARIB_SAMPLE_SETTING - 1))
			{
				return RF_ERROR_PARAMETER;
			}
			//set the registers according the selected RF settings
			SpiRfWriteAddressData((REG_WRITE | IFFilterBandwidth), AribRfSettings[data_rate][0] );
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOversamplingRatio), AribRfSettings[data_rate][1]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset2), AribRfSettings[data_rate][2]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset1), AribRfSettings[data_rate][3]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset0), AribRfSettings[data_rate][4]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain1), AribRfSettings[data_rate][5]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain0), AribRfSettings[data_rate][6]);
			SpiRfWriteAddressData((REG_WRITE | TXDataRate1), AribRfSettings[data_rate][7]);
			SpiRfWriteAddressData((REG_WRITE | TXDataRate0), AribRfSettings[data_rate][8]);
			ModulationModeCtrl1_reg = AribRfSettings[data_rate][9];
			SpiRfWriteAddressData((REG_WRITE | FrequencyDeviation), AribRfSettings[data_rate][10]);
			//store how long does it take to send/receive 1 byte on the given data rate
			//the value represent the Timer setting, assuming, that the clock freq is 8MHz, and the timer prescaler is 32
			ByteTime = GFSKRfSettings[data_rate][11];
		}
		else
		{
			//check whether the input parameter valid or not
			if( data_rate > (NMBR_OF_GFSK_SAMPLE_SETTING - 1))
			{
				return RF_ERROR_PARAMETER;
			}
			//set the registers according the selected RF settings
			SpiRfWriteAddressData((REG_WRITE | IFFilterBandwidth), GFSKRfSettings[data_rate][0] );
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOversamplingRatio), GFSKRfSettings[data_rate][1]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset2), GFSKRfSettings[data_rate][2]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset1), GFSKRfSettings[data_rate][3]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryOffset0), GFSKRfSettings[data_rate][4]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain1), GFSKRfSettings[data_rate][5]);
			SpiRfWriteAddressData((REG_WRITE | ClockRecoveryTimingLoopGain0), GFSKRfSettings[data_rate][6]);
			SpiRfWriteAddressData((REG_WRITE | TXDataRate1), GFSKRfSettings[data_rate][7]);
			SpiRfWriteAddressData((REG_WRITE | TXDataRate0), GFSKRfSettings[data_rate][8]);
			ModulationModeCtrl1_reg = GFSKRfSettings[data_rate][9];
			SpiRfWriteAddressData((REG_WRITE | FrequencyDeviation), GFSKRfSettings[data_rate][10]);
			//store how long does it take to send/receive 1 byte on the given data rate
			//the value represent the Timer setting, assuming, that the clock freq is 8MHz, and the timer prescaler is 32
			ByteTime = GFSKRfSettings[data_rate][11];
		}
	}
	//enable packet handler & CRC16
	SpiRfWriteAddressData((REG_WRITE | ModulationModeControl1), ModulationModeCtrl1_reg);			
	SpiRfWriteAddressData((REG_WRITE | DataAccessControl), (RX_PACKET_HANDLER_EN | TX_PACKET_HANDLER_EN | CRC_16));
	//set modulation mode
	switch( modulation_mode )
	{
		case 0: temp8 = (TX_CLK_ON_GPIO | MOD_FIFO | MOD_TYPE_GFSK); 	break;
		case 1: temp8 = (TX_CLK_ON_GPIO | MOD_FIFO | MOD_TYPE_FSK);		break;
		case 2: temp8 = (TX_CLK_ON_GPIO | MOD_FIFO | MOD_TYPE_OOK);		break;
		default: temp8 = (TX_CLK_ON_GPIO | MOD_FIFO | MOD_TYPE_GFSK); 	break;
	}
	SpiRfWriteAddressData((REG_WRITE | ModulationModeControl2), temp8);
	//set preamble length & detection threshold
	SpiRfWriteAddressData((REG_WRITE | PreambleLength), (PREAMBLE_LENGTH << 1));		
	SpiRfWriteAddressData((REG_WRITE | PreambleDetectionControl), ( PD_LENGTH << 4) );				

	//to get 0% PER
	SpiRfWriteAddressData((REG_WRITE | ClockRecoveryGearshiftOverride), 0x03);
	SpiRfWriteAddressData((REG_WRITE | AFCLoopGearshiftOverride), 0x40);
	//SpiWriteAddressData((REG_WRITE | ModemTest), 0xc0);

	return RF_OK;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RFIdle(void)
  +
  + DESCRIPTION:    sets the transceiver and the RF stack into IDLE state, 
  +					independently of the actual state of the RF stack.
  +
  + RETURN:         RF_OK: 			the operation was succesfull
  +                 RF_ERROR_STATE: the actualy state of the stack is aborted.
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFIdle(void)
{
	uint8 temp8;

	if(RfState != sRFIdle)
	{	//switch off everything except XTAL
		temp8 = SpiRfReadRegister( OperatingFunctionControl1 );
		temp8 &= 0xF1; 
		SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl1), temp8);

		//diasble all ITs
		SpiRfWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
		SpiRfWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
		//release all IT flag
		ItStatus1 = SpiRfReadRegister( InterruptStatus1 );
		ItStatus2 = SpiRfReadRegister( InterruptStatus2 );

		//disable ITs
		DisableExt0It();
		StopTmr2();
	
		//set next state
		RfState = sRFIdle;
	}
	return RF_OK;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RfDirectTransmit(direct_transmit_command_t * Struct)
  +
  + DESCRIPTION:    Direct transmit
  +
  + RETURN:         RF_OK: 			the operation was succesfull
  +                 RF_ERROR_STATE: the actualy state of the stack is aborted.
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFDirectTransmit(void)
{	//enable transmitter
	uint8 temp8;

	if(RfState != sRFIdle)
		return RF_ERROR_STATE;

	temp8 = SpiRfReadRegister( OperatingFunctionControl1 );
	temp8 |= 0x09;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl1), temp8);

	//disable all the ITs
	SpiRfWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
	SpiRfWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
	//release all IT flag
	ItStatus1 = SpiRfReadRegister( InterruptStatus1 );
	ItStatus2 = SpiRfReadRegister( InterruptStatus2 );

	//disable EXT IT	
	DisableExt0It();
	//disable PHY timer
	StopTmr2();

	//set next state
	RfState = sRFPacketSent;

	return RF_OK;	
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RfTransmit(MESSAGE * Struct)
  +
  + DESCRIPTION:    starts packet transmission
  +
  + INPUT:			MESSAGE structure
  +
  + RETURN:         RF_OK: 				the operation was succesfull
  +                 RF_ERROR_STATE: 	the command is ignored, because the MAC 
  +										was not in STANDBY or IDLE state.
  +					RF_ERROR_TIMING: 	the command is ignored, there is 
  +										not enough time to wake up
  +					RF_ERROR_PARAMETER: the command is ignored, some of the 
  +										input parameter(s) are
  +										out of the valid range
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFTransmit(MESSAGE * Struct)
{
	uint8 temp8;

	if(RfState != sRFIdle)
		return RF_ERROR_STATE;

	//clear FIFO
	temp8 = SpiRfReadRegister( OperatingFunctionControl2 );
	temp8 |= 0x01;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl2), temp8);
	temp8 &= 0xFE;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl2), temp8);

	//set headers and filters
	//bug in revX: if txhdlen[2:0] is not 0, the length handled wrong way during RX!
	if( Struct -> header.enabled_headers == 0 )
	{//no TX header is enabled
		temp8 = SpiRfReadRegister( HeaderControl2 );
		temp8 &= 0x07;
		SpiRfWriteAddressData((REG_WRITE | HeaderControl2 ), temp8);
	}
	else
	{//TODO: header and header filter are enabled - NOT YET IMPLEMENTED
	}

	//set packet content
	SpiRfWriteAddressData((REG_WRITE | TransmitPacketLength), Struct -> length);					
	for(temp8=0;temp8<Struct -> length;temp8++)
	{
		SpiRfWriteAddressData((REG_WRITE | FIFOAccess),Struct -> payload[temp8]);		
	}
	
	//enable transmitter
	temp8 = SpiRfReadRegister( OperatingFunctionControl1 );
	temp8 |= 0x09;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl1), temp8);

	//enable the wanted ITs
	SpiRfWriteAddressData((REG_WRITE | InterruptEnable1), 0x04);
	SpiRfWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
	//release all IT flag
	ItStatus1 = SpiRfReadRegister( InterruptStatus1 );
	ItStatus2 = SpiRfReadRegister( InterruptStatus2 );

	//enable EXT IT
	EnableExt0It();
	//start timeout for packet transmitting 
	RfTimer.U16 = ByteTime * TX_PACKET_LENGTH;
	Tmr2SwPrescaler = BYTE_TIME_SW_DIV;
	StartTmr2(BYTE_TIME_DIV,RfTimer,TRUE);

	//set next state
	RfState = sRFTransmitting;

	return RF_OK;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RFDirectReceive(void)
  +
  + DESCRIPTION:    starts direct reception
  +
  + INPUT:			None
  +
  + RETURN:         RF_OK: 				the operation was succesfull
  +                 RF_ERROR_STATE: 	the command is ignored, because the MAC 
  +										was not in STANDBY or IDLE state.
  +					RF_ERROR_TIMING: 	the command is ignored, there is
  +									 	not enough time to wake up
  +					RF_ERROR_PARAMETER: the command is ignored,some of the 
  +										input parameter(s) are
  +										out of the valid range
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFDirectReceive(void)
{
	uint8 temp8;

	if( RfState != sRFIdle )
		return RF_ERROR_STATE;

	//enable receiver chain
	temp8 = SpiRfReadRegister( OperatingFunctionControl1 );
	temp8 |= 0x05;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl1), temp8);	

	//disable all the ITs
	SpiRfWriteAddressData((REG_WRITE | InterruptEnable1), 0x00);
	SpiRfWriteAddressData((REG_WRITE | InterruptEnable2), 0x00);
	//release all IT flag
	ItStatus1 = SpiRfReadRegister( InterruptStatus1 );
	ItStatus2 = SpiRfReadRegister( InterruptStatus2 );

	//enable EXT IT
	DisableExt0It();
	//disable PHY timer
	StopTmr2();

	//set next state
	RfState = sRFPacketReceived;
	
	fPacketReceived = FALSE;

	return RF_OK;
}


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  RF_ENUM RFReceive(RECEIVE_COMMAND * Struct)
  +
  + DESCRIPTION:    starts packet reception
  +
  + INPUT:			RECEIVE_COMMAND structure
  +
  + RETURN:         RF_OK: 				the operation was succesfull
  +                 RF_ERROR_STATE: 	the command is ignored, because the MAC 
  +										was not in STANDBY or IDLE state.
  +					RF_ERROR_TIMING: 	the command is ignored, there is
  +									 	not enough time to wake up
  +					RF_ERROR_PARAMETER: the command is ignored,some of the 
  +										input parameter(s) are
  +										out of the valid range
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
RF_ENUM RFReceive(RECEIVE_COMMAND * Struct)
{
	uint8 temp8;

	if( RfState != sRFIdle )
		return RF_ERROR_STATE;

	//clear FIFO
	temp8 = SpiRfReadRegister( OperatingFunctionControl2 );
	temp8 |= 0x02;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl2), temp8);
	temp8 &= 0xFD;
	SpiRfWriteAddressData((REG_WRITE | OperatingFunctionControl2), temp8);

	//set headers and filters
	if( Struct -> header.enabled_headers == 0 )

⌨️ 快捷键说明

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