diff --git a/software/libcariboulite/src/caribou_smi/caribou_smi.c b/software/libcariboulite/src/caribou_smi/caribou_smi.c index 1366d27..5d5a974 100644 --- a/software/libcariboulite/src/caribou_smi/caribou_smi.c +++ b/software/libcariboulite/src/caribou_smi/caribou_smi.c @@ -551,6 +551,7 @@ int caribou_smi_init(caribou_smi_st* dev, memset(&dev->debug_data, 0, sizeof(caribou_smi_debug_data_st)); dev->debug_mode = caribou_smi_none; + dev->invert_iq = false; dev->initialized = 1; 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; } +//========================================================================= +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, caribou_smi_sample_complex_int16* samples, diff --git a/software/libcariboulite/src/caribou_smi/caribou_smi.h b/software/libcariboulite/src/caribou_smi/caribou_smi.h index 7cb5627..37b6294 100644 --- a/software/libcariboulite/src/caribou_smi/caribou_smi.h +++ b/software/libcariboulite/src/caribou_smi/caribou_smi.h @@ -67,6 +67,8 @@ typedef struct uint8_t *read_temp_buffer; uint8_t *write_temp_buffer; + + bool invert_iq; // debugging 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_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); 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); diff --git a/software/libcariboulite/src/cariboulite_radio.c b/software/libcariboulite/src/cariboulite_radio.c index 4a40f44..6cdf8fb 100644 --- a/software/libcariboulite/src/cariboulite_radio.c +++ b/software/libcariboulite/src/cariboulite_radio.c @@ -72,11 +72,13 @@ int cariboulite_radio_ext_ref ( sys_st *sys, cariboulite_ext_ref_freq_en ref) ZF_LOGD("Setting ext_ref = 26MHz"); at86rf215_set_clock_output(&sys->modem, at86rf215_drive_current_8ma, at86rf215_clock_out_freq_26mhz); rffc507x_setup_reference_freq(&sys->mixer, 26e6); + rffc507x_calibrate(&sys->mixer); break; case cariboulite_ext_ref_32mhz: ZF_LOGD("Setting ext_ref = 32MHz"); at86rf215_set_clock_output(&sys->modem, at86rf215_drive_current_8ma, at86rf215_clock_out_freq_32mhz); rffc507x_setup_reference_freq(&sys->mixer, 32e6); + rffc507x_calibrate(&sys->mixer); break; case cariboulite_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, modem_freq); - // setup mixer LO according to the actual modem frequency - lo_act_freq = rffc507x_set_frequency(&radio->sys->mixer, modem_act_freq + f_rf); - act_freq = lo_act_freq - modem_act_freq; + // setup mixer LO according to the actual modem frequency + lo_act_freq = rffc507x_set_frequency(&radio->sys->mixer, modem_act_freq - f_rf); + act_freq = modem_act_freq - lo_act_freq; // setup fpga RFFE <= upconvert (tx / rx) conversion_direction = conversion_dir_up; + caribou_smi_invert_iq(&radio->sys->smi, true); } //------------------------------------- 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; act_freq = modem_act_freq; conversion_direction = conversion_dir_none; + caribou_smi_invert_iq(&radio->sys->smi, true); } //------------------------------------- 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) conversion_direction = conversion_dir_down; + caribou_smi_invert_iq(&radio->sys->smi, true); } //------------------------------------- else diff --git a/software/libcariboulite/src/rffc507x/rffc507x.c b/software/libcariboulite/src/rffc507x/rffc507x.c index edef6cb..0554c3a 100644 --- a/software/libcariboulite/src/rffc507x/rffc507x.c +++ b/software/libcariboulite/src/rffc507x/rffc507x.c @@ -148,14 +148,13 @@ int rffc507x_init( rffc507x_st* dev, set_RFFC507X_MODE(dev, 1); // put zeros in freq contol registers - //set_RFFC507X_P2VCOSEL(dev, 0); - //set_RFFC507X_CTMAX(dev, 127); - //set_RFFC507X_CTMIN(dev, 0); - //set_RFFC507X_P2CTV(dev, 12); - //set_RFFC507X_P1CTV(dev, 12); - set_RFFC507X_RGBYP(dev, 1); - //set_RFFC507X_P2MIXIDD(dev, 4); - //set_RFFC507X_P1MIXIDD(dev, 4); + set_RFFC507X_P2VCOSEL(dev, 0); + set_RFFC507X_CTMIN(dev, 0); + set_RFFC507X_CTMAX(dev, 127); + set_RFFC507X_P2CTV(dev, 12); + set_RFFC507X_RGBYP(dev, 1); + set_RFFC507X_FULLD(dev, 0); + set_RFFC507X_P2MIXIDD(dev, 4); // Others 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_P2N(dev, n); 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_P2NLSB(dev, p1nlsb);