fix: 调整跳频逻辑,增加nco update req持续时间;调整频点生成方式

This commit is contained in:
2024-11-08 15:48:25 +08:00
parent 775590f3f7
commit 814724c417
8 changed files with 123 additions and 111 deletions
@@ -94,15 +94,15 @@
#endif
#define LMK04828
#define LMX2594_ADC
#define LMX2594_DAC
#define AD9528
//#define LMX2594_ADC
//#define LMX2594_DAC
//#define AD9528
#define AD9361_REG
#define AD9361_API
//#define AD9361_REG
//#define AD9361_API
#define AD9653
#define AD9694
//#define AD9653
//#define AD9694
// AD9361 Configuration
#define SPI_INTERFACE_SPI_ENGINE
@@ -18,6 +18,7 @@
// Standard
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
// Xilinx
#include "xgpiops.h"
#include "drivers/axi_core/spi_engine/spi_engine.h"
@@ -839,9 +840,9 @@ int32_t Hardware_Init(void)
int32_t Status;
// gpio initialization
Status = Hardware_GpioInit(&Gpio, AD9361_GPIO_DEVICE_ID);
Status = Hardware_GpioInit(&Gpio, AD9361_GPIO_DEVICE_ID);
#ifdef RFSOC
#ifdef RFSOC
// rf data converter initialization
Status |= Hardware_RFdcInit(&RFdc, RFDC_DEVICE_ID);
#endif
@@ -882,36 +883,6 @@ int32_t Hardware_Init(void)
#ifdef AD9694
Status |= Hardware_AD9694Init(ad9694_inst, &ad9694_default_init_param);
#endif
XBram freqHopBram;
XBram_Config *xbramConfigPtr;
xbramConfigPtr = XBram_LookupConfig(HOP_DEVICE_ID);
Status = XBram_CfgInitialize(&freqHopBram, xbramConfigPtr,
xbramConfigPtr->CtrlBaseAddress);
if(Status != SUCCESS) {
DBG_ERROR("");
}
Status = XBram_SelfTest(&freqHopBram, 0x00);
if(Status != SUCCESS) {
DBG_ERROR("");
}
uint64_t array[128];
uint64_t min_freq = 2800;
uint64_t max_freq = 4400;
uint64_t freq_num = 201;
uint64_t freq_step = (max_freq-min_freq)/(freq_num-1);
array[0] = freq_num;
for (int ii = 1; ii < freq_num; ii++)
{
array[ii] = min_freq + ii*freq_step;
}
size_t word_len = freqHopBram.Config.DataWidth/sizeof(uint64_t);
size_t array_len = sizeof(array);
size_t array_len_aligned = (array_len + word_len - 1) / word_len * word_len;
memcpy(freqHopBram.Config.MemBaseAddress, array, array_len_aligned);
#ifdef RFSOC
/*
@@ -928,31 +899,31 @@ int32_t Hardware_Init(void)
*
*/
// // get & set mixer settings
// XRFdc_Mixer_Settings Mixer_Settings_DAC;
//
// // 3th channel
// Status = XRFdc_GetMixerSettings(&RFdc, XRFDC_DAC_TILE, XRFDC_TILE_ID1,
// XRFDC_BLK_ID0, &Mixer_Settings_DAC);
// if (Status != XST_SUCCESS) {
// return XST_FAILURE;
// }
//
// Mixer_Settings_DAC.Freq = 1500;
//
// Status = XRFdc_SetMixerSettings(&RFdc, XRFDC_DAC_TILE, XRFDC_TILE_ID1,
// XRFDC_BLK_ID0, &Mixer_Settings_DAC);
// if (Status != XST_SUCCESS) {
// return XST_FAILURE;
// }
//
// mdelay(100);
//
// Status = XRFdc_UpdateEvent(&RFdc, XRFDC_DAC_TILE, XRFDC_TILE_ID1,
// XRFDC_BLK_ID0, XRFDC_EVENT_MIXER);
// if (Status != XST_SUCCESS) {
// return XST_FAILURE;
// }
// get & set mixer settings
XRFdc_Mixer_Settings Mixer_Settings_DAC;
// 3rd channel
Status = XRFdc_GetMixerSettings(&RFdc, XRFDC_DAC_TILE, XRFDC_TILE_ID1,
XRFDC_BLK_ID0, &Mixer_Settings_DAC);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Mixer_Settings_DAC.Freq = 500;
Status = XRFdc_SetMixerSettings(&RFdc, XRFDC_DAC_TILE, XRFDC_TILE_ID1,
XRFDC_BLK_ID0, &Mixer_Settings_DAC);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
mdelay(100);
Status = XRFdc_UpdateEvent(&RFdc, XRFDC_DAC_TILE, XRFDC_TILE_ID1,
XRFDC_BLK_ID0, XRFDC_EVENT_MIXER);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
/*
* ADC Mapping:
@@ -962,38 +933,74 @@ int32_t Hardware_Init(void)
* 3 (VIN1_01) 225 (XRFDC_TILE_ID1) ADC 0 (XRFDC_BLK_ID0)
* 4 (VIN1_23) 225 (XRFDC_TILE_ID1) ADC 1 (XRFDC_BLK_ID1)
* 5 (VIN2_01) 226 (XRFDC_TILE_ID2) ADC 0 (XRFDC_BLK_ID0)
* 6 (VIN2_23) 227 (XRFDC_TILE_ID2) ADC 1 (XRFDC_BLK_ID1)
* 7 (VIN3_01) 224 (XRFDC_TILE_ID0) ADC 0 (XRFDC_BLK_ID0)
* 6 (VIN2_23) 226 (XRFDC_TILE_ID2) ADC 1 (XRFDC_BLK_ID1)
* 7 (VIN3_01) 227 (XRFDC_TILE_ID3) ADC 0 (XRFDC_BLK_ID0)
* 8 (VIN3_23) 227 (XRFDC_TILE_ID3) ADC 1 (XRFDC_BLK_ID1)
*
*/
// // get & set mixer settings
// XRFdc_Mixer_Settings Mixer_Settings_ADC;
//
// // 3rd channel
// Status = XRFdc_GetMixerSettings(&RFdc, XRFDC_ADC_TILE, XRFDC_TILE_ID1,
// XRFDC_BLK_ID0, &Mixer_Settings_ADC);
// if (Status != XST_SUCCESS) {
// return XST_FAILURE;
// }
//
// Mixer_Settings_ADC.Freq = 1500;
// Mixer_Settings_ADC.EventSource = XRFDC_EVNT_SRC_TILE;
//
// Status = XRFdc_SetMixerSettings(&RFdc, XRFDC_ADC_TILE, XRFDC_TILE_ID1,
// XRFDC_BLK_ID0, &Mixer_Settings_ADC);
// if (Status != XST_SUCCESS) {
// return XST_FAILURE;
// }
//
// mdelay(100);
//
// Status = XRFdc_UpdateEvent(&RFdc, XRFDC_ADC_TILE, XRFDC_TILE_ID1,
// XRFDC_BLK_ID0, XRFDC_EVENT_MIXER);
// if (Status != XST_SUCCESS) {
// return XST_FAILURE;
// }
// get & set mixer settings
XRFdc_Mixer_Settings Mixer_Settings_ADC;
// 7th channel
Status = XRFdc_GetMixerSettings(&RFdc, XRFDC_ADC_TILE, XRFDC_TILE_ID3,
XRFDC_BLK_ID0, &Mixer_Settings_ADC);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Mixer_Settings_ADC.Freq = 500;
Mixer_Settings_ADC.EventSource = XRFDC_EVNT_SRC_TILE;
Status = XRFdc_SetMixerSettings(&RFdc, XRFDC_ADC_TILE, XRFDC_TILE_ID3,
XRFDC_BLK_ID0, &Mixer_Settings_ADC);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
mdelay(100);
Status = XRFdc_UpdateEvent(&RFdc, XRFDC_ADC_TILE, XRFDC_TILE_ID3,
XRFDC_BLK_ID0, XRFDC_EVENT_MIXER);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
// hop ram
XBram freqHopBram;
XBram_Config *xbramConfigPtr;
xbramConfigPtr = XBram_LookupConfig(HOP_DEVICE_ID);
Status = XBram_CfgInitialize(&freqHopBram, xbramConfigPtr,
xbramConfigPtr->CtrlBaseAddress);
if(Status != SUCCESS) {
DBG_ERROR("");
}
Status = XBram_SelfTest(&freqHopBram, 0x00);
if(Status != SUCCESS) {
DBG_ERROR("");
}
uint64_t array[1024];
double min_freq = 500;
double max_freq = 2100;
double freq_step = 50;
uint64_t total_freq_num = (uint64_t)(floor((max_freq-min_freq)/freq_step)+1);
uint64_t hop_freq_num = (uint64_t)(floor((total_freq_num-1)/2)*3);
array[0] = hop_freq_num;
for (int ii = 0; ii < hop_freq_num/3; ii++)
{
array[3*ii + 1] = (uint64_t)(min_freq/4800*pow(2,48));
array[3*ii + 2] = (uint64_t)((min_freq + (2*ii+1)*freq_step)/4800*pow(2,48));
array[3*ii + 3] = (uint64_t)((min_freq + (2*ii+2)*freq_step)/4800*pow(2,48));
}
size_t word_len = freqHopBram.Config.DataWidth/sizeof(uint64_t);
size_t array_len = sizeof(array);
size_t array_len_aligned = (array_len + word_len - 1) / word_len * word_len;
memcpy(freqHopBram.Config.MemBaseAddress, array, array_len_aligned);
#endif