目录
0. 如果没有声音, 可以打印查看 "数字音量" 和 "模拟音量" 是否正常
1. 530X, 532X 常用音量控制模块图
2. EQ模块前级增益 (有用到EQ才有效, 默认EQ或不启用EQ时,此增益为0DB)
3. 数字音量, 可打印DACVOLCON 低16位查看.
4. 模拟音量: 可打印AUANGCON3 低8位查看. (模拟音量表见后面)
5. 程序中对音量的总设置函数: bsp_change_volume(bsp_dac.c中).
6. 如果音量还小, 还可以留意VDDDAC电源配置电压是否正常
7. 模拟音量对应表
0. 如果没有声音, 可以打印查看 "数字音量" 和 "模拟音量" 是否正常
调试过程中, 经常会遇到没有声音的情况, 可以直接打印一下"数字音量"和模拟音量.
建议在公共处理函数 func_process中增加如下printf_info打印, 1秒打印一次, 查看数字音量和模拟音量是否正常.
如果数字音量或模拟音量均是最小, 可以尝试调用dac_fade_in函数淡入声音(此函数会自动淡入数字音量和模拟音量).
//530X,532X,536X,889X等都是这两个寄存器
#define AUANGCON3 SFR_RW (SFR1_BASE + 0x3f*4) //模拟音量,音量值查看其低7位, 对应增益见本文末尾模拟音量表
#define DACVOLCON SFR_RW (SFR1_BASE + 0x11*4) //数字音量,音量值查看其低16位, 最大值0x7FFF (0DB)
AT(.text.func.bt)
void printf_info(void)
{
static u32 ticks = 0;
if (tick_check_expire(ticks,1000)) { //1000ms打印一次
ticks = tick_get();
printf("--------------->\nDACVOLCON = 0x%X , AUANGCON3 = 0x%X\n", DACVOLCON&0xFFFF,AUANGCON3&0x7F);
}
}
AT(.text.func.process)
void func_process(void)
{
WDT_CLR();
printf_info();
......
}
1. 530X, 532X 等常用音量控制模块图
530X/532X声音输出最大值可达到2.8V不失真(峰峰值,常规串电容双声道输出)
2. EQ模块前级增益 (有用到EQ才有效, 默认EQ或不启用EQ时,此增益为0DB)
在配置工具Equalizer中, 可以设置EQ前级增益, 范围(-24~+12)DB
当音量小时, 可以提高此增益.
曾经遇到有台样机, 音量怎么也调不上去, 最后发现是生成的EQ文件, 前级增益配置太小了.
3. 数字音量, 可打印DACVOLCON 低16位查看.
最大值为0x7FFF (对应0DB) //寄存器为 #define DACVOLCON SFR_RW (SFR1_BASE + 0x11*4)
程序中是调用dac_set_dvol 函数进行设置数字音量,参数范围(0~0x7FFF)
4. 模拟音量: 可打印AUANGCON3 低8位查看. (模拟音量表见后面)
最大值为0x70, 对应+5DB
寄存器为#define AUANGCON3 SFR_RW (SFR1_BASE + 0x3f*4)
程序中是调用 dac_set_volume 设置模拟音量, 参数范围(0~59) 分别对应(-54~+5)DB增益
5. 程序中对音量的总设置函数: bsp_change_volume(bsp_dac.c中).
在这个函数中, 可以看到, 按键调音量, 一般有两种做法:
1) 固定数字音量, 调音量时只调模拟音量. (SDK默认使用这种做法)
2) 固定模拟音量, 调音量只调数字音量.(需要打开宏 SYS_ADJ_DIGVOL_EN)
AT(.text.bsp.dac)
void bsp_change_volume(u8 vol)
{
#if !SYS_ADJ_DIGVOL_EN
///sys adjust dac analog volume
u8 anl_vol = 0;
if (vol <= VOL_MAX) {
if (vol > 0) {
anl_vol = dac_avol_table[vol] + sys_cb.anl_gain_offset;
}
dac_set_volume(anl_vol);
}
#else
///sys adjust dac digital volume
u16 dig_vol = 0;
if (vol <= VOL_MAX) {
dig_vol = dac_dvol_table[vol];
dac_set_dvol(dig_vol);
}
#endif
}
6. 如果音量还小, 还可以留意VDDDAC电源配置电压是否正常
vdddac是dac使用的电源, dac输出的峰峰值不会超过电源的幅度.(电源配置成最大3.2时, dac输出峰峰值只能达到最大2.8V不失真)
这里的DAC最大音量和通话最大音量, 最后更改的均是模拟音量.
7. 模拟音量对应表
模拟音量表( AUANGCON3低 7位) 其中N代表负增益, P代表正增益.
#define N_54DB 0x0F //000 1111
#define N_53DB 0x1F //001 1111
#define N_52DB 0x2F //010 1111
#define N_51DB 0x3F //011 1111
#define N_50DB 0x4F //100 1111
#define N_49DB 0x5F //101 1111
#define N_48DB 0x0E //000 1110
#define N_47DB 0x1E //001 1110
#define N_46DB 0x2E //010 1110
#define N_45DB 0x3E //011 1110
#define N_44DB 0x4E //100 1110
#define N_43DB 0x5E //101 1110
#define N_42DB 0x0D //000 1101
#define N_41DB 0x1D //001 1101
#define N_40DB 0x2D //010 1101
#define N_39DB 0x3D //011 1101
#define N_38DB 0x4D //100 1101
#define N_37DB 0x5D //101 1101
#define N_36DB 0x0C //000 1100
#define N_35DB 0x1C //001 1100
#define N_34DB 0x2C //010 1100
#define N_33DB 0x3C //011 1100
#define N_32DB 0x4C //100 1100
#define N_31DB 0x5C //101 1100
#define N_30DB 0x0B //000 1011
#define N_29DB 0x1B //001 1011
#define N_28DB 0x2B //010 1011
#define N_27DB 0x3B //011 1011
#define N_26DB 0x4B //100 1011
#define N_25DB 0x5B //101 1011
#define N_24DB 0x0A //000 1010
#define N_23DB 0x1A //001 1010
#define N_22DB 0x2A //010 1010
#define N_21DB 0x3A //011 1010
#define N_20DB 0x4A //100 1010
#define N_19DB 0x5A //101 1010
#define N_18DB 0x09 //000 1001
#define N_17DB 0x19 //001 1001
#define N_16DB 0x29 //010 1001
#define N_15DB 0x39 //011 1001
#define N_14DB 0x49 //100 1001
#define N_13DB 0x59 //101 1001
#define N_12DB 0x08 //000 1000
#define N_11DB 0x18 //001 1000
#define N_10DB 0x28 //010 1000
#define N_9DB 0x07 //000 0111
#define N_8DB 0x06 //000 0110
#define N_7DB 0x05 //000 0101
#define N_6DB 0x04 //000 0100
#define N_5DB 0x03 //000 0011
#define N_4DB 0x02 //000 0010
#define N_3DB 0x01 //000 0001
#define N_2DB 0x00 //000 0000
#define N_1DB 0x10 //001 0000
#define N_0DB 0x20 //010 0000
#define P_1DB 0x30 //011 0000
#define P_2DB 0x40 //100 0000
#define P_3DB 0x50 //101 0000
#define P_4DB 0x60 //110 0000
#define P_5DB 0x70 //111 0000
本章完结, thanks.