提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
基于STM32 的DAC7311芯片驱动程序及电路设计
一、DAC7311电路设计
二、驱动程序
1.DAC7311时序图、工作模式及数据格式
在这里插入代码片
2.驱动代码
h文件:
#ifndef FUNCDAC7311
#define FUNCDAC7311_EXTERN extern
#else
#define FUNCDAC7311_EXTERN
#endif
#include "stm32f4xx_hal.h"
#include "jiang_gpio.h"
#define DAC7311_DIN_H() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9,GPIO_PIN_SET)
#define DAC7311_DIN_L() HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9,GPIO_PIN_RESET)
#define DAC7311_SCL_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,GPIO_PIN_SET)
#define DAC7311_SCL_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8,GPIO_PIN_RESET)
#define DAC7311_SYNC_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12,GPIO_PIN_SET)
#define DAC7311_SYNC_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12,GPIO_PIN_RESET)
FUNCDAC7311_EXTERN void BSP_DAC7311_Init(void);
FUNCDAC7311_EXTERN void DAC7311_Write(float data);
c文件:
#define FUNCDAC7311
#include "jiang_dac7311.h"
void BSP_DAC7311_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //SYNC-PA15
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_12;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC,&GPIO_InitStruct);
DAC7311_SYNC_H();
DAC7311_SCL_L();
}
static void DAC_delay(uint32_t nus)
{
for(; nus!=0; nus--);
}
static void DAC7311_DACSET(uint16_t data)
{
uint16_t dac;
uint8_t i;
dac = data << 2; //数据需要向左移动两位
dac &= 0X3FFF; //正常模式
DAC7311_SYNC_H();
DAC7311_SCL_H();
DAC_delay(10);
DAC7311_SYNC_L();
DAC_delay(5);
for(i = 0;i< 16;i++)
{
DAC7311_SCL_H();
if(0X8000 == (dac & 0x8000))
{
DAC7311_DIN_H();
}
else
DAC7311_DIN_L();
DAC_delay(10);
DAC7311_SCL_L();
DAC_delay(10);
dac <<= 1; //向前移动一位
}
DAC7311_SYNC_H();
}
void DAC7311_Write(float Ddata)
{
uint16_t dac;
dac = Ddata*4096/2500;
DAC7311_DACSET(dac);
}