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口:
GPIO51 | LDAC |
GPIO52 | FS |
GPIO53 | SCLK |
GPIO54 | DATA |
GPIO55 | DOUT |
GPIO56 | FRE |
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