This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
https://e2e.ti.com/support/audio-group/audio/f/audio-forum/965640/tlv320aic3100-biquad-filter-dac
器件型号:TLV320AIC3100尊敬的团队:
我们的客户在通过 tlv320aic31xx.c 设置器件 DAC 的 Biquad 滤波器时遇到了挑战
我们通过电子邮件发送了第0页和第8页的第一个数据和寄存器转储。
此 E2E 帖子是客户(Tim)<>产品线(Pedro / Aaron)之间的直接沟通、因为我将休假。
此致
Martin
您好、Tim、
似乎您正在正确地写入第8页。 我想尝试查看器件是如何配置的、但仅具有第0页和第8页的寄存器转储。 是否可以为第1页发送寄存器转储?
我将尝试在 EVM 上复制您的配置、以查看是否可以重现此问题。 我有一个问题、就是在轮询第8页寄存器1上的位 D0时、您是否要通过器件传递数据?
此致、
Aaron
您好、Aaron、
感谢您的回答。 芯片"就在那里"、我在设置寄存器值时不播放音乐。
我应该关闭其他东西吗?
# i2cset -f -y 1 0x18 0 1
# i2cdump -f -y 1 0x18
0 1 2 3 4 5 6 7 8 9 A b c d e f 0123456789abcdef
00:01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00..........
10:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C4 ?
20:86 3E 00 76 80 80 7f 4F 1D 00 20 86 00 80 ?>.v???OO?。 ???
30:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
40:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
A0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
B0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
C0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
D0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
E0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
F0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
此致、
Tim
您好、Tim、
对我们因节假日而在这里的延误表示歉意。
我将确保 BCLK 和 WCLK 已连接、并且在启用自适应模式时也尝试传递一些数据。 当位 D0设置为1时、系数将在器件运行时在下一个 WCLK 帧上切换。 可以尝试一下吗?
此致、
Aaron
您好、Aaron、
我尝试在(旧的、模拟的)示波器上测量 BCLK 和 WCLK。 明天我将与硬件工程师讨论。
WCLK (I2S_SCLK)=~3V、~1.6us (625.0kHz)
BCLK (I2S_FCLK)=~3V、~50.2us (19.92kHz)
我播放了从20Hz 到20kHz 的扫描、然后运行"setbiquad.sh"脚本。 我注意到的唯一区别是声音。 似乎正在播放一个额外的正弦。
您好、Tim、
是否可以交换上面的 WCLK 和 BCLK 频率? 600kHz 的 WCLK 过高、19kHz 的 BCLK 频率过低。 WCLK 频率应等于采样率、因此如果互换、我认为您将以20kHz 的采样率运行。 是这样吗?
此致、
Aaron
在我上面的评论中,我的确切换了这两个,对不起。 WCLK 连接到 I2S_FCLK、BCLK 连接到 I2S_SCLK。
在与"my"硬件工程师的讨论中、我们发现 MCLK 不起作用(至少焊盘上没有信号)。 我觉得我能发出一个声音有点奇怪。 我正在修复此 ATM、我明天会回来。
Tim、
感谢您的澄清。 我将等待您的回复。
此致、
Aaron Estrada
Aaron、您好!
我启用了12.5MHz、该位似乎仍然挂起。 我应该更改 tlv320aic31xx 驱动程序中的某个内容以使 DAC 正常工作、还是应该按原样工作? 启用 DAC 的先决条件是什么?
谢谢。
此致、
Tim
您好、Tim、
根据我在第0页收到的寄存器配置、看起来 DAC 已断电。 您能在第0页的寄存器0x3F 中启用 DAC 吗?
此致、
Aaron Estrada
您好、Tim、
我继续在 EVM 上测试了自适应模式、并看到 D0和 D1位都切换。 我发现奇怪的是、如果您上次在 P0上转储寄存器、DAC 被禁用。 我会确保当您检查要切换的位时、器件已准备好在启用 DAC 的情况下进行回放、并且编解码器正在接收 BCLK 和 WCLK。
此致、
Aaron Estrada
您好、Aaron、
我让它在一个器件上工作。 在多次尝试期间、我意外移除了启用 DAC。
谢谢。
此致、
Tim Gruijters
您好、Tim、
很高兴听到这个消息。 您的系统现在是否按预期运行? 如果是、我可以关闭该线程。
此致、
Aaron Estrada
Aaron、您好!
遗憾的是、将其添加到默认设置中不起作用。 错误:
[3.588296] ASOC-simple-card sound0:tlv320aic31xx-hifi <->202c000.SSI 映射正常
[4.620986] tlv320aic31xx-codec 1-0018:aic31xx_wait_bits:失败! 0x25应为0x88预期0x0 (0、0x80、500000us)
[4.632078] tlv320aic31xx-codec 1-0018:ASOC:POST_PMD:DAC 左侧事件失败:-1
地址0x25是 DAC 标志寄存器。 根据数据表、"单声道 D 类驱动器加电"和"左通道 DAC 加电"。 我最想的是这是正确的:-)
静态常量结构 reg_default aic31xx_reg_defaults[]={
{AIC31XX_RESET、0x1}、
{AIC31XX_RESET、0x0}、
{AIC31XX_CLKMUX、0x00}、
{AIC31XX_PLLPR、0x11}、
{AIC31XX_PLLJ、0x04}、
{AIC31XX_PLLDMSB、0x00}、
{AIC31XX_PLLDLSB、0x00}、
{AIC31XX_NDAC、0x01}、
{AIC31XX_MDAC、0x01}、
{AIC31XX_DOSRMSB、0x00}、
{AIC31XX_DOSRLSB、0x80}、
{AIC31XX_NADC、0x01}、
{AIC31XX_mAdc、0x01}、
{AIC31XX_AOSR、0x80}、
{AIC31XX_IFACE1、0x00}、
{AIC31XX_DATA_OFFSET、0x00}、
{AIC31XX_IFACE2、0x00}、
{AIC31XX_BCLKN、0x01}、
{AIC31XX_DACSETUP、 0x14}、
{AIC31XX_DACMUTE、0x0c}、
{AIC31XX_LDACVOL、0x00}、
{AIC31XX_RDACVOL、0x00}、
{AIC31XX_ADCSETUP、0x00}、
{AIC31XX_ADCFGA、0x80}、
{AIC31XX_ADCVOL、0x00}、
{AIC31XX_HPDRIVER、0x04}、
{AIC31XX_SPKAMP、0x06}、
{AIC31XX_DACMIXERROR、0x00}、
{AIC31XX_LANALOGUEHPL、0x7f}、
{AIC31XX_RANALOGEHPR、0x7f}、
{AIC31XX_LANALOGUESPL、0x7f}、
{AIC31XX_RANALOGUESLR、0x7f}、
{AIC31XX_HPLGAIN、0x02}、
{AIC31XX_HPRGAIN、0x02}、
{AIC31XX_SPLGAIN、0x00}、
{AIC31XX_SPRGAIN、0x00}、
{AIC31XX_MICBIAS、0x00}、
{AIC31XX_MICPGA、0x80}、
{AIC31XX_MICPGAPI、0x00}、
{AIC31XX_MICPGAMI、0x00}、
/*已添加*/
{AIC31XX_DACSETUP、b0}、
{AIC31XX_DACMUTE、0x00}、
{AIC31XX_REG (8、 2)、(TLV320AIC3XXX_FILTER_N0和0xFF00)>> 8}、// N0 MSB:0x7d *
{AIC31XX_REG (8、 3)、(TLV320AIC3XXX_FILTER_N0和0xFF)}、 /* N0 LSB:0x00 */
{AIC31XX_REG (8、 4)、(TLV320AIC3XXX_FILTER_N1和0xFF00)>> 8}、// N1 MSB:0x82 */
{AIC31XX_REG (8、 5)、(TLV320AIC3XXX_FILTER_N1和0xFF)}、 // N1 LSB:0xFF */
{AIC31XX_REG (8、 6)、(TLV320AIC3XXX_FILTER_N2和0xFF00)>> 8}、/* N2 MSB:0x7d */
{AIC31XX_REG (8、 7)、(TLV320AIC3XXX_FILTER_N2和0xFF)}、 // N2 LSB:0x00 *
{AIC31XX_REG (8、 8)、(TLV320AIC3XXX_FILTER_D1和0xFF00)>> 8}、// D1 MSB:0x7c */
{AIC31XX_REG (8、 9)、(TLV320AIC3XXX_FILTER_D1和0xFF)}、 // D1 LSB:0xf7 */
{AIC31XX_REG (8、10)、(TLV320AIC3XXX_FILTER_D2 & 0xFF00)>> 8}、// D2 MSB:0x85 *
{AIC31XX_REG (8、11)、(TLV320AIC3XXX_FILTER_D2 & 0xFF)}、 // D2 LSB:0xec */
};
谢谢、
Tim
将0x00更改为0x88不能解决问题:
tlv320aic31xx-codec 1-0018:aic31xx_wait_bits:失败! 0x25应为0x88预期0x88 (0、0x80、500000us)
您好、Tim、
看起来 DAC 仍处于断电状态。 该错误看起来会被抛出、因为它正在读取寄存器0x25而看不到0x88 (当寄存器0x25读取0x88时、DAC 通电)。
AIC31XX_DACSETUP 是 DAC 可加电的地方。
此致、
Aaron Estrada
Hallo Aaron、
我认为这不是真的、因为它是在 snd_SOC_DAPM_POST_PMD 事件下在 aic31xx_dapm_power_event 中触发的。 该值被屏蔽、且两者都必须为0、但它没有考虑到可以启用另一个 DAC)。
案例 SND_SOC_DAPM_POST_PMD:
返回 aic31xx_wait_bits (aic31xx、reg、mask、0、5000、 100);
我仍然得到错误:
[2.621239] tlv320aic31xx-codec 1-0018:aic31xx_wait_bits:失败! 0x25应为0x88预期0x0 (0、0x80、500000us)(((位和掩码)= 0x80)
[2.632370] tlv320aic31xx-codec 1-0018:ASOC:POST_PMD:DAC 左侧事件失败:-1
调试后、似乎不允许在 aic31xx_codec_probe 中启用 DAC。 我添加了以下内容:
静态常量结构 reg_default aic31xx_biquad_a[]={
/* DAC Biquad A */
{0x0、0x0}、//页
{AIC31XX_DACMUTE、0x00}、
{AIC31XX_DACSETUP、b0}、
{0x0、0x8}、//页
{AIC31XX_REG (8、 2)、(TLV320AIC3XXX_FILTER_N0和0xFF00)>> 8}、// N0 MSB:0x7d *
{AIC31XX_REG (8、 3)、(TLV320AIC3XXX_FILTER_N0和0xFF)}、 /* N0 LSB:0x00 */
{AIC31XX_REG (8、 4)、(TLV320AIC3XXX_FILTER_N1和0xFF00)>> 8}、// N1 MSB:0x82 */
{AIC31XX_REG (8、 5)、(TLV320AIC3XXX_FILTER_N1和0xFF)}、 // N1 LSB:0xFF */
{AIC31XX_REG (8、 6)、(TLV320AIC3XXX_FILTER_N2和0xFF00)>> 8}、/* N2 MSB:0x7d */
{AIC31XX_REG (8、 7)、(TLV320AIC3XXX_FILTER_N2和0xFF)}、 // N2 LSB:0x00 *
{AIC31XX_REG (8、 8)、(TLV320AIC3XXX_FILTER_D1和0xFF00)>> 8}、// D1 MSB:0x7c */
{AIC31XX_REG (8、 9)、(TLV320AIC3XXX_FILTER_D1和0xFF)}、 // D1 LSB:0xf7 */
{AIC31XX_REG (8、10)、(TLV320AIC3XXX_FILTER_D2 & 0xFF00)>> 8}、// D2 MSB:0x85 *
{AIC31XX_REG (8、11)、(TLV320AIC3XXX_FILTER_D2 & 0xFF)}、 // D2 LSB:0xec */
};
静态 int aic31xx_codec_probe (struct snd_soc_codec *编解码器){
/*原始初始化代码.. *
RET = aic31xx_add_controls (编解码器);
如果(RET){
printk (Kern_ERR "错误 aic31xx_add_control\n");
回程;
}
RET = aic31xx_add_widget (CODEC);
如果(RET){
printk (Kern_ERR "错误 aic31xx_add_widget\n");
回程;
}
对于(i = 0;i < array_size (aic31xx_biquad_a);i++){
printk (Kern_ERR "迭代%d\n"、i);
SND_SoC_WRITE (编解码器、aic31xx_biquad_a[i].reg、aic31xx_biquad_a[i].def);
}
回程;
}
如果无法将驱动程序中的 DAC 添加到 aic31xx_reg_defaults 中、应如何在驱动程序中启用 DAC? 您是否有一个示例展示了如何在 tlv320aic31xx 驱动程序中启用 DAC?
Tim、您好!
我想您可以使用 amixer 命令来启用 DAC。 我没有启用 DAC 的具体示例、但我在 这里包含了 E2E 帖子 、其中显示了一些 Linux 命令和可用控件。 请告诉我这是否有帮助。
此致、
Aaron Estrada
Aaron、您好!
我在 Android 设备上使用内核、因此我只使用了 tinymix。
TinyMix -D 0 4 1 #启用 扬声器驱动程序播放开关
TinyMix -D 0 5 2 #设置 扬声器驱动程序播放音量 2
TinyMix -D 0 6 115 #设置 扬声器模拟播放音量 115
Tinymix -D 0 7 131 131 #设置 DAC 播放音量 131 131
TinyMix -D 0 11单声道 #设置 DAC 左输入 单声道
TinyMix -D 0 19 1 #启用 左侧 DAC 的输出
TinyMix -D 0 24 1 #启用 扬声器开关
那么、您说的是、我无法在驱动程序本身中启用 DAC?
Tim、
让我跳一下、看看我是否能提供帮助。 为了提供一些背景信息、驱动程序首先使用 aic31xx_I2C_probe 来探测 AIC31xx。 然后、在加载驱动程序时、它会执行 aic31xx_codec_probe。 但是、其他 ALSA 命令可以执行驱动程序的任何其他部分:aic31xx_set_jack、aic31xx_set_bias _level 或 common31xx_snd_controls。 编写该驱动程序的目的是使 ALSA 小工具(common31xx_dapm_widget)可以调用 aic31xx_dapm_power_event 来打开 DAC 通道。
我们这里没有 Android 系统可以尝试、但似乎 alsamixer 控件位于微型混频器中。 启用 DAC 左侧或 DAC 右侧会调用 启用 DAC 通道的 aic31xx_dapm_power_event
您还可以在 aic31xx_codec_probe 的末尾进行编码、以启用 DAC 通道、类似于 aic31xx_dapm_power_event 设置 AIC31XX_DACFLAG 寄存器的方式。
此致、
佩德罗