AD9361配置 一、FPGA纯逻辑SPI配置寄存器 通过AD936x评估软件进行寄存器配置,其中主要包括输入输出接口配置,RF PLL和BB PLL配置,时钟配置,数据接口和通道带宽配置,TX和RX滤波器设置,双工模式和增益配置等。
(1)射频输入输出接口配置如下: (2)参考时钟和RF & BB PLL配置: (3)数据接口和通道带宽配置 设置接口速率,RX&TX通道带宽以及3个HB滤波器的抽取和内插系数的设置,软件会根据设置自动得出ADC CLK和DAC CLK。
(4)RX端&TX端的滤波器参数设置
曲线表示的是RX和TX端的模拟滤波器响应,数字滤波器响应和级联响应。 软件在设置TX和RX滤波器之后,还包括了数字接口设置(CMOS&LVDS),TDD&FDD设置,边沿采样模式设置和AGC&MGC增益设置。配置完成后保存并Create Init Script,在随后弹出的小窗口选择Low Level Scripting(文件保存类型选择为.txt)可以生成对应当前配置的完整配置参数文本。
生成文本也就是我们所需的SPI接口对AD9361寄存器的初始化配置。 二、PS端对AD9361配置
在VIVADO工程界面,如果AD9361的HDL工程已经建立好,接下来就是添加软件驱动端的C文件,我们生成bit流文件然后launch SDK,启动SDK创建空白工程,将我们工程所需的C文件复制到新建工程目录下面的src文件夹下。实现AD9361各个参数配置,对PL中的一些寄存器进行读写,控制发送数据源,通过DMA控制器对发送和接收的数据进行传输,从而实现AD9361对数据的接收、处理和发送,整个程序是使用C语言来完成的。 进入SRC下我们可以看到很多源文件和头文件,dac_core.h、dac_core.c是模数转换模块控制文件,包括模块的初始化和数据传输等;Platform.c、platform.h是Xilinx平台一些驱动文件;AD9361.c,AD9361.h,AD9361的驱动文件,common.h 通用驱动文件;包含时钟结构体和通用宏定义; AD9361_api.c,AD9361_api.h,AD9361应用编程接口驱动文件,如AD9361的初始化函数。
整个软件的函数配置流程如图所示:
其中按照流程配置函数有:
console_get_command(received_cmd);
gpio_init(GPIO_DEVICE_ID);
gpio_direction(default_init_param.gpio_resetb, 1);
spi_init(SPI_DEVICE_ID, 1, 0);
ad9361_init(&ad9361_phy, &default_init_param);
ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
dac_init(ad9361_phy, DATA_SEL_DMA, 1);
adc_capture(16384, ADC_DDR_BASEADDR);
Xil_DCacheInvalidateRange(ADC_DDR_BASEADDR, 16384);
console_get_command(received_cmd);
其中RX和TX端的FIR配置函数ad9361_set_tx_fir_config和ad9361_set_rx_fir_config可按照官方给的案例文件参数配置即可,我们需要修改通道,通路增益,收发通道时钟频率,RF中心频率以及基带频率等只需要用AD9361_InitParam定义出一个新的结构体变量,然后将这个新的结构体变量在gpio_direction()以及ad9361_init()中进行调用即可。
DAC的初始化函数的参数包括指向AD9361初始化结构体的指针,发送数据源选择以及DMA的配置。数据源可选择DDS生成的信号,通过DMA发送DDR中的信号数据,发送全0信号,发送随机数信号,发送从ADC中接收到的数据信号,发送选定设备的信号和用户数据。
其中包括了DMA传输部分,对DMAC寄存器配置,实现DDR与AD9361之间的数据传输和直接访问功能,DAC中DMA初始化配置是利用dac_dma_write()函数向dma特定地址中写入参数值,其中包括:
dac_dma_write(AXI_DMAC_REG_CTRL, 0);
dac_dma_write(AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE);
dac_dma_write(AXI_DMAC_REG_SRC_ADDRESS, DAC_DDR_BASEADDR);
dac_dma_write(AXI_DMAC_REG_SRC_STRIDE, 0x0);
dac_dma_write(AXI_DMAC_REG_X_LENGTH, length - 1);
dac_dma_write(AXI_DMAC_REG_Y_LENGTH, 0x0);
dac_dma_write(AXI_DMAC_REG_START_TRANSFER, 0x1);
在ADC初始化和输入捕获设置时,adc_init(struct ad9361_rf_phy *phy),adc_capture(uint32_t size, uint32_t start_address),首先初始化时包括了指向AD9361的射频设备结构体的指针,对ADC的捕获设置时,需设置捕获的数据量以及存储捕获数据的目的地址。同时同DAC一样进行ADC的DMA初始化配置,利用adc_dma_write()和adc_dma_read()函数进行dma特定地址的读出和写入参数操作。其中ADC的DMA的使能,初始化,传输地址和字节设置与DAC相似,但是有两个中断状态的读取和写入操作如下:
adc_dma_read(AXI_DMAC_REG_IRQ_PENDING, ®_val);
adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val);
|