你好,
我一直在驾驶员驾驶员长期以来,但我仍然无法获得正确的PDM输出数据。我修改了项目DA14585_RCU_V_6.140.2.17,试图将一些PCM数据转换为PDM数据。我在手动模式下工作了SRC_IN,SRC_OUT在自动模式下工作。SRC_IN采样率设置为16kHz,SRC数据源是SRC_IN_REG。PDM_CLK设置为3.2MHz,PDM_DATA方向是pdm_direction_out_left。在ISR服务功能中启用了SRC_IN中断,我将PCM数据写为SRC1_IN2_REG。对于测试,我刚刚在每20个样本中写出最大Vaule和最小值,如下所示:
uint32_t const pdm_reg_value [2] = {0x800000FF,0x7FFFFF00};
uint32_t pdm_out_select = 0;
void pdm_src_in_interrupt_cb_test(pdm_src_isr_data_t * src_isr_data)
{
pdm_out_select ++;
if(pdm_out_select == 40)
pdm_out_select = 0;
*(uint32_t *)src1_in2_reg = pdm_reg_value [pdm_out_select / 20];
......
}
并且我的浪潮如附件所示。编写最大值,我应该得到一个所有值PDM数据,写入最小值,我应该得到一个零值PDM数据。
通过示波器获得的数据表明:PDM数据不会立即颠倒。我不知道为什么。这是正确的吗?
设备:
嗨海泰,
如果我记得正确,您最近创建了一个类似的论坛主题,有关如何将数据数据到PDM数据。请注意,没有任何可用的例子,您应该在RCU参考应用程序代码中进行一些修改。如果您遵循上一篇文章中描述的所有程序,请您能告诉我吗?为方便起见,我将复制粘贴程序:
必须将PCM数据存储到SRC1_IN1_REG和SRC1_IN2_REG,具体取决于立体声模式。仅限右声道,必须写入src1_in2_reg。这可以通过使用ARM M0或通过DMA来完成。
因此,确实需要pdm_config.direction的更改,但不足以产生所需的输出。
为了使用DMA,需要将其中一个可用的通道绑定(0/1或2/3)分配给SRC。对于立体声模式,必须将两个通道对分配给SRC,以便能够写入SRC1_IN1_REG(具有通道1,例如)和SRC1_IN2_REG(使用通道3)。
由于PDM输出是预期的,并且提供了PCM编码的数据位于系统内存(请确认这是您的应用程序中的确实如此),只有DMA的“奇数”通道(1,3)应该被激活,从内存写入SRC。
通过未对SRC1_IN1 / 2_REG写入任何内容,并且只需激活PDM输出模式,SRC会产生输出,但是不是预期的输出。
在该测试情况下,必须将SRC输出接口设置为在SRC1_CTRL_REG [SRC_OUT_AMODE]中的自动模式,在SRC中产生PDM输出时(另请参阅SRC手册和自动模式配置的DA14585数据表的表51,具体取决于使用案件)。
关于SRC输入接口,如果DMA获取数据并将其写入SRC输入寄存器,则可以将其设置为手动模式(参见SRC1_CTRL_REG [SRC_IN_AMODE])。这意味着还必须在SRC1_IN_FS_REG中相应地设置SRC输入接口频率的采样率(另请参见表52)。
为了获取有关音频单元的更多信息,我非常建议您看看DA14585数据表的第24部分音频单元(AU),检查66:音频单元块图也非常有帮助。
但是,我会再次检查您的问题,我会尽快回复您。
谢谢,PM_DIALOG.
是的,我以前问过类似的问题。当时你的建议对我非常有帮助,谢谢:)。现在PDM数据结果接近正确。此处提到的测试不使用DMA,但在SRC_IN中断服务中将PCM数据写入SRC1_IN2_REG。写入SRC1_IN2_REG的PCM数据无法立即获得正确的PDM输出。相反,我需要在几个连续的SRC_IN中断中重复编写相同的PCM数据,以逐渐获得正确的PDM输出。简而言之,我得到了正确的PDM结果,但没有立即。。这让我感到困惑。
嗨海泰,
让我检查你的问题,我会尽快回复你。感谢您提供的信息。
谢谢,PM_DIALOG.