这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » TMS320F28335 D/A转换硬件设计

共1条 1/1 1 跳转至页

TMS320F28335 D/A转换硬件设计

助工
2014-08-20 19:47:43     打赏

TMS 320F28335 D/A转换设计


TMS320F28335已集成一个12位带流水线的模数转换器,所以要进行模数转换时,直接使用芯片自带的模数转换器。但要进行D/A转换时,芯片自身不带D/A转换器,所以需要外加D/A转换芯片。目前的D/A转换芯片主要有采用SPI串行接口的芯片(如MAX5121,图4.10)和并行接口芯片(如DAC7724)等。


4.4.1 TMS320F28335 D/A转换硬件设计



MAX5121是MAXIM公司生产的12位低功耗电压输出型串行数模转换器(DAC),具有SPI接口,内含+1.25V的基准电压输出。在使用内部基准参考电压源时,其最大输出电压为2.0475V MAX5121的D/A转换有两级输入缓冲区:输入寄存器和DAC寄存器。根据MAX5121引脚OS的不同接法,可输出单极性和双极性的电压。由于MAX5121只输出一路模拟信号,当需要多路模拟信号时,可以把多片MAX5121串连起来使用。只要把上一片的DOUT与下一片的DIN相连,时钟线SCLK相同,片选线CS可以相同也可以不同。根据芯片手册,引脚OS为偏移量量调整(模拟输入),OUT为模拟电压输出,RSTVAL为复位时电压输出值选择,CLR为复位DAC输入(数字输入)。DIN串行数据输入端,数据在SCLK的上升沿被锁存。SCLK为串行时钟输入,DOUT为串行数据输出,CS为片选信号。


在我的设计中,由于考虑到成本的因素,同时转换速度的要求(虽然MAX5121较慢,其通讯频率最高可达到6.6M,但满足我的要求),所以选用MAX5121芯片。D/A转换硬件原理图如图4.11所示



说明::在该图中,TMS320F28335作为SPI的主机,MAX5121作为从机,即只接收来自主机的数据,然后进行D/A转换从OUT引脚输出模拟电压信号。JP7用来D/A单极性或双极性输出,当1和2相连时输出为单极性,1和3相连时输出为双极性。MAX5121的CLR引脚与DSP的复位脚相连时,在系统复位时D/A输出为0V。


1.SPI总线波特率的设置


在主动模式下,DSP的SPICLK引脚向网络输出时钟,且该时钟频率不能大于LSPCLK频率的四分只一。由于不同SPI器件的最高频率不同,为了使SPI总线高效工作,应了解各个SPI器件最高能接受的频率,再取较低频率SPI器件的最高频率作为通信波特率。DSP的主频为150M,LSPCLK设为25M,它作为SPI的主机时,其频率可达到LSPCLK频率的四分之一6.25M,MAX5121的SPI通讯频率可达到6.6M,所以本设计中SPI总线的最高频率为6.25M。


4.4.2 TMS320F28335 D/A转换软件设计


2.MAX5121与DSP的SPI软件实现


以下程序是基于SPI总线用DAC输出一个三角波。由于MAX5121为SCLK的上升沿时接收SPI上的数据,因此DSP要用无延时的下降沿(或有延时的下降沿)时钟方式来发送SPI数据,这样才能配合MAX5121的SPI时序。


本程序主要包括SPI模块初始化,SPI发送数据和三角波程序三部分。


#include "DSP2833x_Device.h"    


#include "DSP2833x_Examples.h"


int   GPR3;               


int   flag1;


int   flag;


//SPI模块初始化子程序


void spi_init()


{   


    SpiaRegs.SPICCR.all =0x000F;// SPI复位,设置时钟为上升沿,16位字符长度


    SpiaRegs.SPICTL.all =0x0006; //使能主模式,标准相位,使能TALK,SPIINT屏蔽


    SpiaRegs.SPIBRR =0x0004;     //波特率设置为5M


    GpioCtrlRegs.GPAMUX1.all = 0x00000000;


   GpioCtrlRegs.GPBMUX2.all = 0x00055000;  // 设置GPIO54,GPIO56为SPI功能      SpiaRegs.SPICCR.all =0x009F;     //使SPI退出复位状态         


   SpiaRegs.SPIPRI.bit.FREE = 1;             


}


//SPI发送数据子程序,需要发送的数据存放在GPR3寄存器中


int SPITRANS()


{ GpioCtrlRegs.GPADIR.bit.GPIO15=1;//GPIO15为输出,控制MAX5121 CS端


  GpioCtrlRegs.GPBDAT.bit.GPIO15=0;//使能MAX5121


  SpiaRegs.SPITXBUF=GPR3;  


  while(1)


   {flag=SpiaRegs.SPISTS.all&0x40;//flag=SPI的中断标志


   if(flag==0x40)  break;//如果的中断标志位为1,则证明SPI已经发送成功,则停止等待


    }


  SpiaRegs.SPIRXBUF=SpiaRegs.SPIRXBUF;//虚读SPIRXBUF,以清除SPI中断标志


  GpioCtrlRegs.GPBDAT.bit.GPIO15=0;//发送完毕,则GPIO15输出高,使发送的数据输出到MAX5121的输入寄存器和DAC寄存器


void main(void)


{


   InitSysCtrl();//系统初始化


 void spi_init();//SPI初始化


DINT;


   IER = 0x0000;


   IFR = 0x0000;


InitPieCtrl();


InitPieVectTable();


EALLOW;  


PieVectTable.SPIRXINTA = &spiRxFifoIsr;


   PieVectTable.SPITXINTA = &spiTxFifoIsr;


   EDIS;  


  GPR3=0x4000;//根据MAX5121的格式写了一个数据,使其输出的模拟量为0.具体的数据格式芯片手册有说明.


flag1=0x00;//三角波上升沿,下降沿标志,当flag1=0时,为上升沿,当flag1=1时,为下降沿.


while(1)


{ if(flag1==0x00)  GPR3=GPR3+2;//因数据从倒数第二位开始,故要使数据加1,则须在实际的寄存器中//加2,此操作对应三角波的上升沿


  else  GPR3=GPR3-2;// 因数据从倒数第二位开始,故要使数据减1,则须在实际的寄存器中减2,此操作//对应三角波的下降沿


if(GPR3==0x5FFE)  flag1=0x01;


  if(GPR3=0x4000)   flag1=0x00;


  SPITRANS();


}


}


共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]