TAS2120: TAS2120 PVDD电压异常 ADC数据转换方式

Part Number: TAS2120

问题1:PVDD电压只有4.5V,而不是15V?

问题2:SAR_ADC_VBAT SAR_ADC_PVDD SAR_ADC数据转换方式是怎么样的?

 image.png

#define SW_RESET_ADDRESS 0x01

#define PWR_CTL_ADDRESS 0x02
#define PWR_CTL_MODE 0x00

#define DEVICE_CFG_01_ADDRESS 0x03
#define EFFICIENCY_MODE_DISABLE (0 << 6)


#define DEVICE_CFG_05_ADDRESS 0x07
#define AMP_LVL_21dB_15_9V 0x00
#define AMP_LVL_1_434dB_1_7V 0x27
#define AMP_LVL_0_932dB_1_6V 0x28

#define TDM_CFG2_ADDRESS 0x09
#define RX_SCFG_L (1 << 4)
#define RX_SCFG_R (2 << 4)
#define RX_SCFG_LR (3 << 4)
#define RX_WLEN_24 (2 << 2)
#define RX_SLEN_32 (2 << 0)
#define RX_SLEN_24 (1 << 0)
#define RX_SLEN_16 (0 << 0)

#define TDM_DET_ADDRESS 0x14
// #define FS_RATE_DETECTED_48K (4 << 0)
// #define FS_RATIO_DETECTED_64 (4 << 0)

#define BST_CFG_02_ADDRESS 0x22
#define BST_MODE_H (0 << 6)
#define BST_MODE_G (1 << 6)
#define BST_MODE_OPEN (2 << 6)
#define BST_EN (1 << 5)

#define SAR_MONITOR_01_ADDRESS 0x26

rt_err_t tas2120_init(void)
{
    uint8_t data;
    uint8_t data2;
    // HAL_I2C_DeInit(&hi2c3);
    // MX_I2C3_Init();

    data = 1; //复位
    if (tas2120_i2c_write_data(SW_RESET_ADDRESS, &data, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    rt_thread_mdelay(1);


    data = PWR_CTL_MODE;
    if (tas2120_i2c_write_data(PWR_CTL_ADDRESS, &data, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    if (tas2120_i2c_read_data(PWR_CTL_ADDRESS, &data2, 1) != RT_EOK)
    {
        return RT_ERROR;
    }

    data = EFFICIENCY_MODE_DISABLE;
    if (tas2120_i2c_write_data(DEVICE_CFG_01_ADDRESS, &data, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    if (tas2120_i2c_read_data(DEVICE_CFG_01_ADDRESS, &data2, 1) != RT_EOK)
    {
        return RT_ERROR;
    }


    data = AMP_LVL_21dB_15_9V; //增益
    if (tas2120_i2c_write_data(DEVICE_CFG_05_ADDRESS, &data, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    if (tas2120_i2c_read_data(DEVICE_CFG_05_ADDRESS, &data2, 1) != RT_EOK)
    {
        return RT_ERROR;
    }


    data = BST_MODE_OPEN | BST_EN;
    if (tas2120_i2c_write_data(BST_CFG_02_ADDRESS, &data, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    if (tas2120_i2c_read_data(BST_CFG_02_ADDRESS, &data2, 1) != RT_EOK)
    {
        return RT_ERROR;
    }


    data = RX_SLEN_32 | RX_WLEN_24 | RX_SCFG_L; //i2s 32位数据 有效24位 左通道输出
    if (tas2120_i2c_write_data(TDM_CFG2_ADDRESS, &data, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    if (tas2120_i2c_read_data(TDM_CFG2_ADDRESS, &data2, 1) != RT_EOK)
    {
        return RT_ERROR;
    }


    if (tas2120_i2c_read_data(TDM_DET_ADDRESS, &data2, 1) != RT_EOK)
    {
        return RT_ERROR;
    }
    tas2120_monitor_t monitor;

    tas2120_read_monitor(&monitor);

    return RT_EOK;

}
rt_err_t tas2120_read_monitor(tas2120_monitor_t *monitor)
{
    uint8_t buff[5];
    if (tas2120_i2c_read_data(SAR_MONITOR_01_ADDRESS, buff, 5))
    {
        return RT_ERROR;
    }

    monitor->vbat = (buff[0] << 8) | buff[1];
    monitor->pvdd = (buff[2] << 8) | buff[3];
    monitor->temp = buff[4];

    return RT_EOK;
}
 
 
rt_err_t tas2120_read_monitor(tas2120_monitor_t *monitor)
{
    uint8_t buff[5];
    if (tas2120_i2c_read_data(SAR_MONITOR_01_ADDRESS, buff, 5))
    {
        return RT_ERROR;
    }

    monitor->vbat = (buff[0] << 8) | buff[1];
    monitor->pvdd = (buff[2] << 8) | buff[3];
    monitor->temp = buff[4];

    return RT_EOK;
}
image.png