这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 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 MAX5121D/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相连时输出为双极性。MAX5121CLR引脚与DSP复位脚相连时,在系统复位时D/A输出为0V。


1.SPI总线波特率设置


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


4.4.2 TMS320F28335 D/A转换软件设计


2.MAX5121与DSPSPI软件实现


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


本程序主要包括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 跳转至

回复

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