DAC8875是一款电压加电流型的4通道DAC,具有内部电压管理。驱动如下:
#include "SysConfig.h"
#include "DAC8875.h"
#include "Delay.h"
#include "driver_gpio.h"
#include "SPI.h"
/*
* SPI极性配置
* SPI_CPOL = SPI_CPOL_Low;
* SPI_CPHA = SPI_CPHA_2Edge;
*/
/*
* DAC8875 故障恢复控制结构体
*/
typedef struct
{
uint8 u8_output_valid;
uint8 u8_output_mode;
uint16 u16_output_value;
}DAC8875_Recovery_Struc;
static float st_f_refrence = 5.0F;
static DAC8875_Recovery_Struc st_recovery_data[DAC8875_MAX][4U]={0U};
/**DAC8875端口引脚定义********/
#define DAC8875_CS (0x00U)
//#define DAC8875_CLEAR (0x01U)
#define DAC8875_RESET (0x01U)
const uint16 DAC8875_Port[DAC8875_MAX][2] =
{
/****CS********RESET***/
{GPIO_Pin_12,GPIO_Pin_12},
{GPIO_Pin_10,GPIO_Pin_12},
{GPIO_Pin_11,GPIO_Pin_12}
};
//const uint16 AD7194_Port[1]=
//{GPIO_Pin_13}
static __inline void DAC8875_WriteReadByte(uint8 *p_u8_wr_data, uint8 *p_u8_rd_data)
{
if(p_u8_rd_data != NULL)
{
*p_u8_rd_data = SPI2_u8ReadWriteByte(*p_u8_rd_data);
}
else
{
SPI2_u8ReadWriteByte(*p_u8_wr_data);
}
}
/*
* DAC8875配置端口
* 参数:none
* 返回:none
* 注意:此驱动使用同步模式控制,不使用LATCH信号
*/
void DAC8875_InitPort(void)
{
// uint8 i = 0;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
//DEMO板测试用
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.e_GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_Init(GPIOE, &GPIO_InitStructure);
/****CSx3************RESET都移到GPIO初始化函数中了***/
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
// GPIO_InitStructure.e_GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.e_GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;
// GPIO_InitStructure.e_GPIO_Mode = GPIO_Mode_Out_PP;
// GPIO_InitStructure.e_GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOD, &GPIO_InitStructure);
/*****ALARM********/
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.e_GPIO_Mode = GPIO_Mode_IPD;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
DAC8875_Reset();
DAC8875_CS1_HIGH;
DAC8875_CS2_HIGH;
DAC8875_CS3_HIGH;
// DAC8875_CS4_HIGH;
AD7194_2_CS_HIGH;
//SPIxInit(E_SPI_3);
}
/*
* 向DAC8875写寄存器数据
* u8_chip_id:DAC8875芯片
* u8_reg_addr:寄存器地址 u16_wr_data:写入寄存器数据
* 返回:none
*/
static void DAC8875_Write(uint8 u8_chip_id, uint8 u8_reg_addr, uint16 u16_wr_data)
{
uint8 u8_wr_data[4] = {0U};
u8_wr_data[0] = u8_reg_addr;
u8_wr_data[1] = (u16_wr_data>>8U)&0xFFU;
u8_wr_data[2] = u16_wr_data&0xFFU;
switch (u8_chip_id)
{
case DAC8875_1:
{
DAC8875_CS1_LOW;
break;
}
case DAC8875_2:
{
DAC8875_CS2_LOW;
break;
}
case DAC8875_3:
{
DAC8875_CS3_LOW;
break;
}
// case DAC8875_4:
// {
// DAC8875_CS4_LOW;
// break;
// }
default:
{
break;
}
}
// delay_ms(2);
DAC8875_WriteReadByte(&u8_wr_data[0], NULL);
DAC8875_WriteReadByte(&u8_wr_data[1], NULL);
DAC8875_WriteReadByte(&u8_wr_data[2], NULL);
switch (u8_chip_id)
{
case DAC8875_1:
{
DAC8875_CS1_HIGH;
break;
}
case DAC8875_2:
{
DAC8875_CS2_HIGH;
break;
}
case DAC8875_3:
{
DAC8875_CS3_HIGH;
break;
}
// case DAC8875_4:
// {
// DAC8875_CS4_HIGH;
// break;
// }
default:
{
break;
}
}
// delay_us(1);
}
/*
* 从DAC8875寄存器读数据
* u8_chip_id:DAC8875芯片
* u8_reg_addr:寄存器地址
* 返回:寄存器值
*/
uint16 DAC8875_ReadReg(uint8 u8_chip_id, uint8 u8_reg_addr)
{
uint8 u8_wr_data = 0x00, u8_rd_data[4]={0xFFU,0xFFU,0xFFU,0xFFU};
u8_wr_data = u8_reg_addr | 0x80U;
switch (u8_chip_id)
{
case DAC8875_1:
{
DAC8875_CS1_LOW;
break;
}
case DAC8875_2:
{
DAC8875_CS2_LOW;
break;
}
case DAC8875_3:
{
DAC8875_CS3_LOW;
break;
}
// case DAC8875_4:
// {
// DAC8875_CS4_LOW;
// break;
// }
default:
{
break;
}
}
// delay_ms(2);
// u8_wr_data = u8_wr_data>>1;
DAC8875_WriteReadByte(&u8_wr_data, NULL);
u8_wr_data = NO_OPERATION_REG;//读命令后16位无关紧要
DAC8875_WriteReadByte(&u8_wr_data, NULL);
DAC8875_WriteReadByte(&u8_wr_data, NULL);
switch (u8_chip_id)
{
case DAC8875_1:
{
DAC8875_CS1_HIGH;
break;
}
case DAC8875_2:
{
DAC8875_CS2_HIGH;
break;
}
case DAC8875_3:
{
DAC8875_CS3_HIGH;
break;
}
// case DAC8875_4:
// {
// DAC8875_CS4_HIGH;
// break;
// }
default:
{
break;
}
}
// delay_ms(2);
u8_wr_data = NO_OPERATION_REG;
switch (u8_chip_id)
{
case DAC8875_1:
{
DAC8875_CS1_LOW;
break;
}
case DAC8875_2:
{
DAC8875_CS2_LOW;
break;
}
case DAC8875_3:
{
DAC8875_CS3_LOW;
break;
}
// case DAC8875_4:
// {
// DAC8875_CS4_LOW;
// break;
// }
default:
{
break;
}
}
// delay_ms(2);
DAC8875_WriteReadByte(&u8_wr_data, &u8_rd_data[0]);
DAC8875_WriteReadByte(&u8_wr_data, &u8_rd_data[1]);
DAC8875_WriteReadByte(&u8_wr_data, &u8_rd_data[2]);
switch (u8_chip_id)
{
case DAC8875_1:
{
DAC8875_CS1_HIGH;
break;
}
case DAC8875_2:
{
DAC8875_CS2_HIGH;
break;
}
case DAC8875_3:
{
DAC8875_CS3_HIGH;
break;
}
// case DAC8875_4:
// {
// DAC8875_CS4_HIGH;
// break;
// }
default:
{
break;
}
}
return (u8_rd_data[1]<<8U)|(u8_rd_data[2]);
}
/*
* 向DAC8875写寄存器
* u8_chip_id:DAC8875芯片
* u8_reg_addr:寄存器地址 u16_wr_data:写入寄存器数据
* u8_check:回读校验
* 返回0:写寄存器成功
* 返回-1:写寄存器失败
*/
sint8 DAC8875_WriteReg(uint8 u8_chip_id, uint8 u8_reg_addr, uint16 u16_wr_data, uint8 u8_check)
{
uint16 u16_rd_data = 0x00;
DAC8875_Write(u8_chip_id, u8_reg_addr, u16_wr_data);
// delay_us(100);
if(0x00 != u8_check)
{
u16_rd_data = DAC8875_ReadReg(u8_chip_id, u8_reg_addr) ;
if(u16_wr_data != (u16_rd_data & u16_wr_data))
{
return -1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
/*
* 检测DAC8875能否检测到
* u8_chip_id:DAC8875芯片
* 返回0:检测DAC8875 成功
* 返回-1:检测DAC8875失败
*/
sint8 DAC8875_Detect(uint8 u8_chip_id)
{
uint16 u16_data = 0x0000U;
u16_data = DAC8875_ReadReg(u8_chip_id, RESET_CONFIG_REG);
u16_data ^= USER_BIT; //toggle USER_BIT
if(0x00 == DAC8875_WriteReg(u8_chip_id, RESET_CONFIG_REG, u16_data, 0x01))
{
if(((DAC8875_ReadReg(u8_chip_id, STATUS_REG) >> 0x06U) & USER_BIT) == (u16_data & USER_BIT))
{
return 0;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
/*
* DAC8875初始化
* u8_chip_id:DAC8875芯片
* 返回0:初始化成功
* 返回-1:初始化失败
*/
sint8 DAC8875_Init(uint8 u8_chip_id)
{
/* 设置成内部基准 5V */
if(0x00 == DAC8875_WriteReg(u8_chip_id, RESET_CONFIG_REG, INTERNAL_REFRENCE_ENABLE, 0x01U))
{
st_f_refrence = 5.0F;
return 0;
}
else
{
return -1;
}
}
/*
* 通过RESET引脚复位DAC8875,复位后按照初始化的配置重新配置
* 返回值:复位DAC8875结果
*/
sint8 DAC8875_Reset(void)
{
DAC8875_RESET_HIGH;
DAC8875_RESET_LOW;
delay_us(20000);
DAC8875_RESET_HIGH;
return 0;
}
/*
* 根据用户配置的模式转换用户数据为寄存器数据
* f_user: 用户数据
* u8_output_mode:配置模式
* f_refrence: 参考电压
* 返回值:转换完成的寄存器数据
*/
static uint16 DAC8875_ConvertValue(float f_user, uint8 u8_output_mode, float f_refrence)
{
#define MAX_CODE (65535.0F)
#define BIPOLAR_VOL_OFFSET (0.5F)
float f_temp = 0.0f, f_gain = 1.0f;
uint16 u16_output = 0x0000U;
switch(u8_output_mode)
{
case DAC8875_CUR_P00_P240:
{
#define CUR_P00_P240_RANGE (24.0F)
f_temp = f_user / CUR_P00_P240_RANGE ;
break;
}
case DAC8875_CUR_P00_P200:
{
#define CUR_P00_P100_RANGE (20.0F)
f_temp = f_user / CUR_P00_P100_RANGE;
break;
}
case DAC8875_CUR_P40_P200:
{
#define CUR_P40_P240_RANGE (16.0F)
#define CUR_P40_P240_OFFSET (4.0F)
f_temp = (f_user - CUR_P40_P240_OFFSET) / CUR_P40_P240_RANGE;
break;
}
case DAC8875_CUR_P35_P235:
{
#define CUR_P35_P235_RANGE (20.0F)
#define CUR_P35_P235_OFFSET (3.5F)
f_temp = (f_user - CUR_P35_P235_OFFSET) / CUR_P35_P235_RANGE;
break;
}
// case DAC8875_CUR_N240_P240:
// {
// #define CUR_N240_P240_RANGE (48.0F)
// #define CUR_N240_P240_OFFSET (24.0F)
// f_temp = (f_user + CUR_N240_P240_OFFSET) / CUR_N240_P240_RANGE;
// break;
// }
case DAC8875_VOL_P0V_P5V:
{
f_gain = 1.0f;
f_temp = f_user / f_refrence / f_gain;
break;
}
case DAC8875_VOL_P0V_P6V:
{
f_gain = 1.2f;
f_temp = f_user / f_refrence / f_gain;
break;
}
case DAC8875_VOL_P0V_P10V:
{
f_gain = 2.0f;
f_temp = f_user / f_refrence / f_gain;
break;
}
case DAC8875_VOL_P0V_P12V:
{
f_gain = 2.4f;
f_temp = f_user / f_refrence / f_gain;
break;
}
// case DAC8875_VOL_N5V_P5V:
// {
// f_gain = 2.0f;
// f_temp = (f_user + BIPOLAR_VOL_OFFSET) / f_refrence / f_gain;
// break;
// }
// case DAC8875_VOL_N10V_P10V:
// {
// f_gain = 4.0f;
// f_temp = (f_user + BIPOLAR_VOL_OFFSET) / f_refrence / f_gain;
// break;
// }
// case DAC8875_VOL_N6V_P6V:
// {
// f_gain = 2.4f;
// f_temp = (f_user + BIPOLAR_VOL_OFFSET) / f_refrence / f_gain ;
// break;
// }
// case DAC8875_VOL_N12V_P12V:
// {
// f_gain = 4.8f;
// f_temp = (f_user + BIPOLAR_VOL_OFFSET) / f_refrence / f_gain;
// break;
// }
default:
{
/* do nothing */
}
}
if(f_temp <= 0.0f)
{
u16_output = 0x0000U;
}
else if(f_temp >= 1.0f)
{
u16_output = 0xFFFFU;
}
else
{
u16_output = (uint16)(f_temp * MAX_CODE);
}
return u16_output;
}
/*
* DAC8875输出电压
* u8_chip_id:DAC8875芯片 u8_channel:通道,使用"channel define"
* u8_output_mode:输出模式,使用"output mode define"
* f_user:用户数据
* 返回0:输出成功
* 返回-1:输出失败
*/
sint8 DAC8875_Output(uint8 u8_chip_id, uint8 u8_channel, uint8 u8_output_mode, float f_user)
{
uint16 u16_data = 0x0000U;
if(u8_channel > 0x04U)
{
/* 通道参数错误 */
return -1;
}
else
{
/* do nothing */
}
/* set auto mode */
if((0x00 == DAC8875_WriteReg(u8_chip_id, SELECT_BUCK_BOOST_REG,BUCK_BOOST_CONVERT(u8_channel),0x01U))
&&(0x00 == DAC8875_WriteReg(u8_chip_id, CONFIG_BUCK_BOOST_REG,CCLP(1U) | PNSEL(3U),0x01U)))
{
if(0x00 == DAC8875_WriteReg(u8_chip_id, SELECT_DAC_REG,CHANNEL(u8_channel) | DISABLE_SDO,0x01U))
{
u16_data = OUTPUT_ENABLE | RANGE(u8_output_mode);
DAC8875_WriteReg(u8_chip_id, CONFIG_DAC_REG, u16_data, 0x01U);
if(0x00 == DAC8875_WriteReg(u8_chip_id, DAC_DATA_REG,DAC8875_ConvertValue(f_user,u8_output_mode,st_f_refrence),0x01U))
{
if(u16_data == ((DAC8875_ReadReg(u8_chip_id, CONFIG_DAC_REG))&u16_data))
{
return 0;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
else
{
return -1;
}
}
else
{
return -1;
}
}
/*
* DAC8875故障恢复
* u8_chip_id:DAC8875芯片
* f_user:用户数据
* 返回0:故障恢复成功
* 返回-1:故障恢复失败
*/
sint8 DAC8875_Recovery(uint8 u8_chip_id)
{
uint8 i = 0;
DAC8875_Reset();
for(i=DAC8875_CHANNEL_A;i<=DAC8875_CHANNEL_D;i++)
{
if(0x01 == st_recovery_data[u8_chip_id][i].u8_output_valid)
{
if(0x00 != DAC8875_Output(u8_chip_id, i, DAC8875_CUR_P00_P240, 8.0F))
{
if(0x00 != DAC8875_Output(u8_chip_id, i, DAC8875_CUR_P00_P240, 8.0F))
{
return -1;
}
else
{
/* do nothing */
}
}
else
{
/* do nothing */
}
}
else
{
/* do nothing */
}
}
return 0;
}
/***** 使用例程 ***********/
//#define DAC8875_TEST_VOL
//#define DAC8875_TEST_CUR
//int main(void)
//{
// uint16 u16_data=0,i=0;
// uint16 u16_array[10];
// sint8 s8_init_ret = -1;
//
// DAC8875_InitPort();
//
// if(0x00U == DAC8875_Detect())
// {
// if(0x00U == DAC8875_Init())
// {
// s8_init_ret = 0x00;
// }
// else
// {
// /* do nothing */
// }
// }
// else
// {
// /* do nothing */
// }
//
// if(0x00 != s8_init_ret)
// {
// Led_On(E_LED_1);
// Led_On(E_LED_2);
// while(1);
// }
//
// if(0x00 != DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P00_P200,8.0F))
// {
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P00_P200,8.0F);
// }
// else
// {
// /* do nothing */
// }
// while(1)
// {
// u16_array[0] = DAC8875_Read(STATUS_REG);
// u16_array[1] = DAC8875_Read(STATUS_MASK_REG);
// u16_array[2] = DAC8875_Read(ALARM_ACTION_REG);
// u16_array[3] = DAC8875_Read(USER_ALARM_CODE_REG);
// DelayMs(100);
// u16_array[5] += 10;
// if((u16_array[0]&0x0100) == 0x0000) //用于判断B通道是否彻底故障
// {
// DAC8875_Reset();
// if(0x00 != DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P00_P200,8.0F))
// {
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P00_P200,8.0F);
// }
// else
// {
// /* do nothing */
// }
// }
//#ifdef DAC8875_TEST_VOL
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_VOL_P0V_P5V,1.25F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_VOL_P0V_P5V,2.5F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_VOL_P0V_P5V,3.75F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_VOL_P0V_P5V,5.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_VOL_P0V_P10V,2.5F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_VOL_P0V_P10V,5.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_VOL_P0V_P10V,7.5F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_VOL_P0V_P10V,10.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_VOL_P0V_P6V,1.5F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_VOL_P0V_P6V,3.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_VOL_P0V_P6V,4.5F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_VOL_P0V_P6V,6.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_VOL_P0V_P12V,3.0F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_VOL_P0V_P12V,6.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_VOL_P0V_P12V,9.0F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_VOL_P0V_P12V,12.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//#endif
//#ifdef DAC8875_TEST_CUR
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_CUR_P35_P235,2.0F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P35_P235,8.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_CUR_P35_P235,10.0F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_CUR_P35_P235,23.5F);
// u16_data = DAC8875_Read(STATUS_REG);
//
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_CUR_P00_P200,4.0F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P00_P200,8.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_CUR_P00_P200,12.0F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_CUR_P00_P200,20.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_CUR_P00_P240,1.0F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P00_P240,8.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_CUR_P00_P240,12.0F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_CUR_P00_P240,24.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//
// Led_Toogle(E_LED_1);
// DelayMs(1000);
// DAC8875_Output(DAC8875_CHANNEL_A,DAC8875_CUR_P40_P200,2.0F);
// DAC8875_Output(DAC8875_CHANNEL_B,DAC8875_CUR_P40_P200,5.0F);
// DAC8875_Output(DAC8875_CHANNEL_C,DAC8875_CUR_P40_P200,18.0F);
// DAC8875_Output(DAC8875_CHANNEL_D,DAC8875_CUR_P40_P200,24.0F);
// u16_data = DAC8875_Read(STATUS_REG);
//#endif
// }
//
// return 0;
//}
头文件:
#ifndef __DAC8875_H__
#define __DAC8875_H__
#include "SysConfig.h"
#include "BSP.h"
/* 寄存器地址定义 */
#define NO_OPERATION_REG ((uint8)0x00U)
#define RESET_REG ((uint8)0x01U)
#define RESET_CONFIG_REG ((uint8)0x02U)
#define SELECT_DAC_REG ((uint8)0x03U)
#define CONFIG_DAC_REG ((uint8)0x04U)
#define DAC_DATA_REG ((uint8)0x05U)
#define SELECT_BUCK_BOOST_REG ((uint8)0x06U)
#define CONFIG_BUCK_BOOST_REG ((uint8)0x07U)
#define CHANNEL_CALIBRATION_ENABLE_REG ((uint8)0x08U)
#define CHANNEL_GAIN_CALIBRATION_REG ((uint8)0x09U)
#define CHANNEL_OFFSET_CALIBRATION_REG ((uint8)0x0AU)
#define STATUS_REG ((uint8)0x0BU)
#define STATUS_MASK_REG ((uint8)0x0CU)
#define ALARM_ACTION_REG ((uint8)0x0DU)
#define USER_ALARM_CODE_REG ((uint8)0x0EU)
#define RESERVED_REG1 ((uint8)0x0FU)
#define WRITE_WDG_TIMER_REG ((uint8)0x10U)
#define DEVICE_ID_REG ((uint8)0x11U)
#define RESERVED_REG2 ((uint8)0x12U)
/*The register in 0X12-0xFF is reserved*/
/* RESET_REG */
#define RESET_ON ((uint16)0x0001U)
/* RESET_CONFIG_REG */
#define CLERE(x) ((uint16)(0x01U<<(9U+((x)&0x03U))))
#define INTERNAL_REFRENCE_ENABLE ((uint16)(0x01U<<4U))
#define TRANSPARENT_MODE ((uint16)(0x01U<<3U))
#define CLEAR_ALL_DAC ((uint16)(0x01U<<2U))
#define POWER_OFF_CONDITION ((uint16)(0x01U<<1U))
#define USER_BIT ((uint16)(0x01U<<0U))
/*SELECT_DAC_REG*/
#define CLSLD ((uint16)(0x01U<<12U))
#define CLSLC ((uint16)(0x01U<<11U))
#define CLSLB ((uint16)(0x01U<<10U))
#define CLSLA ((uint16)(0x01U<<9U))
#define CHANNEL(x) ((uint16)(0x01U<<(5U+((x)&0x03U))))
#define DISABLE_SDO ((uint16)(0x01U<<4U))
#define ENABLE_CRC ((uint16)(0x01U<<3U))
#define WPD(x) ((uint16)(((x)&0x03U)<<1U))
#define WDG_ENABLE ((uint16)(0x01U<<0U))
/* CONFIG_DAC_REG */
#define SCLIM(x) ((uint16)(((x)&0x03U)<<14U))
#define HART_ENABLE ((uint16)((0x01U<<13U)))
#define OUTPUT_ENABLE ((uint16)((0x01U<<12U)))
#define SRCLK_RATE(x) ((uint16)(((x)&0x0FU)<<8U))
#define SR_STEP(x) ((uint16)(((x)&0x07U)<<5U))
#define SR_ENABLE ((uint16)(0x01U<<4U))
#define RANGE(x) ((uint16)((x)&0x0FU))
/* DAC_DATA_REG */
/* SELECT_BUCK_BOOST_REG */
#define BUCK_BOOST_CONVERT(x) ((uint16)(0x01U<<((x)&0x03U)))
/* CONFIG_BUCK_BOOST_REG */
#define CCLP(x) ((uint16)(((x)&0x03U)<<10U))
#define PCLMP(x) ((uint16)(((x)&0x0FU)<<6U))
#define NCLMP(x) ((uint16)(((x)&0x0FU)<<2U))
#define PNSEL(x) ((uint16)(((x)&0x03U)<<0U))
/* CHANNEL_CALIBRATION_ENABLE_REG */
#define CLEN ((uint16U)0x01U)
/* CHANNEL_CALIBRATION_ENABLE_REG */
/* CHANNEL_OFFSET_CALIBRATION_REG */
/* STATUS_REG */
#define CLST ((uint16)(0x01U<<12U))
#define WDT ((uint16)(0x01U<<11U))
#define PGF ((uint16)(0x01U<<10U))
#define PGC ((uint16)(0x01U<<9U))
#define PGB ((uint16)(0x01U<<8U))
#define PGA ((uint16)(0x01U<<7U))
#define UTGL ((uint16)(0x01U<<6U))
#define CRE ((uint16)(0x01U<<5U))
#define TMP ((uint16)(0x01U<<4U))
#define FD ((uint16)(0x01U<<3U))
#define FC ((uint16)(0x01U<<2U))
#define FB ((uint16)(0x01U<<1U))
#define FA ((uint16)(0x01U<<0U))
/* STATUS_MASK_REG */
#define MWT ((uint16)(0x01U<<11U))
#define MCRE ((uint16)(0x01U<<5U))
#define MTMP ((uint16)(0x01U<<4U))
#define MFD ((uint16)(0x01U<<3U))
#define MFC ((uint16)(0x01U<<2U))
#define MFB ((uint16)(0x01U<<1U))
#define MFA ((uint16)(0x01U<<0U))
/* ALARM_ACTION_REG */
#define AC_CRE_WDT(x) ((uint16)(((x)&0x03U)<<6U))
#define AC_IOC(x) ((uint16)(((x)&0x03U)<<4U))
#define AC_VSC(x) ((uint16)(((x)&0x03U)<<2U))
#define AC_TMP(x) ((uint16)(((x)&0x03U)<<0U))
/* USER_ALARM_CODE_REG */
/* WRITE_WDG_TIMER_REG */
#define RWD ((uint16)0x01U)
/* costom define*/
/* channel define */
#define DAC8875_CHANNEL_A ((uint8)0x00U)
#define DAC8875_CHANNEL_B ((uint8)0x01U)
#define DAC8875_CHANNEL_C ((uint8)0x02U)
#define DAC8875_CHANNEL_D ((uint8)0x03U)
#define DAC8875_CHANNEL_MAX ((uint8)0x04U)
/* output mode define */
/*
0000 - Voltage output 0 to +5 V (default)
0001 - Voltage output 0 to +10 V
0010 - Voltage output ±5 V
0011 - Voltage output ±10 V
0100 - Current output 3.5 mA to 23.5 mA
0101 - Current output 0 to 20 mA
0110 - Current output 0 to 24 mA
0111 - Current output ±24 mA
1000 - Voltage output 0 to +6 V
1001 - Voltage output 0 to +12 V
1010 - Voltage output ±6 V
1011 - Voltage output ±12 V
11xx - Current output 4 mA to 20 mA*/
#define DAC8875_VOL_P0V_P5V ((uint8)0x00U)
#define DAC8875_VOL_P0V_P10V ((uint8)0x01U)
#define DAC8875_VOL_N5V_P5V ((uint8)0x02U)
#define DAC8875_VOL_N10V_P10V ((uint8)0x03U)
#define DAC8875_CUR_P35_P235 ((uint8)0x04U)
#define DAC8875_CUR_P00_P200 ((uint8)0x05U)
#define DAC8875_CUR_P00_P240 ((uint8)0x06U)
#define DAC8875_CUR_N240_P240 ((uint8)0x07U)
#define DAC8875_VOL_P0V_P6V ((uint8)0x08U)
#define DAC8875_VOL_P0V_P12V ((uint8)0x09U)
#define DAC8875_VOL_N6V_P6V ((uint8)0x0AU)
#define DAC8875_VOL_N12V_P12V ((uint8)0x0BU)
#define DAC8875_CUR_P40_P200 ((uint8)0x0CU)
/********** 端口操作 *********/
#define DAC8875_MAX (0x03U)
#define DAC8875_1 (0x01U)
#define DAC8875_2 (0x02U)
#define DAC8875_3 (0x03U)
//#define DAC8875_4 (0x04U)
#define DAC8875_CS1_HIGH GPIOB->BSRR = GPIO_Pin_12;
#define DAC8875_CS1_LOW GPIOB->BRR = GPIO_Pin_12;
#define DAC8875_CS2_HIGH GPIOD->BSRR = GPIO_Pin_10;
#define DAC8875_CS2_LOW GPIOD->BRR = GPIO_Pin_10;
#define DAC8875_CS3_HIGH GPIOD->BSRR = GPIO_Pin_11;
#define DAC8875_CS3_LOW GPIOD->BRR = GPIO_Pin_11;
//#define DAC8875_CS4_HIGH GPIOE->BSRR = GPIO_Pin_2;
//#define DAC8875_CS4_LOW GPIOE->BRR = GPIO_Pin_2;
//#define DAC8875_CLEAR_HIGH(x) GPIOC->BRR = DAC8875_Port[(x)][DAC8875_CLEAR];
//#define DAC8875_CLEAR_LOW(x) GPIOC->BSRR = DAC8875_Port[(x)][DAC8875_CLEAR];
#define DAC8875_RESET_HIGH GPIOD->BSRR = GPIO_Pin_12;
#define DAC8875_RESET_LOW GPIOD->BRR = GPIO_Pin_12;
#define AD7194_2_CS_HIGH GPIOD->BSRR = GPIO_Pin_13;
#define AD7194_2_CS_LOW GPIOD->BRR = GPIO_Pin_13;
/********** 对外接口 *********/
void DAC8875_InitPort(void);
uint16 DAC8875_ReadReg(uint8 u8_chip_id, uint8 u8_reg_addr);
sint8 DAC8875_WriteReg(uint8 u8_chip_id, uint8 u8_reg_addr, uint16 u16_wr_data, uint8 u8_check);
sint8 DAC8875_Reset(void);
sint8 DAC8875_Detect(uint8 u8_chip_id);
sint8 DAC8875_Init(uint8 u8_chip_id);
sint8 DAC8875_Output(uint8 u8_chip_id, uint8 u8_channel, uint8 u8_output_mode, float f_user);
sint8 DAC8875_Recovery(uint8 u8_chip_id);
#endif