Part Number: TAS2120
问题1:PVDD电压只有4.5V,而不是15V?
问题2:SAR_ADC_VBAT SAR_ADC_PVDD SAR_ADC数据转换方式是怎么样的?

#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;
}
