首页 > 其他分享 >TLV5610在F28335芯片上的使用教程

TLV5610在F28335芯片上的使用教程

时间:2024-07-26 14:26:13浏览次数:15  
标签:教程 void GpioCtrlRegs value F28335 bit TLV5610 GpioDataRegs define

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

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

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

标签:教程,void,GpioCtrlRegs,value,F28335,bit,TLV5610,GpioDataRegs,define
From: https://blog.csdn.net/L2244662131__/article/details/140713993

相关文章

  • 抖音私信卡片跳转微信教程
    以下是使用W外链制作抖音私信卡片跳转微信的一般教程:  ​**步骤一:准备工作**1.注册并登录W外链平台账号。2. 并获取相关的链接或二维码。**步骤二:创建跳转链接**1.在W外链平台中,选择创建新的跳转链接。2.输入您的微信公众号或小程序的链接。**步骤三:生成私信卡片**......
  • MongoDB教程(一)
    首先写一下为什么要开这一个系列:本人在使用MongoDB开发应用的时候遇见了不少问题,但国内的相关文章都比较古老,所以我想连载翻译2024年Packt出版社出版的MasteringMongoDB这本书。第一章  MongoDB简介(第一部分)MongoDB作为最受欢迎的文档数据库,是一种非关系型的NoSQL键值存储系......
  • Python 教程(三):字符串特性大全
    目录专栏列表前言1.字符串基础2.字符串方法字符串查询字符串修改字符串切片3.字符串格式化旧式格式化(`%`操作符)`str.format()`方法f-string(Python3.6+)4.字符串编码5.Unicode和ASCII6.正则表达式7.字符串比较8.字符串连接9.字符串不可变性10.字符串的内......
  • TLM求解器使用方法【CST软件零基础教程】
    TLM是三维全波电磁算法的一种,在CST中和T-solver一样都属于时域算法,互相补充。CST于2008年将TLM求解器收购。由于TLM求解器支持一些特殊的材料和结构,比如压缩模型,二维材料,而在EMC仿真中常用这些特殊材料和结构将系统简化,TLM便派上用场。当然,在天线,PCB,生物模型SAR仿真方面,TLM也......
  • 总结24个Python接单赚钱平台与详细教程,兼职月入5000+
    如果说当下什么编程语言最靠谱或者比较适合搞副业?答案肯定100%是:Python。python是所有语法中最简单易上手的语言,不需要特别的的英语词汇量,逻辑思维也不需要很差就能上手。而且学会了之后就能编写代码爬取各种数据,制作各种图表,提升工作效率。而且还能利用业余时间接点私活......
  • 基于GD32的矩阵按键usb-hid设备,详细教程,完全模拟的电脑数字键盘的所有功能,包括长按、
    本文采用的是基于GD32F350的一个4×5的矩阵键盘键盘板。矩阵键盘的电路原理图大致如下,由四个列引脚和五个行引脚来检测判断按键的按下。本文四个列引脚分别是PA15PB8PB9PC13,五个行引脚分别是PB10PB11PB12PB13PB14。typedefstruct{uint32_tGPIO_Group;......
  • jmeter下载安装完整教程
    1.jmeter下载安装前需要配置jdk环境,可参考jdk下载配置完整教程-CSDN博客安装了jdk并配置了环境可忽略,如果不确定是否已有该环境建议java-version,有java版本则无需进行配置直接第二步2.jmeter下载地址ApacheJMeter-DownloadApacheJMeter(官网地址)点击左侧的“Download......
  • jdk下载配置完整教程
    jdk下载地址:JavaDownloads|Oracle选择下载的文件后,需要登录orcle账号,才能下载,没有的话可以注册下载后点击安装,操作步骤根据提示进行完成安装后,开始配置java环境系统高级设置--环境变量配置全在系统变量进行配置点击新建--配置JAVA_HOME新建CLASSPATH,变量值填.;%J......
  • Java NIO框架Netty教程(四)- ChannelBuffer
    在字符串消息收发中提到。ChannelBuffer是Netty中非常重要的概念。所有消息的收发都依赖于这个Buffer。我们通过Netty的官方的文档来了解一下,基于流的消息传递机制。Inastream-basedtransportsuchasTCP/IP,receiveddataisstoredintoasocketreceivebuffer.Unf......
  • Java NIO框架Netty教程(六)-Java NIO Selector模式
    全文详见个人独立博客:JavaNIO框架Netty教程(六)-JavaNIOSelector模式JavaNIO框架Netty教程(六)-JavaNIOSelector模式看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实......