📄 ia443x_rf.c
字号:
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 + -