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的时序图来理解