STM32控制TPA6130A2驱动(读取状态、调整音量、静音)
提示:本文包含AI编写的代码。
没有前言。发出来当备份用。这个义胜电子的翻新还是那么不走心,I2C地址都和手册上的不一样,在初始化函数里加了个扫地址。
/* TPA6130A2_H */
#ifndef TPA6130A2_H
#define TPA6130A2_H
#include "i2c.h"
#include "main.h"
HAL_StatusTypeDef TPA6130A2_Init(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef TPA6130A2_Read_Status(I2C_HandleTypeDef *hi2c,
uint8_t *status, uint8_t target_register);
HAL_StatusTypeDef TPA6130A2_Write_Status(I2C_HandleTypeDef *hi2c,
uint8_t *status, uint8_t target_register);
HAL_StatusTypeDef TPA6130A2_Print_Status(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef Volume_UP(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef Volume_Down(I2C_HandleTypeDef *hi2c);
HAL_StatusTypeDef Mute_Toggle(I2C_HandleTypeDef *hi2c);
#endif
/* TPA6130A2_C */
#include "tpa6130a2.h"
uint8_t TPA6130A2_Address = 0b01100001;
HAL_StatusTypeDef TPA6130A2_Read_Status(I2C_HandleTypeDef *hi2c,
uint8_t *status, uint8_t target_register)
{
return HAL_I2C_Mem_Read(hi2c, TPA6130A2_Address << 1, target_register,
I2C_MEMADD_SIZE_8BIT, status, 1, HAL_MAX_DELAY);
}
HAL_StatusTypeDef TPA6130A2_Write_Status(I2C_HandleTypeDef *hi2c,
uint8_t *status, uint8_t target_register)
{
return HAL_I2C_Mem_Write(hi2c, TPA6130A2_Address << 1, target_register,
I2C_MEMADD_SIZE_8BIT, status, 1, HAL_MAX_DELAY);
}
HAL_StatusTypeDef TPA6130A2_Init(I2C_HandleTypeDef *hi2c)
{
HAL_StatusTypeDef res;
uint8_t status = 0;
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x01);
while (res != HAL_OK)
{
if (TPA6130A2_Address >= 0b01111111)
{
return HAL_ERROR;
}
TPA6130A2_Address++;
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x01);
}
my_printf("TPA6130A2 Found at address 0x%02X\r\n", TPA6130A2_Address);
status = 0b11000000 | (status & 0b00001110); // HP_EN_L=1, HP_EN_R=1, Mode=0 (Stereo headphone mode), SWS=0
res = TPA6130A2_Write_Status(hi2c, &status, 0x01);
if (res != HAL_OK)
return res;
status = 0b11000000;
res = TPA6130A2_Write_Status(hi2c, &status, 0x02);
if (res != HAL_OK)
return res;
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x03);
if (res != HAL_OK)
return res;
status = 0b00000011 | (status & 0b11111100); // HiZ_L=0, HiZ_R=0
res = TPA6130A2_Write_Status(hi2c, &status, 0x03);
if (res != HAL_OK)
return res;
return HAL_OK;
}
HAL_StatusTypeDef TPA6130A2_Print_Status(I2C_HandleTypeDef *hi2c)
{
uint8_t status = 0;
HAL_StatusTypeDef res;
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x01);
if (res != HAL_OK)
return res;
my_printf("TPA6130A2 HP_EN_L: %d\r\n", status >> 7 & 0x01);
my_printf("TPA6130A2 HP_EN_R: %d\r\n", status >> 6 & 0x01);
my_printf("TPA6130A2 Mode: %d\r\n", status >> 4 & 0x03);
my_printf("TPA6130A2 Terminal: %d\r\n", status >> 1 & 0x01);
my_printf("TPA6130A2 SWS: %d\r\n", status >> 0 & 0x01);
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x02);
if (res != HAL_OK)
return res;
my_printf("TPA6130A2 Mute_L: %d\r\n", status >> 7 & 0x01);
my_printf("TPA6130A2 Mute_R: %d\r\n", status >> 6 & 0x01);
my_printf("TPA6130A2 Volume: %x\r\n", status & 0b00111111);
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x03);
if (res != HAL_OK)
return res;
my_printf("TPA6130A2 HiZ_L: %d\r\n", status >> 1 & 0x01);
my_printf("TPA6130A2 HiZ_R: %d\r\n", status >> 0 & 0x01);
res = TPA6130A2_Read_Status(&hi2c1, &status, 0x04);
if (res != HAL_OK)
return res;
my_printf("TPA6130A2 Version: %d\r\n", status & 0b00001111);
return HAL_OK;
}
HAL_StatusTypeDef Volume_UP(I2C_HandleTypeDef *hi2c)
{
HAL_StatusTypeDef res;
uint8_t status = 0;
res = TPA6130A2_Read_Status(hi2c, &status, 0x02);
if (res != HAL_OK)
return res;
if ((status & 0b11000000) == 0b11000000)
{
return HAL_OK; // Muted, do nothing
}
if ((status & 0b00111111) < 0b00111111)
{
status = (status & 0b11000000) | ((status & 0b00111111) + 1);
return TPA6130A2_Write_Status(hi2c, &status, 0x02);
}
return HAL_OK;
}
HAL_StatusTypeDef Volume_Down(I2C_HandleTypeDef *hi2c)
{
HAL_StatusTypeDef res;
uint8_t status = 0;
res = TPA6130A2_Read_Status(hi2c, &status, 0x02);
if (res != HAL_OK)
return res;
if ((status & 0b11000000) == 0b11000000)
{
return HAL_OK; // Muted, do nothing
}
if ((status & 0b00111111) > 0)
{
status = (status & 0b11000000) | ((status & 0b00111111) - 1);
return TPA6130A2_Write_Status(hi2c, &status, 0x02);
}
return HAL_OK;
}
HAL_StatusTypeDef Mute_Toggle(I2C_HandleTypeDef *hi2c)
{
HAL_StatusTypeDef res;
uint8_t status = 0;
res = TPA6130A2_Read_Status(hi2c, &status, 0x02);
if (res != HAL_OK)
return res;
status ^= 0b11000000; // Toggle mute bits
return TPA6130A2_Write_Status(hi2c, &status, 0x02);
}

浙公网安备 33010602011771号