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;
//		}				
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值