/** * @file cx9261adriver.h */ #ifndef CX9261ADRIVER_CX9261ADRIVER_H #define CX9261ADRIVER_CX9261ADRIVER_H #define VERSION 1.9.0 #include "defs.h" #ifdef USE_LOGGING # define LOGGING(x) logging(x); #else # define LOGGING(x) #endif namespace CX9261A { #ifdef USE_LOGGING /** * @brief 输出日志的函数 * @param msg 要输出的内容 */ void logging(const std::string& msg); #endif /** * @brief 需要实现的函数,实现SPI写入寄存器功能 * @param address 要写入的寄存器地址 * @param value 要写入的寄存器值 */ void writeSpi(int address, int value); /** * @brief 需要实现的函数,实现SPI读取寄存器功能 * @param address 要读取的寄存器地址 * @return 返回的寄存器值 */ int readSpi(int address); /** * @brief 需要实现的函数,实现等待功能 * @param ms 等待时间,单位毫秒 */ void pause(double ms); /** * @brief 需要实现的函数,实现配置FPGA对应寄存器功能 * @param pin 寄存器地址 * @param value 寄存器值 */ void setPin(int pin, int value); /** * @brief 初始化芯片状态,写入与具体配置无关的寄存器值 */ void initialChip(); /** * @brief 初始化电源配置,如果只自定义配置部分模式下的电源管理,在自定义配置之前需要先调用此函数 */ void initialPowerConfig(const CX9261AConfiguration& config); /** * @brief 初始化BBPLL相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void initialBBPLL(); /** * @brief 初始化PLL1相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void initialPLL1(); /** * @brief 初始化PLL2相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void initialPLL2(); /** * @brief 初始化PLL3相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void initialPLL3(); /** * @brief 初始化PLL4相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void initialPLL4(); /** * @brief 初始化PLL5相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void initialPLL5(); /** * @brief 配置受参考时钟频率影响的寄存器 * @param ref 参考时钟频率,单位MHz */ void configRef(double ref); /** * @brief 配置时钟相关寄存器,包括ADC和BBPLL * @param config CX9261A参数结构体 */ void configBBPLL(const CX9261AConfiguration& config); /** * @brief BBPLL AFC * @return 是否锁定 */ bool afcBBPll(); /** * @brief 配置PLL1频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void configPll1(double lo, const Clock& clock); /** * @brief Pll1 AFC * @return 是否锁定 */ bool afcPll1(); /** * @brief 配置PLL2频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void configPll2(double lo, const Clock& clock); /** * @brief Pll2 AFC * @return 是否锁定 */ bool afcPll2(); /** * @brief 配置PLL3频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void configPll3(double lo, const Clock& clock); /** * @brief Pll3 AFC * @return 是否锁定 */ bool afcPll3(); /** * @brief 配置PLL4频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void configPll4(double lo, const Clock& clock); /** * @brief Pll4 AFC * @return 是否锁定 */ bool afcPll4(); /** * @brief 配置PLL5频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void configPll5(double lo, const Clock& clock); /** * @brief Pll5 AFC * @return 是否锁定 */ bool afcPll5(); /** * @brief 配置AGC模式 * @param mode 模式0~13 */ void configAGCMode(int mode); /** * @brief 配置AGC PDT * @param pdt AGCPDT结构体 */ void configAGCPDT(const AGCPDT& pdt); /** * @brief 配置AGC LMT * @param lmt AGCLMT结构体 */ void configAGCLMT(const AGCLMT& lmt); /** * @brief 配置AGC DIG * @param dig AGCDIG结构体 */ void configAGCDIG(const AGCDIG& dig); /** * @brief 配置AGC * @param agc AGC结构体 */ void configAGC(const AGC& agc); /** * @brief 配置片内处理器,仅在使用需要处理器辅助的校准方法时需要开启处理器 * @param on 开启/关闭 */ void configRISCV(bool on); /** * @brief 配置温补 * @param mode 温补模式 DAC/Band */ void configTemperatureCompensation(TemperatureComp mode); /** * @brief ADC校准 * @param adc ADC速率 */ void configADCCalib(double adc); /** * @brief Flash校准 */ void configFlashCalib(); /** * @brief QEC校准会改变部分寄存器配置,在进行校准之前需要保存这部分寄存器,校准后恢复 * @return 包含寄存器地址和值的map */ std::map beforeQecState(); /** * @brief 恢复QEC校准过程中改变的寄存器 * @param state beforeQecState函数返回的map */ void restoreQecState(const std::map& state); /** * @brief 根据pll来源配置校准模式下的电源管理 * @param pllSource PllSource结构体 */ void preparePowerForRxCalib(const PllSource& pllSource); /** * @brief 调整校准时Pll的配置 * @param config CX9261A配置结构体 * @param chan 要进行校准的通道 */ void preparePllForRxCalib(const CX9261AConfiguration& config, RxChannel chan); /** * @brief 等待RxTST窄带校准结束,可重写 * @return 校准是否结束 */ bool waitRxTSTFinished(); /** * @brief RX时域统计校准 * @param chan 校准的RX通道 */ void rxTSTCalib(RxChannel chan); /** * @brief RX延时线校准 * @param fs ADC采样率 * @param chan 校准的RX通道 */ void rxDelayCalib(double fs, RxChannel chan); /** * @brief DC Tracking * @param config CX9261A配置结构体 */ void configDcCalib(const Calib& config); void configDcCalibMethod(DCCalibMethod method); void configDcTrackingLength(int length); void configDcHighPassFactor(int factor); /** * @brief Rx校准 * @param config CX9261A配置结构体 * @param chan 要进行校准的通道 */ void rxCalib(const CX9261AConfiguration& config, RxChannel chan); /** * @brief 选择校准方法 * @param calib 校准结构体 */ void configCalibMethod(const Calib& calib); /** * @brief 读取当前Rx chan通道的校准值 * @param chan Rx通道 * @return 校准值结构体 */ CalibPredis readRxCalibPredis(RxChannel chan); /** * @brief 储存校准值 * @param index 第index组校准值 * @param chan 接收通道 * @param pll 使用的PLL */ void saveRxCalibPredis(unsigned char index, RxChannel chan, LoSource pll); /** * @brief 加载保存的校准值 * @param index 第index组校准值 * @param chan 指定加载校准值的通道 * @param pll 使用的PLL */ void loadRxCalibPredis(unsigned char index, RxChannel chan, LoSource pll); /** * @brief Rx窄带多点校准 * @param config CX9261A配置结构体 * @param points 校准点 * @param chan 接收通道 */ void configRxMultiPointsQec(const CX9261AConfiguration& config, const std::vector& points, RxChannel chan); /** * @brief 根据pll来源配置校准模式下的电源管理 * @param pllSource PllSource结构体 */ void preparePowerForTxCalib(const PllSource& pllSource); /** * @brief 调整校准时Pll的配置 * @param config CX9261A配置结构体 */ void preparePllForTxCalib(const CX9261AConfiguration& config); /** * @brief TX二分法QEC校准 * @param f0 校准音频率 * @param fs adc频率 */ void txBisectionQecCalib(double f0, double fs); /** * @brief TX时域统计法校准 * @param config CX9261A配置结构体 * @param chan 要校准的通道 */ void txTSTCalib(const CX9261AConfiguration& config, TxChannel chan); /** * @brief TX二分法DC校准 * @param f0 校准音频率 * @param fs adc频率 */ void txBisectionDcCalib(double f0, double fs); /** * @brief Tx多点校准 * @param config CX9261A配置结构体 * @param points 校准点 */ void configTxMultiPointsQec(const CX9261AConfiguration& config, const std::vector& points); /** * @brief Tx通道校准 * @param config CX9261A配置结构体 */ void txCalib(const CX9261AConfiguration& config); /** * @brief 储存校准值 * @param index 第index组校准值 * @param chan 发射通道 * @param pll pll */ void saveTxCalibPredis(unsigned char index, TxChannel chan, LoSource pll); /** * @brief 加载保存的校准值 * @param index 第index组校准值 * @param chan 指定加载校准值的通道 * @param pll 指定加载校准值对应的PLL */ void loadTxCalibPredis(unsigned char index, TxChannel chan, LoSource pll); /** * @brief Qec校准顶层函数,内部根据配置选择使用对应方法进行校准 * @param config CX9261A配置结构体 */ void configQecCalib(const CX9261AConfiguration& config); /** * @brief 配置TX NCO相关寄存器 * @param nco TX NCO配置结构体 * @param fs adc速率 */ void configTxNco(const TxNCO& nco, double fs); /** * @brief 配置TX NCO BIST模式 * @param bist 开启/关闭BIST */ void configTxBIST(bool bist); /** * @brief 配置TX NCO频率 * @param freq 混频频率 * @param fs adc抽取后速率 */ void configTxNcoFreq(double freq, double fs); /** * @brief 配置RX NCO相关寄存器 * @param nco RX NCO配置结构体 * @param fs adc速率 */ void configRxNco(const RxNCO& nco, double fs); /** * @brief 配置Rx NCO模式 * @param mode NCO模式:Bypass/BIST/Up/Down */ void configRxNcoMode(NCOMode mode); /** * @brief 配置Rx NCO模式 * @param mode NCO模式:Master/Slaver */ void configRxNcoMS(NCOMode mode); /** * @brief 配置Rx NCO频率 * @param freq 混频频率 * @param fs adc速率 */ void configRxNcoFreq(double freq, double fs); /** * @brief 配置接口相关寄存器 * @param interface Interface配置结构体 */ void configInterface(const Interface& interface); /** * @brief 配置PLL来源 * @param pllSource PLlSource结构体 */ void configPllSource(const PllSource& pllSource); /** * @brief 切换电源模式 * @param pm 电源模式 */ void configPowerMode(PowerMode pm); /** * @brief 配置电源管理 * @param power 电源配置结构体 * @param pm 电源模式 */ void configPowerPins(const Power& power, PowerMode pm); /** * @brief 配置参考倍频器 * @param doubler 倍频器开关 * @param ref 参考时钟频率,单位MHz */ void configRefDoubler(bool doubler, double ref); /** * @brief 初始化通道,调用initialChip函数会初始化RX1,RX2,RX3三个通道 * @param chan 通道 RX1/RX2/RX3 */ void initialRxChannel(RxChannel chan); /** * @brief 配置Rx带宽 * @note 只改变Rx带宽会导致通道增益改变,建议使用configRxChannel函数进行带宽调整 * @param bandwidth 带宽,单位(MHz) * @param chan 通道 Rx1/Rx2/Rx3 */ void configRxBandwidth(double bandwidth, RxChannel chan); /** * @brief 配置Rx TIA * @note 只改变TIA会导致通道带宽改变,建议使用configRxChannel函数进行TIA调整 * @param tia tia档位 * @param chan 通道 Rx1/Rx2/Rx3 */ void configRxTIA(int tia, RxChannel chan); /** * @brief 配置Rx Mixer * @param mixer mixer档位 */ void configRxMixer(int mixer); /** * @brief 配置Rx通道,包含TIA,Mixer以及Bandwidth * @param config RxConfig结构体 * @param chan Rx1/Rx2/Rx3 */ void configRxChannel(const RxConfig& config, RxChannel chan); /** * @brief 配置Rx FIR滤波器抽取倍数 * @param fir 抽取倍数 0(Bypass)/1/2/3/4/8 */ void configRxFIR(int fir); /** * @brief 配置Rx HBF1滤波器抽取倍数 * @param hbf 抽取倍数 0(Bypass)/2 */ void configRxHBF1(int hbf); /** * @brief 配置Rx HBF2滤波器抽取倍数 * @param hbf 抽取倍数 0(Bypass)/2 */ void configRxHBF2(int hbf); /** * @brief 配置Rx HBF3滤波器抽取倍数 * @param hbf 抽取倍数 0(Bypass)/2/3 */ void configRxHBF3(int hbf); /** * @brief 配置Rx CIC滤波器 * @param cic 抽取倍数 0(Bypass)/20 */ void configRxCIC(int cic); /** * @brief 配置Rx滤波器 * @param filters Filters结构体 */ void configRxFilters(const Filters& filters); /** * @brief 配置Rx FIR滤波器系数 * @param coe 滤波器系数,长度为16的整倍数,最大128 */ void configRxFIRCoe(const std::vector& coe); /** * @brief 配置Tx带宽 * @param bandwidth 带宽,单位(MHz) * @param chan 通道 TX1/TX2 */ void configTxBandwidth(double bandwidth, TxChannel chan); /** * @brief 配置Tx Mixer * @param mixer 混频器值 * @param chan TX1/TX2 */ void configTxMixer(int mixer, TxChannel chan); /** * @brief 初始化Tx通道 * @param chan 通道 TX1/TX2 */ void initialTxChannel(TxChannel chan); /** * @brief 根据Tx通道的本振频率,配置对应的参数 * @param lo 本振频率,单位(MHz) * @param chan 通道(Tx1/Tx2) */ void configTxChannelFrequency(double lo, TxChannel chan); /** * @brief 配置Tx通道,Mixer以及Bandwidth * @param config TxConfig结构体 * @param chan Tx1/Tx2 */ void configTxChannel(const TxConfig& config, TxChannel chan); /** * @brief 配置Tx FIR滤波器插值倍数 * @param fir 插值倍数 0(Bypass)/1/2/3/4/8 */ void configTxFIR(int fir); /** * @brief 配置Tx HBF1滤波器插值倍数 * @param hbf 插值倍数 0(Bypass)/2 */ void configTxHBF1(int hbf); /** * @brief 配置Tx HBF2滤波器插值倍数 * @param hbf 插值倍数 0(Bypass)/2 */ void configTxHBF2(int hbf); /** * @brief 配置Tx HBF3滤波器插值倍数 * @param hbf 插值倍数 0(Bypass)/2/3 */ void configTxHBF3(int hbf); /** * @brief 配置Tx CIC滤波器 * @param cic 插值倍数 0(Bypass)/8/20/32/80 */ void configTxCIC(int cic); /** * @brief 配置Tx滤波器 * @param filters Filters结构体 */ void configTxFilters(const Filters& filters); /** * @brief 配置Tx FIR滤波器系数 * @param coe 滤波器系数,长度为16的整倍数,最大128 */ void configTxFIRCoe(const std::vector& coe); /** * @brief 读取当前Tx chan通道的校准值 * @param chan Tx通道 * @return 校准值结构体 */ CalibPredis readTxCalibPredis(TxChannel chan); /** * @brief 此函数为Demo板配套配置函数,用于配置FPGA接口,用户开发自己的程序时应重写对应功能 * @param interface Interface结构体 */ void configFPGA(const Interface& interface); } // namespace CX9261A #endif // CX9261ADRIVER_CX9261ADRIVER_H