rffc frequency conversion bugfix

bug_fixes_integration_tx
David Michaeli 2023-06-06 10:33:26 +00:00
rodzic 5ff5f17f0b
commit c42552dfff
4 zmienionych plików z 28 dodań i 12 usunięć

Wyświetl plik

@ -551,6 +551,7 @@ int caribou_smi_init(caribou_smi_st* dev,
memset(&dev->debug_data, 0, sizeof(caribou_smi_debug_data_st)); memset(&dev->debug_data, 0, sizeof(caribou_smi_debug_data_st));
dev->debug_mode = caribou_smi_none; dev->debug_mode = caribou_smi_none;
dev->invert_iq = false;
dev->initialized = 1; dev->initialized = 1;
return 0; return 0;
@ -573,6 +574,12 @@ void caribou_smi_set_debug_mode(caribou_smi_st* dev, caribou_smi_debug_mode_en m
dev->debug_mode = mode; dev->debug_mode = mode;
} }
//=========================================================================
void caribou_smi_invert_iq(caribou_smi_st* dev, bool invert)
{
dev->invert_iq = invert;
}
//========================================================================= //=========================================================================
int caribou_smi_read(caribou_smi_st* dev, caribou_smi_channel_en channel, int caribou_smi_read(caribou_smi_st* dev, caribou_smi_channel_en channel,
caribou_smi_sample_complex_int16* samples, caribou_smi_sample_complex_int16* samples,

Wyświetl plik

@ -67,6 +67,8 @@ typedef struct
uint8_t *read_temp_buffer; uint8_t *read_temp_buffer;
uint8_t *write_temp_buffer; uint8_t *write_temp_buffer;
bool invert_iq;
// debugging // debugging
caribou_smi_debug_mode_en debug_mode; caribou_smi_debug_mode_en debug_mode;
@ -78,6 +80,8 @@ int caribou_smi_init(caribou_smi_st* dev,
int caribou_smi_close (caribou_smi_st* dev); int caribou_smi_close (caribou_smi_st* dev);
int caribou_smi_check_modules(bool reload); int caribou_smi_check_modules(bool reload);
void caribou_smi_invert_iq(caribou_smi_st* dev, bool invert);
void caribou_smi_set_debug_mode(caribou_smi_st* dev, caribou_smi_debug_mode_en mode); void caribou_smi_set_debug_mode(caribou_smi_st* dev, caribou_smi_debug_mode_en mode);
int caribou_smi_set_driver_streaming_state(caribou_smi_st* dev, smi_stream_state_en state); int caribou_smi_set_driver_streaming_state(caribou_smi_st* dev, smi_stream_state_en state);
smi_stream_state_en caribou_smi_get_driver_streaming_state(caribou_smi_st* dev); smi_stream_state_en caribou_smi_get_driver_streaming_state(caribou_smi_st* dev);

Wyświetl plik

@ -72,11 +72,13 @@ int cariboulite_radio_ext_ref ( sys_st *sys, cariboulite_ext_ref_freq_en ref)
ZF_LOGD("Setting ext_ref = 26MHz"); ZF_LOGD("Setting ext_ref = 26MHz");
at86rf215_set_clock_output(&sys->modem, at86rf215_drive_current_8ma, at86rf215_clock_out_freq_26mhz); at86rf215_set_clock_output(&sys->modem, at86rf215_drive_current_8ma, at86rf215_clock_out_freq_26mhz);
rffc507x_setup_reference_freq(&sys->mixer, 26e6); rffc507x_setup_reference_freq(&sys->mixer, 26e6);
rffc507x_calibrate(&sys->mixer);
break; break;
case cariboulite_ext_ref_32mhz: case cariboulite_ext_ref_32mhz:
ZF_LOGD("Setting ext_ref = 32MHz"); ZF_LOGD("Setting ext_ref = 32MHz");
at86rf215_set_clock_output(&sys->modem, at86rf215_drive_current_8ma, at86rf215_clock_out_freq_32mhz); at86rf215_set_clock_output(&sys->modem, at86rf215_drive_current_8ma, at86rf215_clock_out_freq_32mhz);
rffc507x_setup_reference_freq(&sys->mixer, 32e6); rffc507x_setup_reference_freq(&sys->mixer, 32e6);
rffc507x_calibrate(&sys->mixer);
break; break;
case cariboulite_ext_ref_off: case cariboulite_ext_ref_off:
ZF_LOGD("Setting ext_ref = OFF"); ZF_LOGD("Setting ext_ref = OFF");
@ -678,12 +680,13 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
at86rf215_rf_channel_2400mhz, at86rf215_rf_channel_2400mhz,
modem_freq); modem_freq);
// setup mixer LO according to the actual modem frequency // setup mixer LO according to the actual modem frequency
lo_act_freq = rffc507x_set_frequency(&radio->sys->mixer, modem_act_freq + f_rf); lo_act_freq = rffc507x_set_frequency(&radio->sys->mixer, modem_act_freq - f_rf);
act_freq = lo_act_freq - modem_act_freq; act_freq = modem_act_freq - lo_act_freq;
// setup fpga RFFE <= upconvert (tx / rx) // setup fpga RFFE <= upconvert (tx / rx)
conversion_direction = conversion_dir_up; conversion_direction = conversion_dir_up;
caribou_smi_invert_iq(&radio->sys->smi, true);
} }
//------------------------------------- //-------------------------------------
else if ( f_rf >= CARIBOULITE_2G4_MIN && else if ( f_rf >= CARIBOULITE_2G4_MIN &&
@ -698,6 +701,7 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
lo_act_freq = 0; lo_act_freq = 0;
act_freq = modem_act_freq; act_freq = modem_act_freq;
conversion_direction = conversion_dir_none; conversion_direction = conversion_dir_none;
caribou_smi_invert_iq(&radio->sys->smi, true);
} }
//------------------------------------- //-------------------------------------
else if ( f_rf >= (CARIBOULITE_2G4_MAX) && else if ( f_rf >= (CARIBOULITE_2G4_MAX) &&
@ -715,6 +719,7 @@ int cariboulite_radio_set_frequency(cariboulite_radio_state_st* radio,
// setup fpga RFFE <= downconvert (tx / rx) // setup fpga RFFE <= downconvert (tx / rx)
conversion_direction = conversion_dir_down; conversion_direction = conversion_dir_down;
caribou_smi_invert_iq(&radio->sys->smi, true);
} }
//------------------------------------- //-------------------------------------
else else

Wyświetl plik

@ -148,14 +148,13 @@ int rffc507x_init( rffc507x_st* dev,
set_RFFC507X_MODE(dev, 1); set_RFFC507X_MODE(dev, 1);
// put zeros in freq contol registers // put zeros in freq contol registers
//set_RFFC507X_P2VCOSEL(dev, 0); set_RFFC507X_P2VCOSEL(dev, 0);
//set_RFFC507X_CTMAX(dev, 127); set_RFFC507X_CTMIN(dev, 0);
//set_RFFC507X_CTMIN(dev, 0); set_RFFC507X_CTMAX(dev, 127);
//set_RFFC507X_P2CTV(dev, 12); set_RFFC507X_P2CTV(dev, 12);
//set_RFFC507X_P1CTV(dev, 12); set_RFFC507X_RGBYP(dev, 1);
set_RFFC507X_RGBYP(dev, 1); set_RFFC507X_FULLD(dev, 0);
//set_RFFC507X_P2MIXIDD(dev, 4); set_RFFC507X_P2MIXIDD(dev, 4);
//set_RFFC507X_P1MIXIDD(dev, 4);
// Others // Others
set_RFFC507X_LDEN(dev, 1); set_RFFC507X_LDEN(dev, 1);
@ -333,7 +332,8 @@ double rffc507x_set_frequency(rffc507x_st* dev, double lo_hz)
set_RFFC507X_P2LODIV(dev, n_lo); set_RFFC507X_P2LODIV(dev, n_lo);
set_RFFC507X_P2N(dev, n); set_RFFC507X_P2N(dev, n);
set_RFFC507X_P2PRESC(dev, fbkdiv >> 1); set_RFFC507X_P2PRESC(dev, fbkdiv >> 1);
set_RFFC507X_P2VCOSEL(dev, 2); //set_RFFC507X_P2VCOSEL(dev, 0);
set_RFFC507X_AUTO(dev, 1);
set_RFFC507X_P2NMSB(dev, p1nmsb); set_RFFC507X_P2NMSB(dev, p1nmsb);
set_RFFC507X_P2NLSB(dev, p1nlsb); set_RFFC507X_P2NLSB(dev, p1nlsb);