TLV5608是TI公司生产的8路10位电压输出型数模转换器(DAC),具有灵活的四线串行接口,可以与TMS320、SPI、QSPI和Microwire串行口实现无缝联接。TLV5608的编程控制有16位串行字组成,即4位控制和12位的DAC输入数据。该器件采用单电压供电,供电电压可以是2.7V至5.5V之间的任何值。
1.TLV5608的引脚说明

DVDD和DGND:芯片供电端,现使用5V供电;
AVDD和AGND:模拟信号供电,接5V;
DIN:串行数据输入,输入数据为16位,分为两部分,D11~D0为数据位,D15~D12为通道选择位;
DOUT:串行输出DIN输入的数据;
SCLK:串行数据输入同步时钟,最大为30MHz;
OUTA~OUTH:8路模拟量输出;
REF:8路D/A转换的参考电压,+5V;
MODE:工作模式选择位,MODE=0为DSP模式,MODE=1为µC模式,本系统选用µC模式,MODE直接接+5V;
FS:帧同步信号,下降沿时串行数据帧开始传入TLV5608,可用作片选信号使用;
:LDAC加载位,低电平有效。 为低电平时,将DAC保持寄存器的值移入DAC锁存器并更新DAC输出。若不需要同时更新8路通道, 可保持低电平;该系统不需要同时更新8路输出,因此将 直接接地。
:可预置的输入位。
2.TLV5608的控制寄存器
(1) 控制寄存器0(CTRL0)
D11 …… D5 D4 D3 D2 D1 D0
x …… x PD DO x x IM
PD-低功耗驱动:PD=0时,正常模式;PD=1时,低功耗。
DO-数字输出使能:DO=1时,DOUT引脚输出传送的数据。
IM-输入模式:IM=0时,直接输入二进制数据;IM=1时,二进制补码输入。
(2) 控制寄存器1(CTRL1)
D11 …… D8 D7 D6 D5 D4 D3 D2 D1 D0
x …… x PGH PEF PCD PAB SGH SEF SCD SAB
PXY=1时,DACXY低功耗;
SXY=1时,DACXY快速传输;SXY=0时,DACXY低速传输。
3.TLV5608工作原理
TLV5608是一种电阻串结构的10位DAC,器件由串行接口、速度和掉电控制逻辑、基准输入缓冲器、电阻串以及满幅度输出缓冲器组成。其输出电压由下式给出:
(REF×CODE)/(0x1000)V
满幅度取决于外部基准。其中REF是基准电压,CODE是在0x000至0xFFC范围内的输入数字值(由于TLV5608是10位的D/A转换芯片,16位CODE中的最后两位无效,因此CODE的最大取值为0xFFC)。
TLV5608的16位数据由两部分组成:通道控制位(D15~D12)和数据位(D11~D0)。如下所示。通道控制位(D15~D12即A3~A0),决定数据输出到哪个通道。当A3~A0=0x0000~0x0111时对应通道DAC A~DAC H;当A3~A0=0x1000选择寄存器CTRL0;当A3~A0=0x1001选择寄存器CTRL1,其他取值这里不作介绍。
D15 D14 D13 D12 D11 …… D2 D1 D0
A3 A2 A1 A0 12位数据
在µC Mode(MODE接高电平)下传送数据时,首先,FS引脚打高电平,把要传送的数据发送到数据线上;然后,给FS引脚低电平,FS的下降沿开始,在SCLK的每个下降沿使数据一位接一位的移入内部数据寄存器(从高位开始)。在传送了16位数据后或者FS的上升沿到达后,移位寄存器的内容送至DAC锁存器。
10.7.2 SPI模块与TLV5608的接口实现
图10-11给出了利用SPI及MCU的PTC口的PTC2-PTC3扩展二片TLV5608的电路原理。其中使用TLV5608中的FS引脚作为片选信号,MODE引脚接高电平(即使用µC MODE)。第0片TLV5608的FS引脚接MCU的PTC2、第1片TLV5608的FS引脚接MCU的PTC3,每片TLV5608可以输出8路模拟量,这样图10-11电路可外接16路模拟量。当有更多路数模拟量需要输出时,可以按此方法继续扩展。该电路适用于模拟量路数较多、对实时性要求不是太高的D/A转换系统。

10.7.3 扩展D/A的程序实现
程序实例所在的路径:MC08Ex2007\GP32\GP32C\C06_TLV5608。
1.D/A转换有关C语言子函数
//[DAC.c]---------------------------------------------------------------------*
//文件描述:本文件包含了D/A的4个子函数,分别是: *
//(1)DA_SPIInit:SPI初始化子程序 *
//(2)TLV5608Init:TLV5608初始化 *
//(3)TLV5608Z:1路DA转换子程序 *
//(4)DAC:2片TLV5608转换 *
//----------------------------------------------------------------------------*
//[包含头文件]
#include "DAC.h"
//DA_SPIInit:SPI初始化子程序--------------------------------------------------*
//功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟 *
// 空闲低电平,比特率2分频, *
// 波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz) *
//参 数:无 *
//返 回:无 *
//----------------------------------------------------------------------------*
void DA_SPIInit(void)
{
SPCR=0b00100010; //不产生中断、主机方式、时钟空闲低电平
SPSCR=0b00000000; //2分频
}
//TLV5608芯片D/A转换初始化子程序----------------------------------------------*
//功 能:初始化2片TLV5608的CTRL0、CTRL1寄存器 *
//参 数:无 *
//返 回:无 *
//----------------------------------------------------------------------------*
void TLV5608Init(void)
{
INT8U fs;
for(fs=0;fs<=1;fs++)
{
//1 初始化设置
CS_D |=0b00001100; //定义PTC2~3为输出
CS_P |=0b00001100; //PTC2~3输出为高电平
//2 设置CTRL0寄存器
//2.1相应片TLV.FS由高电平变为低电平,产生下降沿
// 此后在每个SCLK的下降沿传送一位数据,共传输16位数据
CS_P &= ~(1<<(fs+2));
//2.2延时20个时钟周期
Delay();
//2.3发送高8位数据(CTRL0地址为1000)
SPIDR=0b10000000;
while((SPISCR & (1<<SendEmyptBit)) == 0); //等待SPTE为1,发送完毕
//2.4发送低8位数据
SPIDR=0b00000000;
while((SPISCR & (1<<SendEmyptBit)) == 0); //等待SPTE为1,发送完毕
asm("nop");
asm("nop");
//2.5数据传输完毕,相应片TLV.FS由低电平变为高电平
CS_P |= (1<<(fs+2));
//3 设置CTRL1寄存器
CS_P &= ~(1<<(fs+2));
Delay();
//3.1发送高8位数据(CTRL1地址为1001)
SPIDR=0b10010000;
while((SPISCR & (1<<SendEmyptBit)) == 0);
//3.2发送低8位数据(正常电压,快速)
SPIDR=0b00001111;
while((SPISCR & (1<<SendEmyptBit)) == 0);
CS_P |= (1<<(fs+2));
}
}
//D/A转换子程序---------------------------------------------------------------*
//功能:将TLV5608(0)-(1)片,数字量转换为模拟量,由16通道输出 *
//参数:value--2片5608、16路通道的数字量值 *
//返回:无 *
//调用:TLV5608Z *
//----------------------------------------------------------------------------*
void DAC(INT16U *value)
{
INT8U i;
TLV5608Init(); //TLV5608初始化
for(i=1;i<=16;i++)
TLV5608Z(i,*(value+i-1));
}
///TLV5608芯片D/A转换子程序---------------------------------------------------*
//TLV5608的接线: *
// ① SCLK(3)接MC08HC908GP32的SPSCK(18) *
// ② DIN(2)接MC08HC908GP32的MOSI(17) *
// ③ LDAC(18)接MC08HC908GP32的PTC4 *
// ④ 0-1片FS(作为片选信号)分别接的PTC2~3 *
// ⑤ MODE接高电平,选择uC模式 *
//参数:channel-通道号(1-16),buf-存放数据 *
//返回:无 *
//----------------------------------------------------------------------------*
void TLV5608Z(INT16U channel, INT16U buf)
{
INT8U fs;//片选号
INT16U value;
//channel=1;
//1 设置片选
if((channel>0)&&(channel<9))
fs=0;
else
fs=1;
//2 整合要发送的16位数据-(value的高4位为通道号,后12位为数据位)
value=((channel-fs*8-1)<<12)|buf;
//3 发送16位数据
//3.1引脚
CS_D |=0b00001100; //定义PTC2~3为输出
CS_P |=0b00001100; //PTC2~3输出为高电平
//3.2相应片TLV.FS由高电平变为低电平,产生下降沿
// 此后在每个SCLK的下降沿传送一位数据
CS_P &= ~(1<<(fs+2));
//3.3延时20个时钟周期
Delay();
//3.4发送高8位数据
SPIDR=value>>8;
while((SPISCR & (1<<SendEmyptBit)) == 0);
//3.5发送低8位数据
SPIDR=value;
while((SPISCR & (1<<SendEmyptBit)) == 0);
asm("nop");
//3.6数据传输完毕,相应片TLV.FS由低电平变为高电平
CS_P |= (1<<(fs+2));
}
2.D/A转换08C测试实例主函数
//----------------------------------------------------------------------*
//工 程 名:DA.prj *
//硬件连接: ① SCLK(3)接MC08HC908GP32的SPSCK(18) *
// ② DIN(2)接MC08HC908GP32的MOSI(17) *
// ③ LDAC(18)接MC08HC908GP32的PTC4 *
// ④ 0-1片FS(作为片选信号)分别接 PTC2~3 *
// MODE接高电平,选择uC模式 *
//程序描述: 将16位的数据进行D/A转换 *
//目 的:掌握DA转换的编程方法 *
//日 期:2007.02.01 *
//------------------清华2007版《嵌入式技术基础与实践》实例--------------*
//[头文件]
#include "Includes.h"
//[主函数]
void main()
{
INT16U DAvalue[16]; //存放8路DA转换的16位数据
INT8U i;
DisableMCUInt(); //禁止总中断
//1. 芯片初始化
MCUinit();
//2. 模块初始化
DA_SPIInit(); //SPI初始化
TLV5608Init(); //TLV5608芯片D/A转换初始化
while(1)
{
for(i=0;i<16;i++)
DAvalue[i]=0x0fff;
//D/A转换
DAC(DAvalue);
}
}


