📄 tlc5620.c
字号:
/**************************************************************
*
*
*
*
**************************************************************/
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
#include "TLC5620.h"
#define PIO_DAC_BASE PIO_AMP_BASE
/**************************************************************
* 注意:由于在FPGA和TLC5620之间接了一片反相器,所以对芯片引脚的设置都将相
* 反。
* 例如:TLC5620_SET_CLK()函数,实际上FPGA输出低电平。
* ***********************************************************/
static alt_u8 pio=0x00;
/*********************************
* 说明:设置芯片的clk脚高电平
********************************/
void TLC5620_SET_CLK(void)
{
pio = pio | 0x01;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/*********************************
* 说明:设置芯片的clk脚低电平
*********************************/
void TLC5620_CLR_CLK( void )
{
pio = pio & 0xFE;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/***********************************
* 说明:设置芯片data脚高电平
***********************************/
void TLC5620_SET_DATA( void )
{
pio = pio | 0x04;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/*************************************
* 说明:设置芯片的data脚低电平
************************************/
void TLC5620_CLR_DATA( void )
{
pio = pio & 0xFB;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/**************************************
* 说明:设置芯片load脚高电平
* ***********************************/
void TLC5620_SET_LOAD( void )
{
pio = pio | 0x02;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/***************************************
* 说明:设置芯片load脚低电平
* ************************************/
void TLC5620_CLR_LOAD( void )
{
pio = pio & 0xFD;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/***************************************
*说明:设置芯片ldac脚高电平
* **************************************/
void TLC5620_SET_LDAC( void )
{
pio = pio | 0x08;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
/****************************************
* 说明:设置芯片ldac脚低电平
* *************************************/
void TLC5620_CLR_LDAC( void )
{
pio = pio & 0xF7;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_DAC_BASE, pio);
}
void TLC5620_delay(alt_u16 time)
{
alt_u16 i;
for(i=0; i<time; i++);
}
/***************************************
* 说明:TLC5620初始化
* *************************************/
void TLC5620_init(void)
{
TLC5620_CLR_CLK();
TLC5620_SET_DATA();
TLC5620_SET_LOAD();
TLC5620_SET_LDAC();
}
/******************************************
*说明: 输出单个通道的电压
*chl: 通道号, 0--3
*dat: 通道数据, 0--255
* ****************************************/
void TLC5620_set_output(alt_u8 chl, alt_u8 dat)
{
alt_u8 i;
/* 四个通道,只有低两位有效 */
chl &= 0x03;
/* 左移一位,加上RNG位 */
chl <<= 1;
chl |= (RNG==1);
/* 将数据移到高3位 */
chl <<= 5;
for(i=3; i>0; i--)
{
TLC5620_delay(100);
/* 从高位到低位依次移出数据 */
if(chl&0x80)
{
TLC5620_SET_DATA();
}
else
{
TLC5620_CLR_DATA();
}
/* 等待数据稳定 */
TLC5620_SET_CLK();
chl <<= 1;
TLC5620_delay(100);
/* 下降沿将数据锁存 */
TLC5620_CLR_CLK();
TLC5620_delay(100);
}
for(i=8; i>0; i--)
{
TLC5620_delay(10);
/* 从高位到低位依次移出数据 */
if(dat&0x80)
{
TLC5620_SET_DATA();
}
else
{
TLC5620_CLR_DATA();
}
/* 等待数据稳定 */
TLC5620_SET_CLK();
dat <<= 1;
TLC5620_delay(100);
/* 下降沿将数据锁存 */
TLC5620_CLR_CLK();
TLC5620_delay(100);
}
/* LOAD下降沿将数据锁入寄存器 */
TLC5620_CLR_LOAD();
TLC5620_delay(100);
TLC5620_SET_LOAD();
/* LDAC下降沿将更新输出电压值 */
TLC5620_CLR_LDAC();
TLC5620_delay(100);
TLC5620_SET_LDAC();
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -