DAC7311驱动程序
使用两个DAC7311芯片,模拟SPI控制
首先是.h文件,可根据需要修改对应IO口
#ifndef __DAC7311_H__
#define __DAC7311_H__
#include "main.h"
//#include "sys.h"
#include "stm32f4xx.h"
#define AO1_DIN_H() HAL_GPIO_WritePin(AO1_SPI5_MOSI_GPIO_Port, AO1_SPI5_MOSI_Pin, GPIO_PIN_SET)
#define AO1_DIN_L() HAL_GPIO_WritePin(AO1_SPI5_MOSI_GPIO_Port, AO1_SPI5_MOSI_Pin, GPIO_PIN_RESET)
#define AO1_SCLK_H() HAL_GPIO_WritePin(AO1_SPI5_SCK_GPIO_Port, AO1_SPI5_SCK_Pin, GPIO_PIN_SET)
#define AO1_SCLK_L() HAL_GPIO_WritePin(AO1_SPI5_SCK_GPIO_Port, AO1_SPI5_SCK_Pin, GPIO_PIN_RESET)
#define AO1_SYNC_H() HAL_GPIO_WritePin(AO1_SPI5_NSS_GPIO_Port, AO1_SPI5_NSS_Pin, GPIO_PIN_SET)
#define AO1_SYNC_L() HAL_GPIO_WritePin(AO1_SPI5_NSS_GPIO_Port, AO1_SPI5_NSS_Pin, GPIO_PIN_RESET)
#define AO2_DIN_H() HAL_GPIO_WritePin(AO2_SPI6_MOSI_GPIO_Port, AO2_SPI6_MOSI_Pin, GPIO_PIN_SET)
#define AO2_DIN_L() HAL_GPIO_WritePin(AO2_SPI6_MOSI_GPIO_Port, AO2_SPI6_MOSI_Pin, GPIO_PIN_RESET)
#define AO2_SCLK_H() HAL_GPIO_WritePin(AO2_SPI6_SCK_GPIO_Port, AO2_SPI6_SCK_Pin, GPIO_PIN_SET)
#define AO2_SCLK_L() HAL_GPIO_WritePin(AO2_SPI6_SCK_GPIO_Port, AO2_SPI6_SCK_Pin, GPIO_PIN_RESET)
#define AO2_SYNC_H() HAL_GPIO_WritePin(AO2_SPI6_NSS_GPIO_Port, AO2_SPI6_NSS_Pin, GPIO_PIN_SET)
#define AO2_SYNC_L() HAL_GPIO_WritePin(AO2_SPI6_NSS_GPIO_Port, AO2_SPI6_NSS_Pin, GPIO_PIN_RESET)
void delay(uint8_t us);
void DAC7311_Init(void);
void AO1_Write(uint16_t Data);
void AO2_Write(uint16_t Data);
#endif
一般默认为Normal模式
#include "dac7311.h"
void delay(uint8_t us)
{
for(; us !=0; us--);
}
void DAC7311_Init(void)
{
AO1_SYNC_H();
AO1_SCLK_L();
AO2_SYNC_H();
AO2_SCLK_L();
}
void AO1_Write(uint16_t Data)
{
uint16_t temp;
uint8_t ui;
temp=Data << 2;//7311需要移两位
temp &= 0x3FFF;//选择模式为Normal
AO1_SYNC_H();
AO1_SCLK_H();
delay(10);
AO1_SYNC_L();//使能输入移位寄存器
delay(10);
for(ui=0; ui<16; ui++)
{
AO1_SCLK_H();
if(0x8000 == (temp & 0x8000))
{
AO1_DIN_H();
}
else
{
AO1_DIN_L();
}
delay(10);
AO1_SCLK_L();
delay(10);
temp <<=1;
}
AO1_SYNC_H();
}
void AO2_Write(uint16_t Data)
{
uint16_t temp;
uint8_t ui;
temp=Data << 2;//7311需要移两位
temp &= 0x3FFF;//选择模式为Normal
AO2_SYNC_H();
AO2_SCLK_H();
delay(10);
AO2_SYNC_L();//使能输入移位寄存器
delay(10);
for(ui=0; ui<16; ui++)
{
AO2_SCLK_H();
if(0x8000 == (temp & 0x8000))
{
AO2_DIN_H();
}
else
{
AO2_DIN_L();
}
delay(10);
AO2_SCLK_L();
delay(10);
temp <<=1;
}
AO2_SYNC_H();
}
void ao1_set(float current)
{
uint16_t data = 0;
current = current * 100;//电流转为电压
data = (current * 4096) / 3300;
cnum = data;
ao1_write(data);
}
void ao2_set(float current)
{
uint16_t data = 0;
current = current * 100;//电流转为电压
data = (current * 4096) / 3300;
ao2_write(data);
}