TLV5610在F28335芯片上的使用教程

1. TLV5610芯片简介

        TLV5610、TLV5608和TLV5629是引脚兼容的八通道12/10/8位电压输出DAC,每个DAC都具有灵活的串行接口。该串行接口允许无缝连接到TMS320和SPI、QSPI和Microwire串行端口。它使用一个包含4个控制位和12个数据位的16位串行字符进行编程。

        其他功能包括关机模式、用于同时更新所有八个DAC输出的LDAC输入,以及可以将多个设备级联的数据输出。

简言之:

        TLV5610是一个12bit,具有八通道输出的DAC芯片,通讯方式为SPI或者其他。


2. TLV5610芯片控制方式

        通过数据手册可以看到,这个DAC芯片的通信方式较为简单。

        TLV5610是通过SPI进行通信,但是在实际使用过程中发现,使用SPI通信时,底层配置较为麻烦,所以选择了使用GPIO模拟SPI通信的方式实现。

端口选择问题:


3. TLV5610芯片在F28335上的实现方式

        考虑使用GPIO模拟时可以先选定GPIO口:

DAC接口定义

GPIO51LDAC
GPIO52FS
GPIO53SCLK
GPIO54DATA
GPIO55DOUT
GPIO56FRE

        GPIO初始化配置:

 /**
  * @brief  GPIO初始化
  * @param  无
  * @retval 无
  */
void configtestled(void)
{
   EALLOW;
   GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0; // GPIO0复用为GPIO功能
   GpioCtrlRegs.GPBDIR.bit.GPIO51 = 1;  // GPIO0设置为输出
   GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0; // GPIO1 = GPIO1
   GpioCtrlRegs.GPBDIR.bit.GPIO52 = 1;
   GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1;
   GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO54 = 1;
   GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;
   GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO56 = 1;
   EDIS;
}

        配置GPIO动作预定义:

#define   SCLK_HIGH     GpioDataRegs.GPBSET.bit.GPIO53 = 1
#define   DATA_HIGH     GpioDataRegs.GPBSET.bit.GPIO54 = 1
#define   FS_HIGH       GpioDataRegs.GPBSET.bit.GPIO52 = 1
#define   LDAC_HIGH     GpioDataRegs.GPBSET.bit.GPIO51 = 1
#define   FRE_HIGH      GpioDataRegs.GPBSET.bit.GPIO56 = 1

#define   DOUT_HIGH      GpioDataRegs.GPBSET.bit.GPIO55 = 1
#define   DOUT_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1

#define   SCLK_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO53 = 1
#define   DATA_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO54 = 1
#define   FS_LOW        GpioDataRegs.GPBCLEAR.bit.GPIO52 = 1
#define   LDAC_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO51 = 1
#define   FRE_LOW       GpioDataRegs.GPBCLEAR.bit.GPIO56 = 1

        配置初始化函数:

 /**
  * @brief  TLV5610芯片初始化,上电将每个端口输出为0
  * @param  无
  * @retval 无
  */
void DAC_Tlv56xx_Init(void)
{
    int i;
    configtestled();
    //DOUT_LOW;
    DOUT_HIGH;

    LDAC_HIGH;
    FRE_HIGH;
    DELAY_US(100000);
    for(i = 0; i < 8; i++)
        TLV56XX_WriteChannelValue(i, 0);
    DELAY_US(50000);
}

        发送数据函数:

/**
 * @brief  选择通道,发送数据
 * @param  channel:单通道输出选择通道地址
 *         通道A:	0		通道B:	1		通道C:	2
 *         通道D:	3		通道E:	4		通道F:	5
 *         通道G:	6		通道H:	7
 *         双通道输出:
 *         通道AandB:	12		通道CandD:	13
 *         通道EandF:	14      通道GandH:	15
 * @param  dat :0~4096数据,输入电压范围0~5v
 * @retval 无
 */
volatile  Uint16 Cmd;
void WriteChannelValue(Uint16 channel, Uint16 value)
{
  int i;
  Uint16 bit_state;
  //TLV5610     12BIT
  Cmd = (channel<<12)|((value)&0X0FFF);

  //LDAC_HIGH;
  FS_HIGH;
  FS_LOW;
  for(i = 0; i < 16; i++)
  {
    SCLK_HIGH;
    bit_state = Cmd&0X8000;
    if(bit_state)
      DATA_HIGH;
    else
      DATA_LOW;
    SCLK_LOW;
    Cmd <<= 1;
  }
    FS_HIGH;
    LDAC_LOW;
//  LDAC_LOW;

    LDAC_HIGH;
}

        使用函数:


 /**
  * @brief  标幺化,将正弦波的幅值转换为[0,2]之间
  *         并且有2.48V偏置。
  * @param  channel:通道数
  * @param  value:设定的电压值
  * @param  value_base:标幺化的基准值
  * @retval 无
  */
void TLV56XX_WriteChannel_Value_base(Uint16 channel,float value,float value_base)
{
    Uint16 c_value = 0;
    // / value_base
	  c_value = (Uint16)(((value / value_base) + 1) * 2047);
	  ccc = c_value;
	  //限幅
	  if(c_value >= 4095)
	  {
	  	c_value = 4095;
	  }
	  if(c_value <= 0)
	  {
	  	c_value = 0;
	  }
    WriteChannelValue(channel, c_value);
}

void TLV56XX_WriteChannelValue(Uint16 channel, Uint16 value)
{
    WriteChannelValue(channel, value);
}


4. 完整代码分享:

头文件配置:

#ifndef __WDG_H
#define __WDG_H

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "DSP2833x_GlobalPrototypes.h"

#define   SCLK_HIGH     GpioDataRegs.GPBSET.bit.GPIO53 = 1
#define   DATA_HIGH     GpioDataRegs.GPBSET.bit.GPIO54 = 1
#define   FS_HIGH       GpioDataRegs.GPBSET.bit.GPIO52 = 1
#define   LDAC_HIGH     GpioDataRegs.GPBSET.bit.GPIO51 = 1
#define   FRE_HIGH      GpioDataRegs.GPBSET.bit.GPIO56 = 1

#define   DOUT_HIGH      GpioDataRegs.GPBSET.bit.GPIO55 = 1
#define   DOUT_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO55 = 1

#define   SCLK_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO53 = 1
#define   DATA_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO54 = 1
#define   FS_LOW        GpioDataRegs.GPBCLEAR.bit.GPIO52 = 1
#define   LDAC_LOW      GpioDataRegs.GPBCLEAR.bit.GPIO51 = 1
#define   FRE_LOW       GpioDataRegs.GPBCLEAR.bit.GPIO56 = 1

void DAC_Tlv56xx_Init(void);
void WriteChannelValue(Uint16 channel, Uint16 value);
void TLV56XX_WriteChannelValue(Uint16 channel, Uint16 value);
void TLV56XX_WriteChannel_Value_base(Uint16 channel,float value,float value_base);
void configtestled(void);

//extern Uint16 ccc ;

#endif

c文件:

/*
************************************************************
*	文件名称:	DAC_TLV5610.c
*
*	作者:	Squidward Tentacles
*
*	版本:	V1.0
*
*	日期:	2024.7.8
*
*	说明:	TLV5610(8通道 12bit 的DAC芯片)驱动程序,用以SPI通信初始化
*			以及发送数据。
************************************************************
*/

#include "DAC_TLV5610.h"


 /**
  * @brief  GPIO初始化
  * @param  无
  * @retval 无
  */
void configtestled(void)
{
   EALLOW;
   GpioCtrlRegs.GPBMUX2.bit.GPIO51 = 0; // GPIO0复用为GPIO功能
   GpioCtrlRegs.GPBDIR.bit.GPIO51 = 1;  // GPIO0设置为输出
   GpioCtrlRegs.GPBMUX2.bit.GPIO52 = 0; // GPIO1 = GPIO1
   GpioCtrlRegs.GPBDIR.bit.GPIO52 = 1;
   GpioCtrlRegs.GPBMUX2.bit.GPIO53 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO53 = 1;
   GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO54 = 1;
   GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;
   GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0; //
   GpioCtrlRegs.GPBDIR.bit.GPIO56 = 1;
   EDIS;
}

 /**
  * @brief  TLV5610芯片初始化,上电将每个端口输出为0
  * @param  无
  * @retval 无
  */
void DAC_Tlv56xx_Init(void)
{
    int i;
    configtestled();
    //DOUT_LOW;
    DOUT_HIGH;

    LDAC_HIGH;
    FRE_HIGH;
    DELAY_US(100000);
    for(i = 0; i < 8; i++)
        TLV56XX_WriteChannelValue(i, 0);
    DELAY_US(50000);
}

/**
 * @brief  选择通道,发送数据
 * @param  channel:单通道输出选择通道地址
 *         通道A:	0		通道B:	1		通道C:	2
 *         通道D:	3		通道E:	4		通道F:	5
 *         通道G:	6		通道H:	7
 *         双通道输出:
 *         通道AandB:	12		通道CandD:	13
 *         通道EandF:	14      通道GandH:	15
 * @param  dat :0~4096数据,输入电压范围0~5v
 * @retval 无
 */
volatile  Uint16 Cmd;
void WriteChannelValue(Uint16 channel, Uint16 value)
{
  int i;
  Uint16 bit_state;
  //TLV5610     12BIT
  Cmd = (channel<<12)|((value)&0X0FFF);

  //LDAC_HIGH;
  FS_HIGH;
  FS_LOW;
  for(i = 0; i < 16; i++)
  {
    SCLK_HIGH;
    bit_state = Cmd&0X8000;
    if(bit_state)
      DATA_HIGH;
    else
      DATA_LOW;
    SCLK_LOW;
    Cmd <<= 1;
  }
    FS_HIGH;
    LDAC_LOW;
//  LDAC_LOW;

    LDAC_HIGH;
}

 /**
  * @brief  标幺化,将正弦波的幅值转换为[0,2]之间
  *         并且有2.48V偏置。
  * @param  channel:通道数
  * @param  value:设定的电压值
  * @param  value_base:标幺化的基准值
  * @retval 无
  */
void TLV56XX_WriteChannel_Value_base(Uint16 channel,float value,float value_base)
{
    Uint16 c_value = 0;
    // / value_base
	  c_value = (Uint16)(((value / value_base) + 1) * 2047);
	  //ccc = c_value;
	  //限幅
	  if(c_value >= 4095)
	  {
	  	c_value = 4095;
	  }
	  if(c_value <= 0)
	  {
	  	c_value = 0;
	  }
    WriteChannelValue(channel, c_value);
}

void TLV56XX_WriteChannelValue(Uint16 channel, Uint16 value)
{
    WriteChannelValue(channel, value);
}

时间紧迫,写的比较粗糙,大家作为参考,程序已经过验证

多通道输出函数,暂时还没写,大家尽请期待

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值