STM32连接TLC7528驱动
TLC7528C, TLC7528E和TLC75281是双路、8位数字-模拟转换器,它们设计成具有单独的片内数据锁存器,其特点包括非常紧密的DAC至DAC (DAC-to-DAC) 一致性。数据通过公共8位输入口传送至两个DAC数据锁存器的任一个。控制输入端DACA/DACB决定哪一个DAC被装载。这些器件的装载周期与随机存取存储器的写周期类似,能方便地与大多数通用微处理器总线和输出端口相接口。分段(segmenting)高阶位可以使最高有效位变化期间内的闪变为最小,该变化期间内的闪变脉冲通常是最强的。TLC7528通过数据总线、CS、WR以及DACA与DACB等控制信号与微处理器接口。当CS和WR均为低电平时,TLC7528模拟输出将对DB0-DB7数据总线输进数据做出响应。在此方式下,TLC7528的输入锁存器是透明的,从DB0-DB7数据总线输入的数据将直接影响TLC7528模拟输出。当CS或WR信号变为高电平时,DB0-DB7数据总线输入端上的数据被锁存,直至CS和WR信号再次变低为止。当CS为高电平时,不管WR的信号状态如何,DB0-DB7数据总线将为高阻状态,禁止输入数据。
当TLC7528工作电压为5V时,其数字输入与TTL电平和CMOS电平兼容。但工作电压超过5V时,其数字输入只与CMOS电平兼容。 表格是TLC7528的工作方式选择,根据引脚的电平可以选择不同的工作方式。
TLC7528的时序图如下
原理图引脚: PB5 —— DA_A/B —— DAC选择通道
PB4 —— DA_WR —— DAC读写
PB3 —— DA_CS —— DAC片选
PD2 —— DA_D0
PC12 —— DA_D1
PC11 —— DA_D2
PC10 —— DA_D3
PB9 —— DA_D4
PB8 —— DA_D5
PB7 —— DA_D6
PB6 —— DA_D7 需要的头文件自己根据需要添加
TLC7528.h//tlc7528.h
#ifndef_TLC7528_H
#define_TLC7528_H
#include "stm32f10x.h"
/*波形控制 TLC7528数据位相关宏定义*/
#define BIT0_1 GPIO_SetBits(GPIOC,GPIO_Pin_0);//PD2DA D0
#define BIT0_0 GPIO_ResetBits(GPIOC,GPIO_Pin_0);
#define BIT1_1 GPIO_SetBits(GPIOC,GPIO_Pin_1);//PC12 DA D1
#define BIT1_0 GPIO_ResetBits(GPIOC,GPIO_Pin_1);
#define BIT2_1 GPIO_SetBits(GPIOC,GPIO_Pin_2);//PC11DA D2
#define BIT2_0 GPIO_ResetBits(GPIOC,GPIO_Pin_2);
#define BIT3_1 GPIO_SetBits(GPIOC,GPIO_Pin_3);//PC10 DA D3
#define BIT3_0 GPIO_ResetBits(GPIOC,GPIO_Pin_3);
#define BIT4_1 GPIO_SetBits(GPIOB,GPIO_Pin_9);//PB9 DA D4
#define BIT4_0 GPIO_ResetBits(GPIOB,GPIO_Pin_9);
#define BIT5_1 GPIO_SetBits(GPIOB,GPIO_Pin_8);//PB8 DA D5
#define BIT5_0 GPIO_ResetBits(GPIOB,GPIO_Pin_8);
#define BIT6_1 GPIO_SetBits(GPIOB,GPIO_Pin_7);//PB7 DA D6
#define BIT6_0 GPIO_ResetBits(GPIOB,GPIO_Pin_7);
#define BIT7_1 GPIO_SetBits(GPIOB,GPIO_Pin_6);//PB6 DA D7
#define BIT7_0 GPIO_ResetBits(GPIOB,GPIO_Pin_6);
/*波形控制 TLC7528写相关宏定义*/
#define TLC7528_WRITE_ON_1 GPIO_ResetBits(GPIOB,GPIO_Pin_4);//PB4 DA_WR DAC写使能
#define TLC7528_WRITE_OFF_1 GPIO_SetBits(GPIOB,GPIO_Pin_4);//
/*波形控制 TLC7528写相关宏定义*/
#define TLC7528_CS_ON_1 GPIO_ResetBits(GPIOB,GPIO_Pin_3);//PB3 DA_CS DAC片选
#define TLC7528_CS_OFF_1 GPIO_SetBits(GPIOB,GPIO_Pin_3);
#define TLC_MUTE_OPEN() GPIO_ResetBits(GPIOA,GPIO_Pin_12);//静音模式波形输出打开
#define TLC_MUTE_CLOSE() GPIO_SetBits(GPIOA,GPIO_Pin_12);//静音模式波形输出关闭
/*波形控制 TLC7528 DACB/DACA控制 相关宏定义*/
#define PDACA_0 GPIO_ResetBits(GPIOB,GPIO_Pin_5);//PB5DA_A/B DAC通道选择
#define PDACB_1 GPIO_SetBits(GPIOB,GPIO_Pin_5);
void TLC7528_GPIO_Config(void);
void TLC7528_WriteA(u8 TL7528_data);
void TLC7528_WriteB(u8 TL7528_data);
#endif
TLC7528.c
//tlc7528.c
#include "TLC7528.h"
/****************************************************
函数名:TLC7528_GPIO_Config
形参: 无
返回值:无
函数功能:TLC7528 引脚配置
****************************************************/
void TLC7528_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|
RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//设置PB9\PB8\PB7\PB6为普通推挽输出(波形控制)TLC7528数据输入端(D4\D5\D6\D7)
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//设置PC0\PC1\PC2\PC3为普通推挽输出(强度控制)TLC7528数据输入端(D0\D1\D2\D3)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//设置PB3片选信号、PB4TLC7528写控制端 普通推挽输出(强度控制)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//设置PB5TLC7528 DACA/DACB选择端 普通推挽输出(波形控制)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
typedef union
{
u8 Wave_Ctl;
struct
{
u8 WaveBit_0 :1;
u8 WaveBit_1 :1;
u8 WaveBit_2 :1;
u8 WaveBit_3 :1;
u8 WaveBit_4 :1;
u8 WaveBit_5 :1;
u8 WaveBit_6 :1;
u8 WaveBit_7 :1;
} Bits;
} WaveCmd;
WaveCmd WaveCmd1;
/****************************************************
函数名:Wave_Get
形参:out_data(DA值)
返回值:无
函数功能:传递的数据转换为 TLC7528 DB0~DB7
****************************************************/
void Wave_Get(u8 out_data)
{
u8 Wave_Output0;
u8 Wave_Output1;
u8 Wave_Output2;
u8 Wave_Output3;
u8 Wave_Output4;
u8 Wave_Output5;
u8 Wave_Output6;
u8 Wave_Output7;
WaveCmd1.Wave_Ctl =out_data; //将波形的数值传给端口,然后信号分解
Wave_Output0 = WaveCmd1.Bits.WaveBit_0;
{
if(Wave_Output0==0)
{
BIT0_0;
}
else
{
BIT0_1;
}
Wave_Output1 = WaveCmd1.Bits.WaveBit_1;
if(Wave_Output1==0)
{
BIT1_0;
}
else
{
BIT1_1;
}
Wave_Output2 = WaveCmd1.Bits.WaveBit_2;
if(Wave_Output2==0)
{
BIT2_0;
}
else
{
BIT2_1;
}
Wave_Output3 = WaveCmd1.Bits.WaveBit_3;
if(Wave_Output3==0)
{
BIT3_0;
}
else
{
BIT3_1;
}
Wave_Output4 = WaveCmd1.Bits.WaveBit_4;
if(Wave_Output4==0)
{
BIT4_0;
}
else
{
BIT4_1;
}
Wave_Output5 = WaveCmd1.Bits.WaveBit_5;
if(Wave_Output5==0)
{
BIT5_0;
}
else
{
BIT5_1;
}
Wave_Output6 = WaveCmd1.Bits.WaveBit_6;
if(Wave_Output6==0)
{
BIT6_0;
}
else
{
BIT6_1;
}
Wave_Output7 = WaveCmd1.Bits.WaveBit_7;
if(Wave_Output7==0)
{
BIT7_0;
}
else
{
BIT7_1;
}
}
}
/*****************************************************
名称:TLC7528_WriteA
功能:向TLC7528的通道A写入数据
输入:DA输出的值
输出:
*****************************************************/
void TLC7528_WriteA(u8 TL7528_data)
{
TLC7528_CS_ON_1; //CS低电平
PDACA_0;//通道A
Wave_Get(TL7528_data);
TLC7528_WRITE_ON_1;//DA_WR DAC写使能
TLC7528_WRITE_OFF_1;//CS/WR 为高电平 D0-D7数据被锁存
// PDACB_1;
// TLC7528_CS_OFF_1; //CS为高 禁止输入数据
}
/*****************************************************
名称:TLC7528_WriteB
功能:向TLC7528的通道B写入数据
输入:DA输出的值
输出:
*****************************************************/
void TLC7528_WriteB(u8 TL7528_data)
{
TLC7528_CS_ON_1; //CS低电平
PDACB_1;//通道B
Wave_Get(TL7528_data);
TLC7528_WRITE_ON_1;
TLC7528_WRITE_OFF_1;
// PDACA_0;
// TLC7528_CS_OFF_1; //CS为高 禁止输入数据
}
兼容5v和3.3v吗?
页:
[1]