#ifndef __CX9261ADRIVER_C_H #define __CX9261ADRIVER_C_H #ifdef __cplusplus extern "C" { #endif #ifndef __cplusplus #include #include #include #endif #define MAX_NUM_FIR 64 #define MAX_MULTI_POINTS 64 extern uint32_t CX9261A_RiscvBinLen; extern uint8_t *CX9261A_RiscvBin; typedef enum { CX9261A_WKM_Rx, CX9261A_WKM_Tx, CX9261A_WKM_FDD } CX9261A_WorkMode; /** * @brief 收发数据通道数量 * @note 此模式并不代表使用几个通道进行收发 */ typedef enum { CX9261A_TRM_R1T1, CX9261A_TRM_R2T2 } CX9261A_TrMode; /** * @brief 收发接口通道数量 */ typedef enum { CX9261A_PORTM_Single, CX9261A_PORTM_Dual } CX9261A_PortMode; /** * @brief 接口模式: * CMOS CMOS接口模式, * LVDS_S LVDS顺序模式, * LVDS_E LVDS奇偶模式 */ typedef enum { CX9261A_IOM_CMOS, CX9261A_IOM_LVDS_S, CX9261A_IOM_LVDS_E } CX9261A_IOMode; /** * @brief 本振来源 */ typedef enum { CX9261A_LOSRC_Pll1 = 0b00001, CX9261A_LOSRC_Pll2 = 0b00010, CX9261A_LOSRC_Pll3 = 0b00100, CX9261A_LOSRC_Pll4 = 0b01000, CX9261A_LOSRC_Pll5 = 0b10000, CX9261A_LOSRC_Off = 0 } CX9261A_LoSource; /** * @brief 接收通道 */ typedef enum { CX9261A_RXCH_Rx1 = 1, CX9261A_RXCH_Rx2, CX9261A_RXCH_Rx3 } CX9261A_RxChannel; /** * @brief 发射通道 */ typedef enum { CX9261A_TXCH_Tx1 = 1, CX9261A_TXCH_Tx2 } CX9261A_TxChannel; /** * @brief 电源模式 */ typedef enum { CX9261A_PWM_Shutdown = 0, CX9261A_PWM_Sleep, CX9261A_PWM_Alert, CX9261A_PWM_Calib, CX9261A_PWM_Receive, CX9261A_PWM_Transmit, CX9261A_PWM_Duplex, CX9261A_PWM_Obs } CX9261A_PowerMode; /** * @brief NCO模式 */ typedef enum { CX9261A_NCOM_Bypass = 0, CX9261A_NCOM_Up, CX9261A_NCOM_Down, CX9261A_NCOM_BIST, CX9261A_NCOM_Master, CX9261A_NCOM_Slaver } CX9261A_NCOMode; /** * @brief 温补模式 DAC: DAC模式 Band: 跳子带模式 */ typedef enum { CX9261A_TEMPCP_DAC = 0, CX9261A_TEMPCP_Band } CX9261A_TemperatureComp; /** * @brief 校准方法 TST: 时域统计 Rx通道使用, Bisec: 二分法 Tx通道使用, MultiPoints: 多点校准 */ typedef enum { CX9261A_CALM_TST = 0, CX9261A_CALM_Bisec, CX9261A_CALM_MultiPoints, CX9261A_CALM_Tracking } CX9261A_CalibMethod; /** * @brief DC校准方法 Tracking: 跟踪校准 HighPass: 高通滤波器滤掉直流 */ typedef enum { CX9261A_DCCALM_Tracking=0, CX9261A_DCCALM_HighPass } CX9261A_DCCalibMethod; typedef struct { CX9261A_LoSource first; CX9261A_LoSource second; } CX9261A_LoSourcePair; typedef struct { CX9261A_LoSourcePair key; uint16_t value; } CX9261A_SrcMapEntry; /** * @brief 接收通道本振来源映射表 */ static const CX9261A_SrcMapEntry CX9261A_rxSrcMap[] = { { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Pll2 }, 0b0010000 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Pll1 }, 0b1101000 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Pll1 }, 0b0100000 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Pll2 }, 0b1000000 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Pll1 }, 0b0101010 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Pll2 }, 0b1010010 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Off }, 0b1001001 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Off }, 0b0110001 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Off }, 0b0011011 } }; /** * @brief 发射通道本振来源映射表 */ static const CX9261A_SrcMapEntry CX9261A_txSrcMap[] = { { { CX9261A_LOSRC_Pll4, CX9261A_LOSRC_Pll4 }, 16 }, { { CX9261A_LOSRC_Pll3, CX9261A_LOSRC_Pll3 }, 104 }, { { CX9261A_LOSRC_Pll4, CX9261A_LOSRC_Pll3 }, 32 }, { { CX9261A_LOSRC_Pll3, CX9261A_LOSRC_Pll4 }, 64 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Pll2 }, 1560 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Pll1 }, 1944 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Pll1 }, 1688 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Pll2 }, 1816 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Pll3 }, 42 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Pll4 }, 82 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Pll2 }, 794 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Pll1 }, 666 }, { { CX9261A_LOSRC_Pll3, CX9261A_LOSRC_Off }, 73 }, { { CX9261A_LOSRC_Pll4, CX9261A_LOSRC_Off }, 49 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Off }, 1177 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Off }, 1305 }, { { CX9261A_LOSRC_Off, CX9261A_LOSRC_Off }, 27 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Pll3 }, 1320 }, { { CX9261A_LOSRC_Pll1, CX9261A_LOSRC_Pll4 }, 1360 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Pll3 }, 1064 }, { { CX9261A_LOSRC_Pll2, CX9261A_LOSRC_Pll4 }, 1104 }, { { CX9261A_LOSRC_Pll3, CX9261A_LOSRC_Pll1 }, 712 }, { { CX9261A_LOSRC_Pll4, CX9261A_LOSRC_Pll1 }, 688 }, { { CX9261A_LOSRC_Pll3, CX9261A_LOSRC_Pll2 }, 584 }, { { CX9261A_LOSRC_Pll4, CX9261A_LOSRC_Pll2 }, 560 } }; /** * @brief 环路参数选择表 */ static const uint8_t CX9261A_coreTable[7][4][3] = { { { 0x0C, 0x30, 0x08 }, { 0x0B, 0x30, 0x09 }, { 0x0C, 0x30, 0x05 }, { 0x0D, 0x30, 0x08 } }, { { 0x0C, 0x30, 0x0C }, { 0x0B, 0x30, 0x0E }, { 0x0C, 0x30, 0x08 }, { 0x0D, 0x30, 0x0B } }, { { 0x0C, 0x20, 0x10 }, { 0x0B, 0x20, 0x10 }, { 0x0C, 0x20, 0x0A }, { 0x0D, 0x20, 0x0D } }, { { 0x0C, 0x20, 0x11 }, { 0x0B, 0x20, 0x13 }, { 0x0C, 0x20, 0x0C }, { 0x0D, 0x20, 0x0F } }, { { 0x0D, 0x30, 0x14 }, { 0x0D, 0x22, 0x14 }, { 0x0D, 0x20, 0x0D }, { 0x0D, 0x15, 0x0C } }, { { 0x0E, 0x30, 0x18 }, { 0x0E, 0x25, 0x16 }, { 0x0E, 0x25, 0x0F }, { 0x0E, 0x18, 0x0F } }, { { 0x0F, 0x38, 0x1A }, { 0x0F, 0x32, 0x1C }, { 0x0F, 0x18, 0x12 }, { 0x0F, 0x18, 0x12 } } }; /** * @brief AGC PDT模式的结构体 */ typedef struct { int pdtN; int pdtM; } CX9261A_AGCPDT; /** * @brief AGC LMT模式的结构体 */ typedef struct { int count; /**< LMT统计次数阈值*/ int threshold1; /**< LMT阈值第一档*/ int threshold2; /**< LMT阈值第二档*/ int threshold3; /**< LMT阈值第三档*/ int threshold4; /**< LMT阈值第四档*/ } CX9261A_AGCLMT; /** * @brief AGC DIG模式的结构体 */ typedef struct { int count; /**< DIG统计次数阈值*/ int threshold1; /**< DIG阈值第一档*/ int threshold2; /**< DIG阈值第二档*/ int threshold3; /**< DIG阈值第三档*/ int threshold4; /**< DIG阈值第四档*/ } CX9261A_AGCDIG; /** * @brief AGC模式的结构体 */ typedef struct { int mode; /**< AGC模式选择*/ CX9261A_AGCPDT pdt; /**< AGC PDT模式的结构体*/ CX9261A_AGCLMT lmt; /**< AGC LMT模式的结构体*/ CX9261A_AGCDIG dig; /**< AGC DIG模式的结构体*/ } CX9261A_AGC; /** * @brief 时钟相关参数结构体 */ typedef struct { double ref; /**< 参考时钟频率,单位MHz*/ double adc; /**< ADC频率,单位MHz*/ int refDiv; /**< 参考时钟分频比*/ bool bbUseIntDiv; /**< 是否使用整数分频模式*/ bool refDoubler; /**< 是否使用参考时钟倍频器*/ } CX9261A_Clock; /** * @brief 校准相关参数结构体 */ typedef struct { bool calibDC; /**< 是否开启DC Tracking*/ CX9261A_DCCalibMethod dcCalibMethod; int dcTrackingLength; /**< DC Tracking长度*/ int dcHighPassFactor; /**< DC高通滤波系数,越大代表滤波器阶数越高,滤波范围越窄*/ uint8_t rx1CalibPll; /**< rx1校准的pll选择,Pll1 | Pll2*/ uint8_t rx2CalibPll; /**< rx2校准的pll选择,Pll1 | Pll2*/ uint8_t rx3CalibPll; /**< rx3校准的pll选择,Pll5*/ uint8_t tx1CalibPll; /**< tx1校准的pll选择,Pll1 | Pll2 | Pll3 | Pll4*/ uint8_t tx2CalibPll; /**< tx2校准的pll选择,Pll1 | Pll2 | Pll3 | Pll4*/ CX9261A_CalibMethod rxMethod; CX9261A_CalibMethod txMethod; double f0; /**< 校准音频率*/ uint32_t numRxPoint; /**< Rx多点校准的频率个数*/ uint32_t numTxPoint; /**< Tx多点校准的频率个数*/ double rxMultiPoints[MAX_MULTI_POINTS]; /**< Rx多点校准的频率*/ double txMultiPoints[MAX_MULTI_POINTS]; /**< Tx多点校准的频率*/ } CX9261A_Calib; /** * @brief 配置PLL来源相关参数结构体 */ typedef struct { bool rxUseExt; /**< 接收通道是否使用外本振*/ bool txUseExt; /**< 发射通道是否使用外本振*/ CX9261A_LoSource rx1Source; /**< Rx1通道本振来源*/ CX9261A_LoSource rx2Source; /**< Rx2通道本振来源*/ CX9261A_LoSource rx3Source; /**< Rx3通道本振来源*/ CX9261A_LoSource tx1Source; /**< Tx1通道本振来源*/ CX9261A_LoSource tx2Source; /**< Tx2通道本振来源*/ } CX9261A_PllSource; /** * @brief 配置PLL频率相关参数结构体 */ typedef struct { double pll1Freq; /**< PLL1本振时钟,单位MHz*/ double pll2Freq; /**< PLL2本振时钟,单位MHz*/ double pll3Freq; /**< PLL3本振时钟,单位MHz*/ double pll4Freq; /**< PLL4本振时钟,单位MHz*/ double pll5Freq; /**< PLL5本振时钟,单位MHz*/ double rxExtFreq; /**< 接收通道使用外本振时,外本振频率,单位MHz*/ double txExtFreq; /**< 发射通道使用外本振时,外本振频率,单位MHz*/ } CX9261A_PllFreq; /** * @brief 配置接口相关参数结构体 */ typedef struct { CX9261A_WorkMode workMode; /**< 芯片工作模式*/ CX9261A_TrMode trMode; /**< 收发数据通道模式*/ CX9261A_PortMode portMode; /**< 收发接口通道模式*/ CX9261A_IOMode ioMode; /**< 接口电平模式*/ } CX9261A_Interface; /** * @brief 配置TX NCO相关参数结构体 */ typedef struct { bool txUseBist; /**< 是否开启BIST模式*/ double txNCOFreq; /**< NCO频率*/ } CX9261A_TxNCO; /** * @brief 配置RX NCO相关参数结构体 */ typedef struct { bool rxUseBist; /**< 是否开启BIST模式*/ bool rxNCOBypass; /**< 是否Bypass NCO*/ bool rxNCOUpward; /**< 开启上/下混频模式*/ bool rxNCOMaster; /**< 使用Master/Slaver模式*/ double rxNCOFreq; /**< NCO频率*/ } CX9261A_RxNCO; /** * @brief 配置接收通道相关参数结构体 */ typedef struct { double bandwidth; /**< 接收通道1dB带宽,单位MHz*/ int tia; /**< 接收通道TIA增益配置,推荐配置6*/ int mixer; /**< 接收通道Mixer增益配置*/ } CX9261A_RxConfig; /** * @brief 配置发射通道相关参数结构体 */ typedef struct { double bandwidth; /**< 发射通道1dB带宽,单位MHz*/ int mixer; /**< 发射通道Mixer增益配置*/ } CX9261A_TxConfig; /** * @brief 配置滤波器相关参数结构体,0代表bypass */ typedef struct { int fir; /**< FIR滤波器抽取/插值倍数*/ int hbf1; /**< HBF1滤波器抽取/插值倍数*/ int hbf2; /**< HBF2滤波器抽取/插值倍数*/ int hbf3; /**< HBF3滤波器抽取/插值倍数*/ int cic; /**< CIC滤波器抽取/插值倍数*/ } CX9261A_Filters; /** * @brief 配置电源模式结构体,1代表该模块上电 */ typedef struct { bool dig_tx2; bool dig_tx1; bool dig_rx3; bool dig_rx2; bool dig_rx1; bool fref1_rx; bool auxadc2; bool auxadc1; bool auxdac; bool temp_sensor; bool bgr; bool exlo; bool tx2; bool tx1; bool rx3; bool rx2; bool rx1; bool pll5_ldo; bool pll5; bool pll4_ldo; bool pll4; bool pll3_ldo; bool pll3; bool pll2_ldo; bool pll2; bool pll1_ldo; bool pll1; bool bbpll; } CX9261A_Power; /** * @brief 配置电源模式管理,包含模式选择,接收模式,发射模式,FDD模式 */ typedef struct { CX9261A_PowerMode powerMode; CX9261A_Power rxPower; CX9261A_Power txPower; CX9261A_Power fddPower; } CX9261A_PowerManagement; /** * @brief 储存窄带校准结果的结构体 */ typedef struct { int bHigh; int bLow; int cHigh; int cLow; int dciHigh; int dciLow; int dcqHigh; int dcqLow; } CX9261A_CalibPredis; /** * @brief CX9261A结构体 */ typedef struct { CX9261A_TemperatureComp tempComp; /**< 温度补偿*/ CX9261A_AGC agc; /**< AGC结构体*/ CX9261A_Interface interface; /**< Interface结构体*/ CX9261A_Clock clock; /**< Clock结构体*/ CX9261A_PllSource pllSource; /**< PllSource结构体*/ CX9261A_Calib calib; /**< Calib结构体*/ CX9261A_PllFreq pllFreq; /**< PllFreq结构体*/ CX9261A_TxNCO txNco; /**< TxNCO结构体*/ CX9261A_RxNCO rxNco; /**< RxNCO结构体*/ CX9261A_RxConfig rx1Config; /**< RxConfig结构体*/ CX9261A_RxConfig rx2Config; /**< RxConfig结构体*/ CX9261A_RxConfig rx3Config; /**< RxConfig结构体*/ CX9261A_TxConfig tx1Config; /**< TxConfig结构体*/ CX9261A_TxConfig tx2Config; /**< TxConfig结构体*/ CX9261A_Filters rxFilters; /**< Filters结构体*/ CX9261A_Filters txFilters; /**< Filters结构体*/ CX9261A_PowerManagement powerManagement; /**< PowerManagement结构体*/ uint32_t numRxFIR; uint32_t numTxFIR; double rxFIRCoe[MAX_NUM_FIR]; /**< Rx FIR滤波器系数*/ double txFIRCoe[MAX_NUM_FIR]; /**< Tx FIR滤波器系数*/ } CX9261A_CX9261AConfiguration; typedef struct { int first; int second; }QecStatePair; // 定义函数指针类型 typedef void (*CX9261A_LoggingFunc)(const char* msg); typedef void (*CX9261A_WriteSpiFunc)(int address, int value); typedef int (*CX9261A_ReadSpiFunc)(int address); typedef void (*CX9261A_PauseFunc)(double ms); typedef void (*CX9261A_SetPinFunc)(int pin, int value); /** * @brief 绑定日志函数 * @param msg 要输出的内容 */ void CX9261A_setLoggingFunc(CX9261A_LoggingFunc func); /** * @brief 绑定SPI写入寄存器函数 * @param address 要写入的寄存器地址 * @param value 要写入的寄存器值 */ void CX9261A_setWriteSpiFunc(CX9261A_WriteSpiFunc func); /** * @brief 绑定等待函数 * @param ms 等待时间,单位毫秒 */ void CX9261A_setReadSpiFunc(CX9261A_ReadSpiFunc func); /** * @brief 绑定SPI读取寄存器函数 * @param address 要读取的寄存器地址 * @return 返回的寄存器值 */ void CX9261A_setPauseFunc(CX9261A_PauseFunc func); /** * @brief 绑定配置FPGA对应寄存器函数 * @param pin 寄存器地址 * @param value 寄存器值 */ void CX9261A_setSetPinFunc(CX9261A_SetPinFunc func); /** * @brief 初始化芯片状态,写入与具体配置无关的寄存器值 */ void CX9261A_initialChip(); /** * @brief 初始化电源配置,如果只自定义配置部分模式下的电源管理,在自定义配置之前需要先调用此函数 */ void CX9261A_initialPowerConfig(const CX9261A_CX9261AConfiguration *config); /** * @brief 初始化BBPLL相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void CX9261A_initialBBPLL(); /** * @brief 初始化PLL1相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void CX9261A_initialPLL1(); /** * @brief 初始化PLL2相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void CX9261A_initialPLL2(); /** * @brief 初始化PLL3相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void CX9261A_initialPLL3(); /** * @brief 初始化PLL4相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void CX9261A_initialPLL4(); /** * @brief 初始化PLL5相关寄存器,如果调用了initialChip,则无需单独调用此函数 */ void CX9261A_initialPLL5(); /** * @brief 配置受参考时钟频率影响的寄存器 * @param ref 参考时钟频率,单位MHz */ void CX9261A_configRef(double ref); /** * @brief 配置时钟相关寄存器,包括ADC和BBPLL * @param config CX9261A参数结构体 */ void CX9261A_configBBPLL(const CX9261A_CX9261AConfiguration *config); /** * @brief BBPLL AFC * @return 是否锁定 */ bool CX9261A_afcBBPll(); /** * @brief 配置PLL1频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void CX9261A_configPll1(double lo, const CX9261A_Clock *clock); /** * @brief Pll1 AFC * @return 是否锁定 */ bool CX9261A_afcPll1(); /** * @brief 配置PLL2频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void CX9261A_configPll2(double lo, const CX9261A_Clock *clock); /** * @brief Pll2 AFC * @return 是否锁定 */ bool CX9261A_afcPll2(); /** * @brief 配置PLL3频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void CX9261A_configPll3(double lo, const CX9261A_Clock *clock); /** * @brief Pll3 AFC * @return 是否锁定 */ bool CX9261A_afcPll3(); /** * @brief 配置PLL4频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void CX9261A_configPll4(double lo, const CX9261A_Clock *clock); /** * @brief Pll4 AFC * @return 是否锁定 */ bool CX9261A_afcPll4(); /** * @brief 配置PLL5频率 * @param lo 目标频率 * @param clock 时钟结构体,使用其中的ref和refDoubler属性 */ void CX9261A_configPll5(double lo, const CX9261A_Clock *clock); /** * @brief Pll5 AFC * @return 是否锁定 */ bool CX9261A_afcPll5(); /** * @brief 配置AGC模式 * @param mode 模式0~13 */ void CX9261A_configAGCMode(int mode); /** * @brief 配置AGC PDT * @param pdt AGCPDT结构体 */ void CX9261A_configAGCPDT(const CX9261A_AGCPDT *pdt); /** * @brief 配置AGC LMT * @param lmt AGCLMT结构体 */ void CX9261A_configAGCLMT(const CX9261A_AGCLMT *lmt); /** * @brief 配置AGC DIG * @param dig AGCDIG结构体 */ void CX9261A_configAGCDIG(const CX9261A_AGCDIG *dig); /** * @brief 配置AGC * @param agc AGC结构体 */ void CX9261A_configAGC(const CX9261A_AGC *agc); /** * @brief 配置片内处理器,仅在使用需要处理器辅助的校准方法时需要开启处理器 * @param on 开启/关闭 */ void CX9261A_configRISCV(bool on); /** * @brief 配置温补 * @param mode 温补模式 DAC/Band */ void CX9261A_configTemperatureCompensation(CX9261A_TemperatureComp mode); /** * @brief ADC校准 * @param adc ADC速率 */ void CX9261A_configADCCalib(double adc); /** * @brief Flash校准 */ void CX9261A_configFlashCalib(); /** * @brief QEC校准会改变部分寄存器配置,在进行校准之前需要保存这部分寄存器,校准后恢复 * @return 包含寄存器地址和值的map */ void CX9261A_beforeQecState(QecStatePair* buff, size_t *len); /** * @brief 恢复QEC校准过程中改变的寄存器 * @param state beforeQecState函数返回的map */ void CX9261A_restoreQecState(QecStatePair* buff, size_t len); /** * @brief 根据pll来源配置校准模式下的电源管理 * @param pllSource PllSource结构体 */ void CX9261A_preparePowerForRxCalib(const CX9261A_PllSource *pllSource); /** * @brief 调整校准时Pll的配置 * @param config CX9261A配置结构体 * @param chan 要进行校准的通道 */ void CX9261A_preparePllForRxCalib(const CX9261A_CX9261AConfiguration *config, CX9261A_RxChannel chan); /** * @brief 等待RxTST窄带校准结束,可重写 * @return 校准是否结束 */ bool CX9261A_waitRxTSTFinished(); /** * @brief RX时域统计校准 * @param chan 校准的RX通道 */ void CX9261A_rxTSTCalib(CX9261A_RxChannel chan); /** * @brief RX延时线校准 * @param fs ADC采样率 * @param chan 校准的RX通道 */ void CX9261A_rxDelayCalib(double fs, CX9261A_RxChannel chan); /** * @brief DC Tracking * @param config CX9261A配置结构体 */ void CX9261A_configDcCalib(const CX9261A_Calib *config); void CX9261A_configDcCalibMethod(CX9261A_DCCalibMethod method); void CX9261A_configDcTrackingLength(int length); void CX9261A_configDcHighPassFactor(int factor); /** * @brief Rx校准 * @param config CX9261A配置结构体 * @param chan 要进行校准的通道 */ void CX9261A_rxCalib(const CX9261A_CX9261AConfiguration *config, CX9261A_RxChannel chan); /** * @brief 选择校准方法 * @param calib 校准结构体 */ void CX9261A_configCalibMethod(const CX9261A_Calib *calib); /** * @brief 读取当前Rx chan通道的校准值 * @param chan Rx通道 * @return 校准值结构体 */ CX9261A_CalibPredis CX9261A_readRxCalibPredis(CX9261A_RxChannel chan); /** * @brief 储存校准值 * @param index 第index组校准值 * @param chan 接收通道 * @param pll 使用的PLL */ void CX9261A_saveRxCalibPredis(unsigned char index, CX9261A_RxChannel chan, CX9261A_LoSource pll); /** * @brief 加载保存的校准值 * @param index 第index组校准值 * @param chan 指定加载校准值的通道 * @param pll 使用的PLL */ void CX9261A_loadRxCalibPredis(unsigned char index, CX9261A_RxChannel chan, CX9261A_LoSource pll); /** * @brief Rx窄带多点校准 * @param config CX9261A配置结构体 * @param points 校准点 * @param chan 接收通道 */ void CX9261A_configRxMultiPointsQec(const CX9261A_CX9261AConfiguration *config, CX9261A_RxChannel chan, const double *points, size_t len); /** * @brief 根据pll来源配置校准模式下的电源管理 * @param pllSource PllSource结构体 */ void CX9261A_preparePowerForTxCalib(const CX9261A_PllSource *pllSource); /** * @brief 调整校准时Pll的配置 * @param config CX9261A配置结构体 */ void CX9261A_preparePllForTxCalib(const CX9261A_CX9261AConfiguration *config); /** * @brief TX二分法QEC校准 * @param f0 校准音频率 * @param fs adc频率 */ void CX9261A_txBisectionQecCalib(double f0, double fs); /** * @brief TX时域统计法校准 * @param config CX9261A配置结构体 * @param chan 要校准的通道 */ void CX9261A_txTSTCalib(const CX9261A_CX9261AConfiguration *config, CX9261A_TxChannel chan); /** * @brief TX二分法DC校准 * @param f0 校准音频率 * @param fs adc频率 */ void CX9261A_txBisectionDcCalib(double f0, double fs); /** * @brief Tx多点校准 * @param config CX9261A配置结构体 * @param points 校准点 */ void CX9261A_configTxMultiPointsQec(const CX9261A_CX9261AConfiguration *config, const double *points, size_t len); /** * @brief Tx通道校准 * @param config CX9261A配置结构体 */ void CX9261A_txCalib(const CX9261A_CX9261AConfiguration *config); /** * @brief 储存校准值 * @param index 第index组校准值 * @param chan 发射通道 * @param pll pll */ void CX9261A_saveTxCalibPredis(unsigned char index, CX9261A_TxChannel chan, CX9261A_LoSource pll); /** * @brief 加载保存的校准值 * @param index 第index组校准值 * @param chan 指定加载校准值的通道 * @param pll 指定加载校准值对应的PLL */ void CX9261A_loadTxCalibPredis(unsigned char index, CX9261A_TxChannel chan, CX9261A_LoSource pll); /** * @brief Qec校准顶层函数,内部根据配置选择使用对应方法进行校准 * @param config CX9261A配置结构体 */ void CX9261A_configQecCalib(const CX9261A_CX9261AConfiguration *config); /** * @brief 配置TX NCO相关寄存器 * @param nco TX NCO配置结构体 * @param fs adc速率 */ void CX9261A_configTxNco(const CX9261A_TxNCO *nco, double fs); /** * @brief 配置TX NCO BIST模式 * @param bist 开启/关闭BIST */ void CX9261A_configTxBIST(bool bist); /** * @brief 配置TX NCO频率 * @param freq 混频频率 * @param fs adc抽取后速率 */ void CX9261A_configTxNcoFreq(double freq, double fs); /** * @brief 配置RX NCO相关寄存器 * @param nco RX NCO配置结构体 * @param fs adc速率 */ void CX9261A_configRxNco(const CX9261A_RxNCO *nco, double fs); /** * @brief 配置Rx NCO模式 * @param mode NCO模式:Bypass/BIST/Up/Down */ void CX9261A_configRxNcoMode(CX9261A_NCOMode mode); /** * @brief 配置Rx NCO模式 * @param mode NCO模式:Master/Slaver */ void CX9261A_configRxNcoMS(CX9261A_NCOMode mode); /** * @brief 配置Rx NCO频率 * @param freq 混频频率 * @param fs adc速率 */ void CX9261A_configRxNcoFreq(double freq, double fs); /** * @brief 配置接口相关寄存器 * @param interface Interface配置结构体 */ void CX9261A_configInterface(const CX9261A_Interface *interface); /** * @brief 配置PLL来源 * @param pllSource PLlSource结构体 */ void CX9261A_configPllSource(const CX9261A_PllSource *pllSource); /** * @brief 切换电源模式 * @param pm 电源模式 */ void CX9261A_configPowerMode(CX9261A_PowerMode pm); /** * @brief 配置电源管理 * @param power 电源配置结构体 * @param pm 电源模式 */ void CX9261A_configPowerPins(const CX9261A_Power *power, CX9261A_PowerMode pm); /** * @brief 配置参考倍频器 * @param doubler 倍频器开关 * @param ref 参考时钟频率,单位MHz */ void CX9261A_configRefDoubler(bool doubler, double ref); /** * @brief 初始化通道,调用initialChip函数会初始化RX1,RX2,RX3三个通道 * @param chan 通道 RX1/RX2/RX3 */ void CX9261A_initialRxChannel(CX9261A_RxChannel chan); /** * @brief 配置Rx带宽 * @note 只改变Rx带宽会导致通道增益改变,建议使用configRxChannel函数进行带宽调整 * @param bandwidth 带宽,单位(MHz) * @param chan 通道 Rx1/Rx2/Rx3 */ void CX9261A_configRxBandwidth(double bandwidth, CX9261A_RxChannel chan); /** * @brief 配置Rx TIA * @note 只改变TIA会导致通道带宽改变,建议使用configRxChannel函数进行TIA调整 * @param tia tia档位 * @param chan 通道 Rx1/Rx2/Rx3 */ void CX9261A_configRxTIA(int tia, CX9261A_RxChannel chan); /** * @brief 配置Rx Mixer * @param mixer mixer档位 */ void CX9261A_configRxMixer(int mixer); /** * @brief 配置Rx通道,包含TIA,Mixer以及Bandwidth * @param config RxConfig结构体 * @param chan Rx1/Rx2/Rx3 */ void CX9261A_configRxChannel(const CX9261A_RxConfig *config, CX9261A_RxChannel chan); /** * @brief 配置Rx FIR滤波器抽取倍数 * @param fir 抽取倍数 0(Bypass)/1/2/3/4/8 */ void CX9261A_configRxFIR(int fir); /** * @brief 配置Rx HBF1滤波器抽取倍数 * @param hbf 抽取倍数 0(Bypass)/2 */ void CX9261A_configRxHBF1(int hbf); /** * @brief 配置Rx HBF2滤波器抽取倍数 * @param hbf 抽取倍数 0(Bypass)/2 */ void CX9261A_configRxHBF2(int hbf); /** * @brief 配置Rx HBF3滤波器抽取倍数 * @param hbf 抽取倍数 0(Bypass)/2/3 */ void CX9261A_configRxHBF3(int hbf); /** * @brief 配置Rx CIC滤波器 * @param cic 抽取倍数 0(Bypass)/20 */ void CX9261A_configRxCIC(int cic); /** * @brief 配置Rx滤波器 * @param filters Filters结构体 */ void CX9261A_configRxFilters(const CX9261A_Filters *filters); /** * @brief 配置Rx FIR滤波器系数 * @param coe 滤波器系数,长度为16的整倍数,最大128 */ void CX9261A_configRxFIRCoe(const double *coe, size_t len); /** * @brief 配置Tx带宽 * @param bandwidth 带宽,单位(MHz) * @param chan 通道 TX1/TX2 */ void CX9261A_configTxBandwidth(double bandwidth, CX9261A_TxChannel chan); /** * @brief 配置Tx Mixer * @param mixer 混频器值 * @param chan TX1/TX2 */ void CX9261A_configTxMixer(int mixer, CX9261A_TxChannel chan); /** * @brief 初始化Tx通道 * @param chan 通道 TX1/TX2 */ void CX9261A_initialTxChannel(CX9261A_TxChannel chan); /** * @brief 根据Tx通道的本振频率,配置对应的参数 * @param lo 本振频率,单位(MHz) * @param chan 通道(Tx1/Tx2) */ void CX9261A_configTxChannelFrequency(double lo, CX9261A_TxChannel chan); /** * @brief 配置Tx通道,Mixer以及Bandwidth * @param config TxConfig结构体 * @param chan Tx1/Tx2 */ void CX9261A_configTxChannel(const CX9261A_TxConfig *config, CX9261A_TxChannel chan); /** * @brief 配置Tx FIR滤波器插值倍数 * @param fir 插值倍数 0(Bypass)/1/2/3/4/8 */ void CX9261A_configTxFIR(int fir); /** * @brief 配置Tx HBF1滤波器插值倍数 * @param hbf 插值倍数 0(Bypass)/2 */ void CX9261A_configTxHBF1(int hbf); /** * @brief 配置Tx HBF2滤波器插值倍数 * @param hbf 插值倍数 0(Bypass)/2 */ void CX9261A_configTxHBF2(int hbf); /** * @brief 配置Tx HBF3滤波器插值倍数 * @param hbf 插值倍数 0(Bypass)/2/3 */ void CX9261A_configTxHBF3(int hbf); /** * @brief 配置Tx CIC滤波器 * @param cic 插值倍数 0(Bypass)/8/20/32/80 */ void CX9261A_configTxCIC(int cic); /** * @brief 配置Tx滤波器 * @param filters Filters结构体 */ void CX9261A_configTxFilters(const CX9261A_Filters *filters); /** * @brief 配置Tx FIR滤波器系数 * @param coe 滤波器系数,长度为16的整倍数,最大128 */ void CX9261A_configTxFIRCoe(const double *coe, size_t len); /** * @brief 读取当前Tx chan通道的校准值 * @param chan Tx通道 * @return 校准值结构体 */ CX9261A_CalibPredis CX9261A_readTxCalibPredis(CX9261A_TxChannel chan); /** * @brief 此函数为Demo板配套配置函数,用于配置FPGA接口,用户开发自己的程序时应重写对应功能 * @param interface Interface结构体 */ void CX9261A_configFPGA(const CX9261A_Interface *interface); #ifdef __cplusplus } #endif #endif // __CX9261ADRIVER_C_H