引言
随着通信、工业仪器设备和便携式设备的发展,新一代高速DAC逐渐朝高性能、低功耗、芯片多功能集成和输入输出高速化的方向发展。AD970X系列DAC针对低功耗特性进行了优化,同时仍保持出色的动态性能,适用于手持便携式仪器等需要有效合成宽带信号的场合。AD9707 精度高达14位,其采样率为175 Msps,内部集成边沿触发式输入锁存器,1.0 V温度补偿带隙基准电压源和自校准功能使之能提供真14位INL与DNL性能。AD9707还具有共模电位移动能力,当与其他模拟器件连接时无需电平移动电路,从而简化了模拟电路的设计,并且减小了小型便携式设计中的印制电路板面积。
由于DAC内部集成度越来越高,外围辅助电路越来越少,通过外围引脚的设置很难把DAC所有的功能发挥出来。高速DAC内部一般集成内部寄存器,用户可以通过修改DAC的内部寄存器,使DAC输入输出模式达到设计要求。为了减少芯片引脚数量,内部寄存器一般是通过串行接口来配置,比较常见的接口有SPI、I2C和串行2wire等。AD9707使用的是SPI接口。
1AD9707测试
测试电路主要由Samsung公司微处理器S3C2410、Altera公司CycloneIII系列FPGA EP3C25和ADI公司的AD9707组成。FPGA主要负责算法, ARM微处理器主要负责控制字输入和LCD显示。测试时,分别使用S3C2410的SPI接口和EP3C25模拟SPI接口,来配置AD9707内部寄存器。测试的过程是,在FPGA中构建了一个DDS(数字直接频率合成器),通过修改控制字来改变输出波形数据,经AD9707转换后检测输出的波形。
如图1所示,AD9707的基本外围电路由低电压异或门74VX86和运算放大器ADA4899组成。测试时可以通过跳线J1选择AD9707的工作模式:高电平时为PIN模式;低电平时为SPI模式;出现高电平脉冲时复位内部寄存器。图中AD9707的输入时钟选择差分时钟;输出选择单端输出,正向输出端IOUTA与ADA4899的反相输入端相连,反向输出端IOUTB接地;内部基准电压源REFIO与ADA4899的同相输入端相连。ADA4899将AD9707单端输出的电流变化转换为电压变化。外部使用内部基准电压源时,REFIO引脚需用一个0.1 μF电容接地。74VX86与外部SPI接口相连,主要起电压匹配整形作用。它的电压范围为1.2~3.6 V,支持AD9707工作的1.8 V和3.3 V。
图1AD9707的基本外围电路
2SPI模式下AD9707与外部CPU的通信
在AD9707测试之前,必须按照外围电路的设计配置好AD9707的工作状态。AD9707有两种配置模式可供选择:PIN模式和SPI模式。设备可以通过PIN模式进行简单配置,也可以通过SPI模式进行高级配置。当用户使用自校准等高级功能时,必须使用SPI模式配置AD9707内部寄存器。
SPI(Serial Peripheral Interface,串行外围设备接口),主要应用在EEPROM、Flash、ADC/DAC上。SPI是一种高速的、全双工、同步的通信总线,在芯片的引脚上只占用4根线,为PCB的布局节省了空间。正是由于这种简单易用的特性,现在绝大多数芯片都集成SPI通信协议。
SPI的通信原理很简单,它以主从方式工作。这种模式通常有一个主设备和一个(或多个)从设备,需要4根线(单向传输时3根也可以)。AD9707的SPI接口由SCLK(串行时钟)、SDIO(数据输入输出)和CSB(片选)3根信号线组成。串行时钟SCLK用来同步数据,并从AD9707中运行内部状态机,最大频率是20 MHz。串行数据输入输出SDIO作为双向的数据总线,用于发送或接收数据。片选信号CSB低电平时启动通信周期,它允许多个设备在同一条通信线路上使用。当CSB为高电平时,SDIO引脚为高阻抗状态。在整个通信周期内,CSB必须保持低电平[1]。
图2是外部SPI端口与AD9707通信的时序图。
图2最高有效位先写入的SPI通信时序
整个通信周期分为指令阶段和数据传输阶段。第1阶段是指令阶段,在前8个SCLK上升沿时将8位指令字节写到AD9707中。指令字节决定了通信中第2阶段的数据传输模式,定义第2阶段的数据传输是读或写,以及数据传输的字节数和传输数据第1个要修改的寄存器地址。指令字节组成如下:
R/W决定指令写入后,数据传输是读取还是写入。N1和N0决定数据传输的字节数。A4~A0决定数据传输时被访问的寄存器地址,多字节传输时用它来定义起始寄存器地址。
第2阶段是数据传输阶段,在此阶段外部SPI控制器与AD9707开始传输数据。一次传输的数据量由指令阶段来决定,可以传输1~4个字节的数据。每个字节最后一位传输完成后,寄存器立刻改变。
当AD9707的17脚(PIN/SPI/RESET)上有一个下降沿电平变化时,SPI端口的计数器将复位到指令周期的初始状态。如果SPI端口正处于一个指令周期或数据传输周期,寄存器中不会写入任何数据。
AD9707内部寄存器主要包括:寄存器SPI CTL,地址为0x00,用于设置SPI通信的具体模式、软复位和内部参考源等,按照测试电路要求设置为0x80;寄存器DATA,地址为0x02,主要用于设置输出模式选择、数据上升沿锁存和时钟输入模式选择等,按照测试电路要求设置为0x0;寄存器CALMEM、MEMRDWR和TRIM等用于校准和静态寄存器访问。测试时主要使用寄存器SPI CTL和DATA。下面围绕着这两个寄存器的配置介绍两种配置方式。
3通过SPI端口配置AD9707内部寄存器
3.1使用ARM微处理器的SPI接口
S3C2410是Samsung公司推出的采用RISC结构的16/32位ARM微处理器。它基于ARM920T内核,采用五级流水线和哈佛结构,频率达到203 MHz,是高性能、低功耗的硬宏单元。S3C2410还包含下列部分:LCD控制器(STN&TFT)、NAND Flash引导装入程序、系统管理(片选逻辑和SDRAM控制器)、3通道UART、4通道DMA、4通道PWM时钟、I/O口、RTC、8通道10位ADC及触摸屏接口、I2C总线接口、I2S总线接口、USB主口和设备口和2通道SPI总线接口。
S3C2410具有2个SPI接口模块,每个模块分别具有2个8位移位寄存器用来接收和发送数据。数据的接收(串行移入)和发送(串行移出)是同时进行的,串行数据的速率由相应的寄存器设定。其时序很简单,主要是在CLK的控制下,2个双向移位寄存器进行数据交换。当一个数据写入SPTDATn寄存器时,如果ENSCK和SPCONn寄存器中的MSTR位被置位,则启动数据发送[2]。SPI接口发送数据的流程如图3所示。
图3SPI数据发送流程
使用S3C2410的SPI端口0来配置AD9707内部寄存器的主程序如下:
void Spi_MS_poll(void){
int i;
S16 a[2]={0x0080,0x0200};//地址0x00的数据为0x80,//地址0x02的数据为0x00
for(i=0;i<2;i++){//通过两次赋值
SPI_Port_Init(0);//SPI端口初始化
rSPPRE0=0x0;//设置波特率SCLK为20Mb/s
rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//设置SPI端口为Polling模式,时钟使能,SPI为主控模式
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//禁止多主控错误检测使能,主机输出后释放MOSI
if(rSPSTA0&0x1){//检查SPI0的状态
rSPTDAT0=a[i]; i++;//发送数据,准备下一次发送
}
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//设置SPI端口为Polling模式,禁止SCK,选择主控模式
}
}
使用S3C2410的SPI接口可以很方便地配置AD9707,但是在测试电路板上S3C2410离AD9707较远,布线时比较复杂,不得不使用飞线。为了解决布线困难的问题,采用FPGA模拟SPI接口配置AD9707内部寄存器。
3.2使用FPGA模拟SPI接口
FPGA(Field Programmable Gate Array)即现场可编程门阵列。FPGA的使用非常灵活,同一片FPGA通过不同的程序可以产生不同的电路功能。本文使用VHDL语言编写一个SPI控制器,来发送配置数据给AD9707。
当仅需要向AD9707中写入数据时,使用SPI时钟线SCLK、SPI数据线SDIO和片选线CSB即可通信。根据图2中的写入时序编写程序[3],具体代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY SPI IS
GENERIC(DATA:STD_LOGIC_VECTOR(11 DOWNTO 0):="110101101011");配置数据
PORT(SCLK:IN STD_LOGIC;
CSB,SDIO: OUT STD_LOGIC);
END SPI;
ARCHITECTURE BEHAVE OF SPIIS
SIGNAL COUNT: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL REG: STD_LOGIC_VECTOR(11 DOWNTO 0);
SIGNAL X: STD_LOGIC;
BEGIN
PROCESS(SCLK,X)产生片选信号CSB
BEGIN
IF (SCLK'EVENTAND SCLK='1') THEN
IF(COUNT<"1111") THEN
COUNT<= COUNT+'1';
X<= '0';
ELSE
COUNT<= (OTHERS =>'1');
X<= '1';
END IF ;
END IF ;
CSB<= X;
END PROCESS;
PROCESS(SCLK)从SDIO串行发送配置数据
BEGIN
IF(SCLK'EVENT AND SCLK='1')THEN
IF(COUNT="0001")THEN REG<=DATA;
ELSE
REG<=REG (10 DOWNTO 0) & '0';
END IF;
END IF;
END PROCESS;
SDIO <=REG (11);
END BEHAVE;
程序编译仿真后得到的时序图如图4所示。整个程序综合之后仅占用4个逻辑单元,使用类属参数定义配置数据,方便用户按照自己的设计随意修改。由于AD9707与FPGA直接相连,用FPGA直接配置AD9707在PCB走线上方便很多,比较适合于我们的测试平台。通过在FPGA中构建的DDS发送波形数据,即可构成一个简易波形发生器,产生一些常见的波形。
图4FPGA模拟SPI接口发送数据的时序仿真图
结语
本文着重介绍了使用ARM微处理器和FPGA这两种常见的嵌入式处理器来配置AD9707,具有一般性和实用性。经测试检验,配置正确。由于大多数公司的DAC都是使用SPI接口配置内部寄存器,因此本文的程序也可用于配置其他DAC。