TLV5618是TI公司的12位双通达DA,串行接口,一次发送16位数据,其中高4位是编程位,低12位为数据位,详细见数据手册
/*
Target: Atmega8 with 1M internal OSC
开发环境:UE+WinAVR+AVR Studio 4
*/
#ifndef _TLV5618_H
#define _TLV5618_H
#define TLV5618_EN() PORTD &= ~(1<<PD4)
#define TLV5618_DIS() PORTD |= (1<<PD4)
#define TLV5618_DATA_H() PORTB |= (1<<PB4)
#define TLV5618_DATA_L() PORTB &= ~(1<<PB4)
#define TLV5618_DATA_IN() DDRB &= ~(1<<PB4)
#define TLV5618_DATA_OUT() DDRB |= (1<<PB4)
#define TLV5618_CLK_H() PORTB |= (1<<PB5)
#define TLV5618_CLK_L() PORTB &= ~(1<<PB5)
#define TLV5618_CLK_OUT() DDRB |= (1<<PB5)
#define TLV5618_CLK_IN() DDRB &= ~(1<<PB5)
#define TLV5618_TO_BUF 0x1 //只写到BUF
#define TLV5618_A_BUF 0x8 //写da到A,使用buffer数据更新B
#define TLV5618_B_BUF 0x0 //写da到B和buffer
void TLV5618(INT8U prog, INT16U dac);
#endif
void TLV5618(INT8U prog, INT16U dac)
{
INT16U temp = (INT16U)prog;
temp <<= 12;
temp += dac;
INT8U cnt = 0;
TLV5618_DATA_OUT();
TLV5618_CLK_OUT();
TLV5618_CLK_H();
TLV5618_EN();
for (cnt = 0; cnt < 16; cnt++){
if (temp & 0x8000){
TLV5618_DATA_H();
}
else{
TLV5618_DATA_L();
}
TLV5618_CLK_L(); //下降沿数据读入TLV5618
__asm volatile("nop");
TLV5618_CLK_H();
temp <<= 1;
}
TLV5618_CLK_H();
TLV5618_DIS();
TLV5618_DATA_IN();
TLV5618_CLK_IN();
return;
}
int main(void)
{
TLV5618( TLV5618_TO_BUF, 0x678); //写数据到Buffer
TLV5618( TLV5618_A_BUF, 0x123); //数据写到A通道,用buffer数据更新B通道
while(1);
return(0);
}