#include "DAC8812.h"
void DAC8812_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//PD口时钟使能
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//PD0、PD1、PD2、PD3、PD4、PD5口模式设置
GPIO_InitStruct.GPIO_Pin=(GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStruct);
GPIO_SetBits(GPIOD,GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);//将PD1(RS)、PD2(CS)、PB3(MSB)、PB4(LDAC)初始化为高电平
GPIO_ResetBits(GPIOD,GPIO_Pin_0 | GPIO_Pin_5);//将PD0(SDI)、PD3(MSB)、PD5(CLK)初始化为低电平
}
void DAC8812_Reset(u8 model)
{
if(model==0)
MSB_DOWN;
if(model==1)
MSB_UP;
RS_DOWN;
delay_us(10);
RS_UP;
delay_us(1);
}
void DAC8812_SendData(u8 addr,float voltage)
{
u8 i=0;
u16 dat=0;
CS_UP;
LDAC_UP;
CLK_DOWN;
SDI_DOWN;
dat=(u16)((voltage+10)*32768/10);//数据换算
delay_us(10);
switch (addr)
{
case None:
{
CS_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
for(i=0;i<16;i++)
{
if((( dat>>(15-i))&0x01)==1)
SDI_UP;
else
if((( dat>>(15-i))&0x01)==0)
SDI_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
}
CS_UP;
delay_us(1);
LDAC_DOWN;
delay_us(1);
LDAC_UP;
delay_us(1);
break;
}
case DAC_A:
{
CS_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
SDI_UP;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
for(i=0;i<16;i++)
{
if((( dat>>(15-i))&0x01)==1)
SDI_UP;
else
if((( dat>>(15-i))&0x01)==0)
SDI_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
}
CS_UP;
delay_us(1);
LDAC_DOWN;
delay_us(1);
LDAC_UP;
delay_us(1);
break;
}
case DAC_B:
{
CS_DOWN;
delay_us(1);
SDI_UP;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
SDI_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
for(i=0;i<16;i++)
{
if((( dat>>(15-i))&0x01)==1)
SDI_UP;
else
if((( dat>>(15-i))&0x01)==0)
SDI_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
}
CS_UP;
delay_us(1);
LDAC_DOWN;
delay_us(1);
LDAC_UP;
delay_us(1);
break;
}
case DAC_All:
{
CS_DOWN;
delay_us(1);
SDI_UP;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
for(i=0;i<16;i++)
{
if((( dat>>(15-i))&0x01)==1)
SDI_UP;
else
if((( dat>>(15-i))&0x01)==0)
SDI_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
}
CS_UP;
delay_us(1);
LDAC_DOWN;
delay_us(1);
LDAC_UP;
delay_us(1);
break;
}
default :
{
CS_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
for(i=0;i<16;i++)
{
if((( dat>>(15-i))&0x01)==1)
SDI_UP;
else
if((( dat>>(15-i))&0x01)==0)
SDI_DOWN;
delay_us(1);
CLK_UP;
delay_us(1);
CLK_DOWN;
delay_us(1);
}
CS_UP;
delay_us(1);
LDAC_DOWN;
delay_us(1);
LDAC_UP;
delay_us(1);
}
}
}