你好,
我已经在pdm out的驱动上工作了很长时间,但是我仍然不能得到正确的pdm out数据。我修改了项目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。启用SRC_IN中断,在isr服务功能中,我写pcm数据到SRC1_IN2_REG。对于测试,我只是每20个样本交替编写最大值和最小值,如下图所示:
Uint32_t const pdm_reg_value[2] = {0x800000ff, 0x7fffff00};
pdm_out_select = 0;
空白pdm_src_in_interrupt_cb_test (pdm_src_isr_data_t * src_isr_data)
{
pdm_out_select + +;
如果(pdm_out_select = = 40)
pdm_out_select = 0;
*(uint32_t *)SRC1_IN2_REG = pdm_reg_value[pdm_out_select/20];
...
}
我得到了一个wave,如附件所示。写最大值,我应该得到一个所有一个值的pdm数据,写最小值,我应该得到一个所有零值的pdm数据。
示波器获得的数据表明:PDM数据没有立即反转。我不知道为什么。是正确的吗?
设备:
嗨Hailtao,
如果我没记错的话,您最近创建了一个关于如何将pcm数据转换为pdm数据的类似论坛帖子。请注意,没有任何类似的例子,你应该在RCU引用应用程序代码中做一些修改。你能让我知道你是否按照之前的职位描述的所有程序来做吗?为了您的方便,我将复制粘贴程序:
pcm数据必须存储到SRC1_IN1_REG和SRC1_IN2_REG中,这取决于是否打算使用立体声模式。对于正确的通道,必须写入SRC1_IN2_REG。这可以通过使用ARM M0或通过DMA来完成。
改变pdm_config。方向确实是需要的,但它还不足以产生预期的结果。
为了使用DMA,需要分配一个可用的通道对(0/1或2/3)来服务于SRC。对于立体声模式,两个通道对都必须分配给SRC,以便能够写入SRC1_IN1_REG(例如,使用通道1)和SRC1_IN2_REG(使用通道3)。
由于PDM输出是有意的,并且假设pcm编码的数据位于系统内存(请确认在您的应用程序中是否确实如此),只有“奇数”通道(1,3)的DMA应该被激活,以从内存写入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_mode])。这意味着SRC输入接口频率的采样率也必须在SRC1_IN_FS_REG中相应地设置(参见表52)。
为了获得更多关于音频单元的信息,我强烈建议你看一看DA14585 datasheet的第24节音频单元(AU),它也会非常有帮助,检查图66:音频单元框图。
但是,我会再次检查你的问题,并尽快给你答复。
谢谢,PM_Dialog
是的,我以前问过类似的问题。当时你的建议对我非常有帮助,谢谢:)。现在PDM数据结果接近正确。此处提到的测试不使用DMA,但在SRC_IN中断服务中将PCM数据写入SRC1_IN2_REG。写入SRC1_IN2_REG的PCM数据无法立即获得正确的PDM输出。相反,我需要在几个连续的SRC_IN中断中重复编写相同的PCM数据,以逐渐获得正确的PDM输出。简而言之,我得到了正确的PDM结果,但没有立即。.这让我感到困惑。
嗨Hailtao,
让我检查一下您的问题,我会尽快给您回复。感谢您提供的信息。
谢谢,PM_Dialog