#include <stdio.h>
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "MCP4922.h"
#include "Delay.h"
#define SCLK_H GPIO_SetBits(MCP4922_PORT, MCP4922_SCK)
#define SCLK_L GPIO_ResetBits(MCP4922_PORT, MCP4922_SCK)
#define DOUT_H GPIO_SetBits(MCP4922_PORT, MCP4922_SDI)
#define DOUT_L GPIO_ResetBits(MCP4922_PORT, MCP4922_SDI)
void Init_MCP4922_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_MCP4922 , ENABLE);
GPIO_InitStructure.GPIO_Pin = MCP4922_SCK | MCP4922_CS|MCP4922_SDI|MCP4922_LDAC|MCP4922_SHDN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(MCP4922_PORT, &GPIO_InitStructure);
GPIO_SetBits(MCP4922_PORT, MCP4922_CS );//CS=1;
GPIO_ResetBits(MCP4922_PORT, MCP4922_SCK );//SCK=0;
GPIO_SetBits(MCP4922_PORT, MCP4922_LDAC);//CS=1;
GPIO_SetBits(MCP4922_PORT, MCP4922_SHDN);//CS=1;
}
void MCP4922_DAC(uint16_t data,char channel)//convert the 12 bit data
{
char i;
GPIO_ResetBits(MCP4922_PORT, MCP4922_CS);//CS=0;
if(channel==0)
data=data|0x3000;
else
data=data|0xB000;
for(i=0;i<=15;i++)
{
if(data&0x8000)//MSB =1 or 0;
DOUT_H;
else
DOUT_L;
SCLK_H;//read data SO
Delay(10);
data<<=1;
SCLK_L;
Delay(10);
}
GPIO_SetBits(MCP4922_PORT, MCP4922_CS);//CS=1;
SCLK_H;
Delay(10);
GPIO_ResetBits(MCP4922_PORT, MCP4922_LDAC);//CS=1;
SCLK_L;
Delay(10);
GPIO_SetBits(MCP4922_PORT, MCP4922_LDAC);//CS=1;
}