STM32和AD8402进行音量调节

STM32和AD8402进行音量调节

SPI

硬件连接

SPI使用四根线进行通信,包括主设备(通常是微控制器)的主输出/从输入(MOSI)、主输入/从输出(MISO)、时钟(SCK)和片选(SS)线。通过这些线,主设备可以与多个从设备进行通信。
在这里插入图片描述
1:N
在这里插入图片描述

AD8402

简介

AD8402是一款数字可调电阻器芯片,由ADI(Analog Devices Inc.)生产。它具有两个独立的通道,每个通道都包含一个可编程电阻和一个8位的数字-模拟转换器(DAC)。

特点

  • 可编程电阻器:AD8402包含两个独立的可编程电阻器通道,每个通道都具有256个电阻步进,可提供精确的电阻调节。
  • SPI接口:AD8402使用SPI(Serial Peripheral Interface)接口与外部设备进行通信。
  • 8位数字-模拟转换器(DAC):每个通道都包含一个8位的DAC,用于将数字命令转换为相应的模拟电阻值。通过调整DAC的输出,可以实现精确的电阻调节。

在这里插入图片描述

在这里插入图片描述

代码

void keyDown(){
	//音量+
	if(HAL_GPIO_ReadPin(K1_GPIO_Port,K1_Pin) == 0){
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(K1_GPIO_Port,K1_Pin) == 0){
			if(volume < 240){
				volume += v_level;
				setVolume(volume);
				while(HAL_GPIO_ReadPin(K1_GPIO_Port,K1_Pin) == 0);
			}
		}
	}
		//音量-
	if(HAL_GPIO_ReadPin(K2_GPIO_Port,K2_Pin) == 0){
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(K2_GPIO_Port,K2_Pin) == 0){
			if(volume > 10){
				volume -= v_level;
				setVolume(volume);
				showVolume();
				while(HAL_GPIO_ReadPin(K2_GPIO_Port,K2_Pin) == 0);
			}
		}
	}
}
//设置音量 0-255 数值越小 音量越小
void setVolume(uint8_t vol){
	data_write(0X00,vol);
	data_write(0X01,vol);
}

这段代码是一个设置音量大小的函数,名为setVolume。函数接受一个vol参数,类型为8位无符号整数(uint8_t)表示音量大小。函数的功能如下:

  • data_write(0X00, vol);:调用data_write函数,向设备发送音量大小的数据。第一个参数0x00表示地址,第二个参数vol表示音量大小。

  • data_write(0X01, vol);:调用data_write函数,向设备发送音量大小的数据。第一个参数0x01表示地址,第二个参数vol表示音量大小。

通过调用data_write函数两次,分别向地址0x00和0x01写入相同的音量值。这样做是因为音量设置应用到AD8402的两个通道上,确保两个通道的音量保持一致。这在立体声系统应用场景下,需要同时调节左右声道的音量。确切的操作和寄存器映射需要参考AD8402的数据手册或相关文档,

void data_write(uint8_t channel,uint8_t data){
	uint8_t i=0;
	HAL_GPIO_WritePin(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_RESET);
	//地址先发一个0
	HAL_GPIO_WritePin(SPI_SCK_GPIO_Port,SPI_SCK_Pin,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(SPI_SDA_GPIO_Port,SPI_SDA_Pin,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(SPI_SCK_GPIO_Port,SPI_SCK_Pin,GPIO_PIN_SET);
	
	//地址发送具体
	HAL_GPIO_WritePin(SPI_SCK_GPIO_Port,SPI_SCK_Pin,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(SPI_SDA_GPIO_Port,SPI_SDA_Pin,channel == 0x01 ?GPIO_PIN_SET : GPIO_PIN_RESET);
	HAL_GPIO_WritePin(SPI_SCK_GPIO_Port,SPI_SCK_Pin,GPIO_PIN_SET);

  for(i=0;i<8;i++)
	{  							
		HAL_GPIO_WritePin(SPI_SCK_GPIO_Port,SPI_SCK_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(SPI_SDA_GPIO_Port,SPI_SDA_Pin,(data & 0x80) == 0x80 ? GPIO_PIN_SET : GPIO_PIN_RESET);
		HAL_GPIO_WritePin(SPI_SCK_GPIO_Port,SPI_SCK_Pin,GPIO_PIN_SET);
		
		data<<= 1;
	}	
	HAL_GPIO_WritePin(SPI_CS_GPIO_Port,SPI_CS_Pin,GPIO_PIN_SET);
}

这段代码是根据AD8402的SPI的时序图编写的,重点是理解SPI数据引脚(SDA)发送的数据只在SPI时钟引脚(SCK)上升沿有效,需结合SPI的时序图来理解

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值