STM32驱动DAC7311

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);
}
  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DAC7512是一款12位数字模拟转换器(DAC),它可以将数字信号转换为模拟电压输出。在STM32中,我们可以通过SPI接口来驱动该芯片。 以下是DAC7512的连接方式: DAC7512的VDD和VREFH需要外部提供5V的电源,而VSS和VREFL则需要接地。CS、SCLK和SDIN分别连接到STM32的GPIO引脚上,可以使用SPI接口来驱动它们。LDAC引脚可以选择接地或者拉高,用于设置DAC输出的更新方式。 以下是DAC7512的初始化代码示例: ```c #include "stm32f4xx.h" void DAC7512_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // 配置CS引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置SCLK和SDIN引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1); // 配置SPI接口 SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); // 初始化DAC7512 GPIO_SetBits(GPIOA, GPIO_Pin_4); // CS拉高 DAC7512_Write(0x0000); // 写入初始值 } void DAC7512_Write(uint16_t value) { GPIO_ResetBits(GPIOA, GPIO_Pin_4); // CS拉低 uint8_t high_byte = (value >> 8) & 0xFF; uint8_t low_byte = value & 0xFF; SPI_I2S_SendData(SPI1, high_byte); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI1, low_byte); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); GPIO_SetBits(GPIOA, GPIO_Pin_4); // CS拉高 } ``` 在初始化时先开启SPI1接口和GPIOA的时钟,然后分别配置CS、SCLK和SDIN引脚。注意SDIN引脚需要使用AF模式,并且需要配置对应的SPI AF映射。接着配置SPI接口的参数,并启用SPI。最后在初始化函数内将CS拉高并写入初始值。 DAC7512_Write函数用于向DAC7512写入数据,先将CS拉低,然后将待写入的数据拆分成高8位和低8位,并分别通过SPI发送。发送完成后将CS拉高。 以上是DAC7512的驱动代码示例,希望能帮到你。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值