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);
}
posted @ 2025-10-20 20:36  GongYeSUDA  阅读(6)  评论(0)    收藏  举报