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();
}
}