通过SPI总线初始化AD9626/AD9601系列ADC

AD9626/AD9601系列ADC使用串行外设接口(Serial Peripheral Interface,SPI)总线进行内部寄存器的配置。该系列ADC涉及的引脚包括:

  • CSB片选信号(Chip Select Bank)引脚,低电平有效。
  • SCLKSPI时钟信号。
  • SDIOSPI串行数据信号。

该系列ADC的传输模式为:首先拉低片选信号CSB,随后向时钟线SCLK加载时钟、数据线SDIO加载数据。每次传输的数据比特会在时钟SCLK的上升沿被从数据线SDIO读取。传输完毕后,拉高片选信号CSB

该系列ADC的SPI传输在单字节模式下,每次传输24个比特的指令帧Data[23:0]。MSB优先模式下,最先发送Data[23]。该指令帧的解释为:

  • Data[23]读写选通位R/W。向ADC发送数据(写寄存器)时,应置为0
  • Data[22:21]数据字长选择位{W1, W0},指定该指令帧中数据负载的字节长度。单字节传输时,应取{W1, W0} == 2'b00,即数据负载长度为1字节1
  • Data[20:8]13比特地址段ADDR[12:0],指示该指令帧的数据负载将被写入或读取的寄存器起始地址。对于AD9626/AD9601系列ADC,仅使用地址的低8位ADDR[7:0],地址的高5位ADDR[12:8]始终为0
  • Data[7:0]8比特(1字节)数据负载,指示需要写入目标寄存器地址的数据。多字节模式(数据字长选择位{W1, W0} != 2'b00时)下,一个指令帧会包含多个数据负载。此时指令帧的长度为16 + 8 * N, N >= 1N为数据负载个数。

每次传输结束后,可以向地址0xFF传送数据0x01,指示ADC将数据从缓冲区转移到实际寄存器内。

AD9626/AD9601系列ADC初始化需要的寄存器简表如下,有关详细信息,请参阅Analog Devices数据手册:

地址 名称 释义
0x00 chip_port_config 芯片端口配置寄存器。该寄存器低4位和高4位在传输时必须互为镜像。chip_port_config[3]chip_port_config[4]必须始终为1chip_port_config[0]chip_port_config[7]必须始终为0chip_port_config[1]chip_port_config[6]1时,启用LSB优先传输方式,否则为MSB优先;chip_port_config[2]chip_port_config[5]1时,指示芯片进行软复位,软复位结束后这两个位将被自动置为0。该寄存器默认值为0x18。对该寄存器的写入会被设备立即响应。
0xFF device_update 寄存器更新指示寄存器。将device_update[0]置为1将强制芯片将数据从缓冲区刷新到实际的寄存器。结束后这个位将被自动置为0。该寄存器默认值为0x00。Analog Devices手册推荐在配置完所有寄存器后再发起数据转移。
0x08 modes 电源模式寄存器。将modes[5]置为1将使芯片进入待机模式。modes[2:0]指示了内部供电状态,3'b000为默认状态,3'b001为完全掉电状态,3'b010为待机状态,3'b011为默认状态。该寄存器默认值为0x00
0x09 clock 时钟模式寄存器。将clock[0]置为1将启用占空比均衡器(Duty Cycle Stabilizer)。该寄存器默认值为0x01
0x0D test_io 测试信号输出模式寄存器。将clock[3:0]置为非4'b0000的值将启用测试信号输出。该寄存器默认值为0x00
0x0F ain_config 模拟信号输入模式寄存器。将ain_config[1]置为1将启用共模输出引脚(CML);将ain_config[2]置为1将禁用模拟输入。该寄存器默认值为0x00
0x14 output_mode 输出模式寄存器。将output_mode[5]置为1将交错输出;将ain_config[4]置为1将禁用输出;将ain_config[2]置为1将反转输出;ain_config[1:0]指定了输出编码方式,2'b00为二进制偏移量,2'b01为补码输出,2'b10为格雷码输出。该寄存器默认值为0x00
0x16 output_phase 输出相位寄存器。将output_phase[7]置为1将反转输出时钟极性。该寄存器默认值为0x03
0x17 flex_output_delay 相位延时控制寄存器。将flex_output_delay[7]置为1将禁用输出延时;flex_output_delay[4:0]控制了输出延时的长度,单位为纳秒(ns),控制精度为0.1 ns,即Delay = flex_output_delay[4:0] * 0.1 + 0.1。该寄存器默认值为0x00
0x18 flex_vref 输入电压范围控制寄存器。flex_vref[4:0]控制了输入电压的范围,单位为伏特(V),控制精度为0.02 V。flex_vref[4] == 1'b0时,有Vref = flex_vref[3:0] * 0.02 + 1.25flex_vref[4] == 1'b1时,有Vref = flex_vref[3:0] * 0.02 + 0.982。该寄存器默认值为0x00

下面的代码演示了AD9626/AD9601系列ADC的初始化。函数WriteADCParameters(int16 iCommand)调用SPI总线控制器,以单字节模式、MSB优先的传输方式传送控制字。16位整型参数iCommand的高8位为地址,低8位为数据,并被填充为24位指令帧的低16位。24位指令帧的高8位被自动填充为8'b00000000。初始化参数大多使用默认值,但修改了输入电压范围,并启用了共模输出(CML),并禁用了输出延迟。

//Initiate ADC soft reset
//Commands sent to register 0x00 will be executed automatically
//Thus we don't need to flush it to device by sending 0x01 to register 0x00
DeviceControl::WriteADCParameters(0x003C);
usleep(2450);
//"chip_port_config" register, use default value
DeviceControl::WriteADCParameters(0x0018);
//"modes" register, use default value (full power)
DeviceControl::WriteADCParameters(0x0800);
//"clock" register, use default value (duty cycle stabilizer enabled)
DeviceControl::WriteADCParameters(0x0901);
//"test_io" register, use default value (don't use test data)
DeviceControl::WriteADCParameters(0x0D00);
//"ain_config" register, enable CML (Common-Mode Output)
DeviceControl::WriteADCParameters(0x0F02);
//"output_mode" register, use default value (no interleave, enable output, no invert, offset binary mode)
DeviceControl::WriteADCParameters(0x1400);
//"output_phase" register, use default value (normal output clock polarity)
DeviceControl::WriteADCParameters(0x1603);
//"flex_output_delay" register, output delay disabled
DeviceControl::WriteADCParameters(0x1780);
//"flex_vref" register, use 5'b01111 (1.5V)
DeviceControl::WriteADCParameters(0x180F);
//Send command 0xff01 to flush data from Master register to Salve register
DeviceControl::WriteADCParameters(0xFF01);

参考资料:

https://www.analog.com/media/en/technical-documentation/application-notes/AN-877.pdf

https://www.analog.com/media/en/technical-documentation/data-sheets/AD9601.pdf

https://www.analog.com/media/en/technical-documentation/data-sheets/AD9626.pdf

it
除非特别注明,本页内容采用以下授权方式: Creative Commons Attribution-ShareAlike 3.0 License