当前位置:   article > 正文

AD9361相关

ad9361

AD9361示意图

在这里插入图片描述

典型特性

在这里插入图片描述

接收通路

在这里插入图片描述
TIA_LPF和BB_LPF属于模拟滤波器,HB3/DEC3、HB2、HB1、FIR属于数字滤波器。

在这里插入图片描述

发射通路

在这里插入图片描述
在这里插入图片描述

RF AND BBPLL SYNTHESIZER

在这里插入图片描述
经由片上的DCXO或外部晶振,再经过缓冲、2倍频、2分频、4分频之后,能够得到三个独立的Fref,分别作为BBPLL、Tx、Rx的参考频率。为了RFPLL能够有最好的性能,ADI建议将参考时钟或晶振频率在scale之后设置的越接近80MHz越好。

RF PLL

AD9361片内集成了整个PLL(包括VCO和环路滤波器),PLL运行在6~12GHz。
在这里插入图片描述

PLL经过divider之后,获得70MHz~6GHz的射频频率。
在这里插入图片描述

BBPLL

BB PLL是用来产生AD9361片内的数字时钟,包括ADC CLK、DAC CLK、所有的模拟校正时钟等,PLL运行在715MHz~1.43GHz。
在这里插入图片描述

REF_CLK、BBPLL_CLK、RFPLL_CLK的频率范围

摘自《AD9361_cn》
在这里插入图片描述

摘自《AD9361 Reference Manual》
在这里插入图片描述

摘自《AD9361配置软件》
在这里插入图片描述

ENABLE STATE MACHINE GUIDE

TDD 同一时刻只能发送或接收
FDD 可以收发同时
使能状态机(ENSM)能实时控制器件的当前状态。

在这里插入图片描述
在这里插入图片描述

Tx Power Control

发射功率的控制是通过调节发射衰减实现的,AD9361片上集成了一个hard-coded的衰减查找表,查找表的深度为360,衰减步进为0.25dB,总共可调衰减为(360-1)*0.25=89.75dB。

2R2T的收发时序

摘自《AD9361 Reference Manual》
在这里插入图片描述
在这里插入图片描述

FIR系数

在这里插入图片描述

SPI配置

复位期间不能进行SPI操作

在这里插入图片描述
复位引脚是低有效的
当一直复位时,似乎不能进行SPI操作,如SPI回读

在这里插入图片描述

默认先传高比特

在这里插入图片描述

MSB传输时,当启用多字节传输时,寄存器地址是递减的

在这里插入图片描述

SPI_CLK的最大频率(时钟最大50M)

在这里插入图片描述

官方范例代码分析

收发链路上的时钟

摘自《AD9361配置软件》
在这里插入图片描述

上图中的内容,可以在官方示例代码中找到对应内容,如下所示,

//摘自main.c
AD9361_InitParam default_init_param = {
    //以上省略
    
	/* Reference Clock */
	40000000UL,	//reference_clk_rate
    
    //以上省略
    /* Rate & BW Control */
	{983040000, 245760000, 122880000, 61440000, 30720000, 30720000},// rx_path_clock_frequencies[6] *** adi,rx-path-clock-frequencies
	{983040000, 122880000, 122880000, 61440000, 30720000, 30720000},// tx_path_clock_frequencies[6] *** adi,tx-path-clock-frequencies
	18000000,//rf_rx_bandwidth_hz *** adi,rf-rx-bandwidth-hz
	18000000,//rf_tx_bandwidth_hz *** adi,rf-tx-bandwidth-hz
    
    //以下省略
}

//摘自ad9361.h
enum ad9361_clocks {
	BB_REFCLK,
	RX_REFCLK,
	TX_REFCLK,
	BBPLL_CLK,
	ADC_CLK,
	R2_CLK,
	R1_CLK,
	CLKRF_CLK,
	RX_SAMPL_CLK,
	DAC_CLK,
	T2_CLK,
	T1_CLK,
	CLKTF_CLK,
	TX_SAMPL_CLK,
	RX_RFPLL_INT,
	TX_RFPLL_INT,
	RX_RFPLL_DUMMY,
	TX_RFPLL_DUMMY,
	RX_RFPLL,
	TX_RFPLL,
	NUM_AD9361_CLKS,
	EXT_REF_CLK,
};

//用于对adi,rx-path-clock-frequencies进行索引
enum ad9361_pdata_rx_freq {
	BBPLL_FREQ,
	ADC_FREQ,
	R2_FREQ,
	R1_FREQ,
	CLKRF_FREQ,
	RX_SAMPL_FREQ,
	NUM_RX_CLOCKS,
};

//摘自ad9361.c
int32_t ad9361_init (struct ad9361_rf_phy **ad9361_phy, AD9361_InitParam *init_param)
{
	//以上省略
	
	/* Reference Clock */
	phy->clk_refin->rate = init_param->reference_clk_rate;
     
    //以上省略
    /* Rate & BW Control */
	for(i = 0; i < 6; i++) {
		phy->pdata->rx_path_clks[i] = init_param->rx_path_clock_frequencies[i];
	}
	for(i = 0; i < 6; i++) {
		phy->pdata->tx_path_clks[i] = init_param->tx_path_clock_frequencies[i];
	}
	phy->pdata->rf_rx_bandwidth_Hz = init_param->rf_rx_bandwidth_hz;
	phy->pdata->rf_tx_bandwidth_Hz = init_param->rf_tx_bandwidth_hz;	

	//以下省略
}

//摘自ad9361.c
/**
 * Set the RX and TX path rates.
 * @param phy The AD9361 state structure.
 * @param rx_path_clks RX path rates buffer.
 * @param tx_path_clks TX path rates buffer.
 * @return 0 in case of success, negative error code otherwise.
 */
int32_t ad9361_set_trx_clock_chain(struct ad9361_rf_phy *phy,uint32_t *rx_path_clks,uint32_t *tx_path_clks)
{
	//以上省略
    ret = ad9361_validate_trx_clock_chain(phy, rx_path_clks);
	if (ret < 0)    return ret;

	ret = clk_set_rate(phy, phy->ref_clk_scale[BBPLL_CLK], rx_path_clks[BBPLL_FREQ]);
	if (ret < 0)    return ret;

	for (i = ADC_CLK, j = DAC_CLK, n = ADC_FREQ;
		i <= RX_SAMPL_CLK; i++, j++, n++) {
		ret = clk_set_rate(phy, phy->ref_clk_scale[i], rx_path_clks[n]);
		if (ret < 0) {
			dev_err(dev, "Failed to set BB ref clock rate (%"PRId32")",
				ret);
			return ret;
		}
		ret = clk_set_rate(phy, phy->ref_clk_scale[j], tx_path_clks[n]);
		if (ret < 0) {
			dev_err(dev, "Failed to set BB ref clock rate (%"PRId32")",
				ret);
			return ret;
		}
	}
}

/***************************************************************************//**
 * @brief clk_set_rate
*******************************************************************************/
int32_t clk_set_rate(struct ad9361_rf_phy *phy,
					 struct refclk_scale *clk_priv,
					 uint32_t rate)
{
    //以上省略
	source = clk_priv->source;
	if(phy->clks[source]->rate != rate)
	{
		switch (source) {
			case TX_REFCLK:
			case RX_REFCLK:
			case BB_REFCLK:
				round_rate = ad9361_clk_factor_round_rate(clk_priv, rate,
								&phy->clk_refin->rate);
				ad9361_clk_factor_set_rate(clk_priv, round_rate,
						phy->clk_refin->rate);
				phy->clks[source]->rate = ad9361_clk_factor_recalc_rate(clk_priv,
												phy->clk_refin->rate);
				break;
			case TX_RFPLL_INT:
			case RX_RFPLL_INT:
				round_rate = ad9361_rfpll_int_round_rate(clk_priv, rate,
								&phy->clks[clk_priv->parent_source]->rate);
				ad9361_rfpll_int_set_rate(clk_priv, round_rate,
						phy->clks[clk_priv->parent_source]->rate);
				phy->clks[source]->rate = ad9361_rfpll_int_recalc_rate(clk_priv,
											phy->clks[clk_priv->parent_source]->rate);
				break;
			case RX_RFPLL_DUMMY:
			case TX_RFPLL_DUMMY:
				ad9361_rfpll_dummy_set_rate(clk_priv, rate);
				break;
			case TX_RFPLL:
			case RX_RFPLL:
				round_rate = ad9361_rfpll_round_rate(clk_priv, rate);
				ad9361_rfpll_set_rate(clk_priv, round_rate);
				phy->clks[source]->rate = ad9361_rfpll_recalc_rate(clk_priv);
				break;
			case BBPLL_CLK:
				round_rate = ad9361_bbpll_round_rate(clk_priv, rate,
								&phy->clks[clk_priv->parent_source]->rate);
				ad9361_bbpll_set_rate(clk_priv, round_rate,
					phy->clks[clk_priv->parent_source]->rate);
				phy->clks[source]->rate = ad9361_bbpll_recalc_rate(clk_priv,
											phy->clks[clk_priv->parent_source]->rate);
				phy->bbpll_initialized = true;
				break;
			case ADC_CLK:
			case R2_CLK:
			case R1_CLK:
			case CLKRF_CLK:
			case RX_SAMPL_CLK:
			case DAC_CLK:
			case T2_CLK:
			case T1_CLK:
			case CLKTF_CLK:
			case TX_SAMPL_CLK:
				round_rate = ad9361_clk_factor_round_rate(clk_priv, rate,
								&phy->clks[clk_priv->parent_source]->rate);
				ad9361_clk_factor_set_rate(clk_priv, round_rate,
						phy->clks[clk_priv->parent_source]->rate);
				phy->clks[source]->rate = ad9361_clk_factor_recalc_rate(clk_priv,
											phy->clks[clk_priv->parent_source]->rate);
				break;
			default:
				break;
		}
		//以下省略
    }
    //以下省略
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186

收发链路上的时钟处理相关函数的调用关系
在这里插入图片描述

AGC

在这里插入图片描述
在这里插入图片描述


#define REG_AGC_LOCK_LEVEL			     0x101 /* AGC Lock Level */
#define REG_ADC_NOISE_CORRECTION_FACTOR	 0x102 /* ADC noise Correction Factor */
#define REG_GAIN_STP_CONFIG1			 0x103 /* Gain Step Config1 */
#define REG_ADC_SMALL_OVERLOAD_THRESH    0x104 /* ADC Small Overload Threshold */
#define REG_ADC_LARGE_OVERLOAD_THRESH	 0x105 /* ADC Large Overload Threshold */

#define REG_GAIN_TABLE_ADDRESS			 0x130 /* Gain Table Address */
#define REG_GAIN_TABLE_WRITE_DATA1		 0x131 /* Gain Table Write Data1 */
#define REG_GAIN_TABLE_WRITE_DATA2		 0x132 /* Gain Table Write Data2 */
#define REG_GAIN_TABLE_WRITE_DATA3		 0x133 /* Gain Table Write Data 3 */
#define REG_GAIN_TABLE_READ_DATA1		 0x134 /* Gain Table Read Data 1 */
#define REG_GAIN_TABLE_READ_DATA2		 0x135 /* Gain Table Read Data 2 */
#define REG_GAIN_TABLE_READ_DATA3		 0x136 /* Gain Table Read Data 3 */
#define REG_GAIN_TABLE_CONFIG			 0x137 /* Gain Table Config */

#define REG_GM_SUB_TABLE_ADDRESS	     0x138 /* Gm Sub Table Address */
#define REG_GM_SUB_TABLE_GAIN_WRITE		 0x139 /* Gm Sub Table Gain Word Write */
#define REG_GM_SUB_TABLE_BIAS_WRITE		 0x13A /* Gm Sub Table Bias Word Write */
#define REG_GM_SUB_TABLE_CTRL_WRITE		 0x13B /* Gm Sub Table Control Word Write */
#define REG_GM_SUB_TABLE_GAIN_READ		 0x13C /* Gm Sub Table Gain Word Read */
#define REG_GM_SUB_TABLE_BIAS_READ		 0x13D /* Gm Sub Table Bias Word Read */
#define REG_GM_SUB_TABLE_CTRL_READ		 0x13E /* Gm Sub Table Control Word Read */
#define REG_GM_SUB_TABLE_CONFIG			 0x13F /* Gm Sub Table Config */

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

开FIR可能会影响时序

在这里插入图片描述

RX接收数据解析

hdl-2016-r2版本
在这里插入图片描述
在这里插入图片描述
hdl-2018-r1版本
在这里插入图片描述

在这里插入图片描述
hdl-2019-r2版本
在这里插入图片描述
在这里插入图片描述
要注意,

  • 2016-r2和2018-r1的lvds_if里,解数据的方式不一样,IDDR的使用方式也不一样
  • 2018-r1和2019-r2的lvds_if里,解数据的方式不一样

其他

FDD
Frequency division duplex in which transmit and receive signals can be present at the same time but use different frequencies.
是不是意味着同时进行收发的时候,收发频率不能相同?

AD9361上电后进入休眠模式(为了降低功耗),在AD9361能正常运行之前,它的时钟必须已经使能且初始化校正完成。
在这里插入图片描述

ADI官方论坛网友提供的AD9361初始化
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/900877
推荐阅读
相关标签
  

闽ICP备14008679号