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;
// }