@ -54,6 +54,11 @@ volatile uint32_t AD7021_CONTROL;
uint32_t ADF7021_RX_REG0 ;
uint32_t ADF7021_RX_REG0 ;
uint32_t ADF7021_TX_REG0 ;
uint32_t ADF7021_TX_REG0 ;
uint32_t ADF7021_REG1 ;
uint32_t ADF7021_REG1 ;
uint32_t ADF7021_REG2 ;
uint32_t ADF7021_REG3 ;
uint32_t ADF7021_REG4 ;
uint32_t ADF7021_REG10 ;
uint32_t ADF7021_REG13 ;
uint32_t div2 ;
uint32_t div2 ;
uint32_t f_div ;
uint32_t f_div ;
@ -290,11 +295,6 @@ void IO::interrupt2()
/// <param name="reset"></param>
/// <param name="reset"></param>
void IO : : rf1Conf ( DVM_STATE modemState , bool reset )
void IO : : rf1Conf ( DVM_STATE modemState , bool reset )
{
{
uint32_t ADF7021_REG2 = 0U ;
uint32_t ADF7021_REG3 = 0U ;
uint32_t ADF7021_REG4 = 0U ;
uint32_t ADF7021_REG10 = 0U ;
uint32_t ADF7021_REG13 = 0U ;
int32_t AFC_OFFSET = 0 ;
int32_t AFC_OFFSET = 0 ;
uint32_t txFrequencyTmp , rxFrequencyTmp ;
uint32_t txFrequencyTmp , rxFrequencyTmp ;
@ -375,226 +375,8 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
ADF7021_TX_REG0 | = ( uint32_t ) TX_N_Divider < < 19 ; // frequency - 15-bit Frac_N
ADF7021_TX_REG0 | = ( uint32_t ) TX_N_Divider < < 19 ; // frequency - 15-bit Frac_N
ADF7021_TX_REG0 | = ( uint32_t ) TX_F_Divider < < 4 ; // frequency - 8-bit Int_N
ADF7021_TX_REG0 | = ( uint32_t ) TX_F_Divider < < 4 ; // frequency - 8-bit Int_N
/*
// configure ADF Tx/RX
* * Configure the remaining registers based on modem state .
configureTxRx ( modemState ) ;
*/
switch ( modemState ) {
case STATE_CW : // 4FSK
{
// Dev: +1 symb (variable), symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DMR ;
ADF7021_REG10 = ADF7021_REG10_DMR ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_DMR ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_DMR + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_DMR ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_DMR + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 30 ; // IF filter (25 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DMR < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( m_cwIdTXLevel / div2 ) < < 19 ; // deviation
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
}
break ;
case STATE_DMR : // 4FSK
{
// Dev: +1 symb 648 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DMR ;
ADF7021_REG10 = ADF7021_REG10_DMR ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_DMR ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_DMR + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_DMR ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_DMR + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 30 ; // IF filter (25 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DMR < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( dmrDev / div2 ) < < 19 ; // deviation
# if defined(ADF7021_DISABLE_RC_4FSK)
ADF7021_REG2 | = ( uint32_t ) 0b011 < < 4 ; // modulation (4FSK)
# else
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
# endif
}
break ;
case STATE_P25 : // 4FSK
{
// Dev: +1 symb 600 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_P25 ;
ADF7021_REG10 = ADF7021_REG10_P25 ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_P25 ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_P25 + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_P25 ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_P25 + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b00 < < 30 ; // IF filter (12.5 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_P25 < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( p25Dev / div2 ) < < 19 ; // deviation
# if defined(ENABLE_P25_WIDE) || defined(ADF7021_DISABLE_RC_4FSK)
ADF7021_REG2 | = ( uint32_t ) 0b011 < < 4 ; // modulation (4FSK)
# else
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
# endif
}
break ;
default : // GMSK
{
// Dev: 1200 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DEFAULT ;
ADF7021_REG10 = ADF7021_REG10_DEFAULT ;
/*
* * Demodulator Setup ( Register 4 )
*/
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b001 < < 4 ; // mode, GMSK
ADF7021_REG4 | = ( uint32_t ) 0b1 < < 7 ; // dot product
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 8 ; // invert data
ADF7021_REG4 | = ( uint32_t ) ADF7021_DISC_BW_DEFAULT < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ADF7021_POST_BW_DEFAULT < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b00 < < 30 ; // IF filter (12.5 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DEFAULT < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b00 < < 28 ; // normal
ADF7021_REG2 | = ( uint32_t ) ( ADF7021_DEV_DEFAULT / div2 ) < < 19 ; // deviation
ADF7021_REG2 | = ( uint32_t ) 0b001 < < 4 ; // modulation (GMSK)
}
break ;
}
// write registers
// write registers
/*
/*
@ -718,191 +500,27 @@ void IO::rf1Conf(DVM_STATE modemState, bool reset)
/// <param name="reset"></param>
/// <param name="reset"></param>
void IO : : rf2Conf ( DVM_STATE modemState )
void IO : : rf2Conf ( DVM_STATE modemState )
{
{
uint32_t ADF7021_REG2 = 0U ;
// configure ADF Tx/RX
uint32_t ADF7021_REG3 = 0U ;
configureTxRx ( modemState ) ;
uint32_t ADF7021_REG4 = 0U ;
uint32_t ADF7021_REG10 = 0U ;
uint32_t ADF7021_REG13 = 0U ;
switch ( modemState ) {
// write registers
case STATE_DMR : // 4FSK
/*
{
* * VCO / Oscillator ( Register 1 )
// Dev: +1 symb 648 Hz, symb rate = 4800
*/
AD7021_CONTROL = ADF7021_REG1 ;
AD7021_2_IOCTL ( ) ;
/*
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
* * Tx / Rx Clock ( Register 3 )
*/
*/
ADF7021_REG3 = ADF7021_REG3_DMR ;
AD7021_CONTROL = ADF7021_REG3 ;
ADF7021_REG10 = ADF7021_REG10_DMR ;
AD7021_2_IOCTL ( ) ;
/*
/*
* * Demodulator Setup ( Register 4 )
* * Demodulator Setup ( Register 4 )
*/
*/
uint16_t discBW = ADF7021_DISC_BW_DMR ;
AD7021_CONTROL = ADF7021_REG4 ;
if ( discBW + m_dmrDiscBWAdj < 0U )
AD7021_2_IOCTL ( ) ;
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_DMR + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_DMR ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_DMR + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 30 ; // IF filter (25 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DMR < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( dmrDev / div2 ) < < 19 ; // deviation
# if defined(ADF7021_DISABLE_RC_4FSK)
ADF7021_REG2 | = ( uint32_t ) 0b011 < < 4 ; // modulation (4FSK)
# else
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
# endif
}
break ;
case STATE_P25 : // 4FSK
{
// Dev: +1 symb 600 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_P25 ;
ADF7021_REG10 = ADF7021_REG10_P25 ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_P25 ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_P25 + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_P25 ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_P25 + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b00 < < 30 ; // IF filter (12.5 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_P25 < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( p25Dev / div2 ) < < 19 ; // deviation
# if defined(ENABLE_P25_WIDE) || defined(ADF7021_DISABLE_RC_4FSK)
ADF7021_REG2 | = ( uint32_t ) 0b011 < < 4 ; // modulation (4FSK)
# else
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
# endif
}
break ;
default : // GMSK
{
// Dev: 1200 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DEFAULT ;
ADF7021_REG10 = ADF7021_REG10_DEFAULT ;
/*
* * Demodulator Setup ( Register 4 )
*/
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b001 < < 4 ; // mode, GMSK
ADF7021_REG4 | = ( uint32_t ) 0b1 < < 7 ; // dot product
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 8 ; // invert data
ADF7021_REG4 | = ( uint32_t ) ADF7021_DISC_BW_DEFAULT < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ADF7021_POST_BW_DEFAULT < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b00 < < 30 ; // IF filter (12.5 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DEFAULT < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b00 < < 28 ; // normal
ADF7021_REG2 | = ( uint32_t ) ( ADF7021_DEV_DEFAULT / div2 ) < < 19 ; // deviation
ADF7021_REG2 | = ( uint32_t ) 0b001 < < 4 ; // modulation (GMSK)
}
break ;
}
// write registers
/*
* * VCO / Oscillator ( Register 1 )
*/
AD7021_CONTROL = ADF7021_REG1 ;
AD7021_2_IOCTL ( ) ;
/*
* * Tx / Rx Clock ( Register 3 )
*/
AD7021_CONTROL = ADF7021_REG3 ;
AD7021_2_IOCTL ( ) ;
/*
* * Demodulator Setup ( Register 4 )
*/
AD7021_CONTROL = ADF7021_REG4 ;
AD7021_2_IOCTL ( ) ;
/*
/*
* * IF Fine Cal Setup ( Register 6 )
* * IF Fine Cal Setup ( Register 6 )
@ -1015,7 +633,7 @@ void IO::setRFAdjust(int8_t dmrDiscBWAdj, int8_t p25DiscBWAdj, int8_t dmrPostBWA
/// <summary>
/// <summary>
///
///
/// </summary>
/// </summary>
void IO : : updateCal ( )
void IO : : updateCal ( DVM_STATE modemState )
{
{
uint32_t ADF7021_REG2 ;
uint32_t ADF7021_REG2 ;
float divider ;
float divider ;
@ -1028,19 +646,13 @@ void IO::updateCal()
AD7021_CONTROL = ADF7021_REG1 ;
AD7021_CONTROL = ADF7021_REG1 ;
AD7021_1_IOCTL ( ) ;
AD7021_1_IOCTL ( ) ;
// configure ADF Tx/RX
configureTxRx ( modemState ) ;
/*
/*
* * Transmit Modulation ( Register 2 )
* * Demodulator Setup ( Register 4 )
*/
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
AD7021_CONTROL = ADF7021_REG4 ;
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
if ( m_modemState = = STATE_DMR ) {
ADF7021_REG2 | = ( uint32_t ) ( dmrDev / div2 ) < < 19 ; // DMR deviation
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
}
AD7021_CONTROL = ADF7021_REG2 ;
AD7021_1_IOCTL ( ) ;
AD7021_1_IOCTL ( ) ;
/*
/*
@ -1067,6 +679,12 @@ void IO::updateCal()
ADF7021_TX_REG0 | = ( uint32_t ) TX_N_Divider < < 19 ; // frequency - 15-bit Frac_N
ADF7021_TX_REG0 | = ( uint32_t ) TX_N_Divider < < 19 ; // frequency - 15-bit Frac_N
ADF7021_TX_REG0 | = ( uint32_t ) TX_F_Divider < < 4 ; // frequency - 8-bit Int_N
ADF7021_TX_REG0 | = ( uint32_t ) TX_F_Divider < < 4 ; // frequency - 8-bit Int_N
/*
* * Transmit Modulation ( Register 2 )
*/
AD7021_CONTROL = ADF7021_REG2 ;
AD7021_1_IOCTL ( ) ;
if ( m_tx )
if ( m_tx )
setTX ( ) ;
setTX ( ) ;
else
else
@ -1102,7 +720,7 @@ uint16_t IO::readRSSI()
SDATA ( LOW ) ;
SDATA ( LOW ) ;
# if defined(DUPLEX)
# if defined(DUPLEX)
if ( m_duplex | | m_ cal State = = STATE_RSSI_CAL )
if ( m_duplex | | m_ modem State = = STATE_RSSI_CAL )
SLE2 ( HIGH ) ;
SLE2 ( HIGH ) ;
else
else
SLE1 ( HIGH ) ;
SLE1 ( HIGH ) ;
@ -1125,7 +743,7 @@ uint16_t IO::readRSSI()
}
}
# if defined(DUPLEX)
# if defined(DUPLEX)
if ( m_duplex | | m_ cal State = = STATE_RSSI_CAL )
if ( m_duplex | | m_ modem State = = STATE_RSSI_CAL )
SLE2 ( LOW ) ;
SLE2 ( LOW ) ;
else
else
SLE1 ( LOW ) ;
SLE1 ( LOW ) ;
@ -1234,6 +852,234 @@ void IO::configureBand()
f_div = 1U ;
f_div = 1U ;
}
}
/// <summary>
///
/// </summary>
/// <param name="modemState"></param>
void IO : : configureTxRx ( DVM_STATE modemState )
{
/*
* * Configure the remaining registers based on modem state .
*/
switch ( modemState ) {
case STATE_CW : // 4FSK
{
// Dev: +1 symb (variable), symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DMR ;
ADF7021_REG10 = ADF7021_REG10_DMR ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_DMR ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_DMR + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_DMR ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_DMR + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 30 ; // IF filter (25 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DMR < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( m_cwIdTXLevel / div2 ) < < 19 ; // deviation
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
}
break ;
case STATE_DMR : // 4FSK
{
// Dev: +1 symb 648 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DMR ;
ADF7021_REG10 = ADF7021_REG10_DMR ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_DMR ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_DMR + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_DMR ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_DMR + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 30 ; // IF filter (25 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DMR < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( dmrDev / div2 ) < < 19 ; // deviation
# if defined(ADF7021_DISABLE_RC_4FSK)
ADF7021_REG2 | = ( uint32_t ) 0b011 < < 4 ; // modulation (4FSK)
# else
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
# endif
}
break ;
case STATE_P25 : // 4FSK
{
// Dev: +1 symb 600 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_P25 ;
ADF7021_REG10 = ADF7021_REG10_P25 ;
/*
* * Demodulator Setup ( Register 4 )
*/
uint16_t discBW = ADF7021_DISC_BW_P25 ;
if ( discBW + m_dmrDiscBWAdj < 0U )
discBW = 0U ;
else
discBW = ADF7021_DISC_BW_P25 + m_dmrDiscBWAdj ;
if ( discBW > ADF7021_DISC_BW_MAX )
discBW = ADF7021_DISC_BW_MAX ;
uint16_t postBW = ADF7021_POST_BW_P25 ;
if ( postBW + m_dmrPostBWAdj < 0 )
postBW = 0U ;
else
postBW = ADF7021_POST_BW_P25 + m_dmrPostBWAdj ;
if ( postBW > ADF7021_POST_BW_MAX )
postBW = ADF7021_POST_BW_MAX ;
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b011 < < 4 ; // mode, 4FSK
ADF7021_REG4 | = ( uint32_t ) 0b0 < < 7 ; // cross product
ADF7021_REG4 | = ( uint32_t ) 0b11 < < 8 ; // invert clk/data
ADF7021_REG4 | = ( uint32_t ) ( discBW & 0x3FFU ) < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ( postBW & 0xFFFU ) < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b00 < < 30 ; // IF filter (12.5 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_P25 < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b10 < < 28 ; // invert data (and RC alpha = 0.5)
ADF7021_REG2 | = ( uint32_t ) ( p25Dev / div2 ) < < 19 ; // deviation
# if defined(ENABLE_P25_WIDE) || defined(ADF7021_DISABLE_RC_4FSK)
ADF7021_REG2 | = ( uint32_t ) 0b011 < < 4 ; // modulation (4FSK)
# else
ADF7021_REG2 | = ( uint32_t ) 0b111 < < 4 ; // modulation (RC 4FSK)
# endif
}
break ;
default : // GMSK
{
// Dev: 1200 Hz, symb rate = 4800
/*
* * Tx / Rx Clock ( Register 3 ) & AFC ( Register 10 )
*/
ADF7021_REG3 = ADF7021_REG3_DEFAULT ;
ADF7021_REG10 = ADF7021_REG10_DEFAULT ;
/*
* * Demodulator Setup ( Register 4 )
*/
// K=32
ADF7021_REG4 = ( uint32_t ) 0b0100 < < 0 ; // register 4
ADF7021_REG4 | = ( uint32_t ) 0b001 < < 4 ; // mode, GMSK
ADF7021_REG4 | = ( uint32_t ) 0b1 < < 7 ; // dot product
ADF7021_REG4 | = ( uint32_t ) 0b10 < < 8 ; // invert data
ADF7021_REG4 | = ( uint32_t ) ADF7021_DISC_BW_DEFAULT < < 10 ; // discriminator BW
ADF7021_REG4 | = ( uint32_t ) ADF7021_POST_BW_DEFAULT < < 20 ; // post demod BW
ADF7021_REG4 | = ( uint32_t ) 0b00 < < 30 ; // IF filter (12.5 kHz)
/*
* * 3F SK / 4F SK Demod ( Register 13 )
*/
ADF7021_REG13 = ( uint32_t ) 0b1101 < < 0 ; // register 13
ADF7021_REG13 | = ( uint32_t ) ADF7021_SLICER_TH_DEFAULT < < 4 ; // slicer threshold
/*
* * Transmit Modulation ( Register 2 )
*/
ADF7021_REG2 = ( uint32_t ) 0b0010 ; // register 2
ADF7021_REG2 | = ( uint32_t ) m_rfPower < < 13 ; // power level
ADF7021_REG2 | = ( uint32_t ) 0b110001 < < 7 ; // PA
ADF7021_REG2 | = ( uint32_t ) 0b00 < < 28 ; // normal
ADF7021_REG2 | = ( uint32_t ) ( ADF7021_DEV_DEFAULT / div2 ) < < 19 ; // deviation
ADF7021_REG2 | = ( uint32_t ) 0b001 < < 4 ; // modulation (GMSK)
}
break ;
}
}
/// <summary>
/// <summary>
///
///
/// </summary>
/// </summary>