STM32之DAC8875驱动

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值