i.MX RT600之DMIC外设介绍及应用

恩智浦的i.MX RT600是跨界处理器产品,一样也是i.MX RTxxx系列的开山之做。不一样于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核与高性能Cadence Tensilica HiFi 4 音频DSP内核相结合,适用于32位沉浸式音频播放和视频用户界面应用。i.MX RT600旨在经过安全、功率优化的嵌入式处理器充分挖掘语音辅助终端节点的潜力,所以针对音频数据的采集、传输和处理,i.MX RT600都有丰富的硬件资源进行支持。其中,针对RT600的DMIC外设,本文详细地进行了介绍,并基于i.MX RT600 EVK开发板,在RT600的DSP端(HiFi4)实现了一个8通道音频数据采集的demo。html

1、DMIC介绍

1.1 DMIC 接口

DMIC接口也称双/立体声数字麦克风接口。i.MX RT600提供了最多8通道的PDM(脉冲密度调制)数字接口,共8根引脚,其中4根时钟引脚为PDM接口的数字麦克风提供时钟参考,4根数字引脚可以从PDM接口的数字麦克风上采集数据。每一个PDM接口都支持两个单通道麦克风或单个立体声麦克风的链接选项,下图给出了本次应用中采用的8通道DMIC多路复用链接方式做为参考。安全

avatar

1.2 RT600 DMIC硬件架构

i.MX RT600总共包含8个DMIC通道,能够从多路的数字麦克风设备采集PDM数据,通过内部一系列处理后,就能够获得16bits或24bits的PCM数据,并支持CPU或DMA直接访问。每一个DMIC通道的内部框图以下所示。架构

avatar

从DMIC内部通道的框图能够看出,PDM数据到PCM转换的滤波过程包括四个阶段。post

第一阶段,从CIC滤波器开始,它是结合了抽取器的FIR滤波器。 CIC滤波器以给定的过采样率未来自数字麦克风的PDM数据转换为PCM数据,该采样率能够被OSR寄存器配置。性能

第二阶段,PCM数据由半带抽取滤波器处理后频率降为原来的一半,同时通过这一阶段后,补偿了音频带上限的滚降。flex

第三阶段,同第二阶段同样,PCM数据通过一个半带抽取滤波器处理,频率降为原来的一半。优化

第四阶段,DC滤波器用于消除了音频信号中任何不须要的直流份量。3d

另外,为了实现更低的功耗,将Use 2FS register寄存器中的USE2FS位置1能够绕过第二个半带抽取滤波器,并为DC滤波器提供2FS而不是1FS信号。当经过CPU或DMA从FIFO中读取PCM数据时,其位宽能够是16bit和24bit,这能够经过配置DCCTRL寄存器的SATURATEAT16BITSIGNEXTEND位来控制。code

1.3 DMIC时钟和采样频率计算

DMIC采样频率取决于三个方面:
1)DMIC接口基础时钟。
DMIC接口的基础时钟为整个DMIC外设提供一个参考时钟,能够经过寄存器CLKCTL1 DMIC0CLKSEL和寄存器DMIC0CLKDIV进行配置。 DMIC外设的可选时钟源以下图所示,包括SFRO,FFRO,audio_pll_clk, mclk_in,1m_lposc和32k_wake_clk。视频

avatar

2)提供给数字麦克风设备的DMIC采样时钟。
这里的DMIC采样时钟用于提供给链接在DMIC外设上的数字麦克风设备一个PDM基准采样频率。固然这个频率的范围是有限制的,最高不超过6.144MHz,这就致使DMIC的基础时钟的频率不该超过24.576MHz。
3)PCM采样频率。
由上面的DMIC通道内部框图可知,从DMIC采集获得PDM数据,再通过一些列滤波器处理后,最终获得的PCM数据的频率是下降的。它们之间的关系以下:
PCM采样频率= DMIC采样时钟频率 /(N * OSR),其中2 FS模式时,N = 2; 1 FS模式,N = 1)

以本文介绍的demo配置为例,DMIC采样时钟频率配置为3.072MHz,DMIC通道配置为2 FS模式(N=2),OSR设置为32,那么能够获得:

PCM采样频率 = DMIC采样时钟频率 / (N * OSR) = 3.072MHz / (2 * 32) = 48KHz

该频率正是本次应用中DMIC外设获得的PCM数据的采样频率。

1.4 FIFO和DMA支持

DMIC FIFO中PCM数据的有效宽度能够是16位或24位,DMIC提供了两种访问FIFO数据的方式:CPU或DMA直接访问。经过配置FIFO的触发级别,选择中断或DMA的方式,就能够将PCM数据从FIFO复制到SRAM。下图显示了经过DMA复制DMIC FIFO数据的过程。

avatar

2、应用

2.1 系统架构

在此应用中,8通道DMIC音频数据采集的整个架构如图所示。HiFi4控制8通道DMIC接口从DMIC音频板接收PDM数据,CS42888编解码器经过I2S接口接收HIFI4处理事后的PCM数据,并将其传输到扬声器进行实时播放。

2.2 CS42888 Codec介绍

CS42888是高度集成的24位音频编解码器,包含具有delta-sigma技术的4个模数转换器(ADC)和8个数模转换器(DAC),8个DAC通道均提供数字音量控制,并可使用差分或单端输出进行操做。 CS42888的DAC串行端口支持I2S TDM音频数字接口格式,位深度从16到24不等,并容许时分复用(TDM)接口格式的DAC通道多达8个。CS42888支持的TDM时序图如图7所示。

avatar

在DAC_LRCK上升沿以后的第二个DAC_SCLK上升沿,首先接收TDM数据的最高有效位(MSB)。 全部数据在DAC_SCLK的上升沿有效,在DAC_SCLK的降低沿发送。从图中能够注意到, CS42888在TDM模式下要求每一通道的PCM数据占32个时钟周期,也就是32bit的位宽,而且DAC_SCLK必须是PCM数据采样频率的8倍。所以在配置I2S的时候须要听从这几个注意事项。

2.3 DMIC配置

DMIC的采样频率与1.3小节中的举例一致,并为了获得48kHz的PCM采样频率,须要进行以下配置:

  • DMIC时钟源:audio_pll_clk
  • DMIC外围输入时钟:24.576MHz
  • DMIC时钟分频器:8
  • DMIC时钟频率:3.072MHz
  • OSR寄存器:32
  • FS模式:2FS
  • DMIC采样位宽:16bit

所以,DMIC PCM采样率 = DMIC采样时钟频率 / (N * OSR) = 3.072MHz / 2 / 32 = 48kHz

如下代码给出了每一路DMIC通道的具体配置:

/* dmic channel configurations */
static dmic_channel_config_t s_dmicChannelConfig = {
    .divhfclk            = kDMIC_PdmDiv1,
    .osr                 = 32U,
    .gainshft            = 3U,
    .preac2coef          = kDMIC_CompValueZero,
    .preac4coef          = kDMIC_CompValueZero,
    .dc_cut_level        = kDMIC_DcCut155,
    .post_dc_gain_reduce = 1U,
    .saturate16bit       = 1U,
    .sample_rate         = kDMIC_PhyFullSpeed,
    .enableSignExtend    = false,
};

2.4 Flexcomm配置

i.MXRT600上最多提供8个多功能Flexcomm接口。 在此应用程序中,Flexcomm2被配置为I2C接口。CS42888提供了标准的I2C控制接口,并支持全部功能的软件配置。所以,HiFi4利用I2C对CS42888进行初始化,配置为TDM工做模式。CS42888做为I2C从设备,读写命令的操做时序如图所示。

avatar

Flexcomm4接口在本应用中配置为I2S接口,用于传输DMIC采集的8通道PCM数据。DMIC采集的PCM数据的采样频率为48kHz,I2S采样频率需保持一致。下面是I2S采样频率的配置参数:

  • I2S时钟源:audio_pll_clk
  • I2S时钟源频率:24.576MHz
  • MCLK频率:12.288MHz

  • I2S传输模式:TDM
  • I2S声道数:8
  • I2S声道位宽:32bit
  • I2S BCLK = WS * 声道数 * 声道位宽 = 48KHz * 8 * 32 = 12.288MHz
  • I2S_DIV (I2S分频系数) = audio_pll_clk / BCLK = 24.576MHz / 12.288MHz = 2

2.5 DMA和中断配置

在RT600上作音频数据的处理推荐用DMA,从而减小对CPU资源的消耗。DMA在RT600上推荐的用法是CM33核使用DMA0,而HiFi4使用DMA1。此外,在HiFi4中使用DMA与在CM33端是有必定区别的,这个主要体如今如下几点:

  • 须要在XOS或XTOS中注册并启用HiFi4中断。
  • 在HiFi4中DMA操做的SRAM地址必须是non-cacheable。
  • 须要由使用INPUTMUX注册HiFi4中断。

这些注册的中断与HiFi4的链接关系以下表所示。表中除了提供所需的中断选择以外,还显示了各个中断的中断优先级。L1中断的优先级最低,而L3中断的优先级最高。

如下代码给出了HiFi4 DMA和中断的具体配置:

#define XCHAL_EXTINT19_NUM      23  /* (intlevel 2) */
DMA_Init(DMA1);
/* XCHAL_EXTINT19_NUM, intlevel 2 */
INPUTMUX_AttachSignal(INPUTMUX, 18U, kINPUTMUX_Dmac1ToDspInterrupt); 
xos_register_interrupt_handler(XCHAL_EXTINT19_NUM,
                       (XosIntFunc *) DMA_IRQHandle, 
                     DMA1);
xos_interrupt_enable(XCHAL_EXTINT19_NUM);

2.6 音频数据流的处理

为了可以将8通道DMIC采集的音频数据发送到CS42888音频板并播放,根据CS42888数据手册,咱们须要将CS42888配置成TDM模式。在TDM模式下,CS42888接收的PCM数据位宽必须是32bit,其有效数据范围能够是16位到24位。为此,本应用中咱们须要软件程序将DMIC采集到的16bit位宽的PCM数据处理为32bit位宽,下面咱们就介绍该方法。

首先,DMIC采集到的每一通道的PCM数据都利用了ping-pang buffer的形式放在对应的缓冲区,而RT600的DMA支持了最多4通道DMIC的数据搬移。所以,采用DMA memory to memory的功能,咱们能够把DMIC的4通道PCM数据搬到一个固定的缓冲区(假设为BUFFER1),可是这个BUFFER1中4通道的PCM数据是有固定间隔的,间隔的大小为48bit。有的小伙伴或许这里有疑惑了,为何间隔的大小是48bit,而不是32或16bit呢?咱们接下来慢慢分析。

正是因为DMIC和DMA外设的限制,致使DMA一次只能搬运4通道16bit的PCM数据,假如BUFFER0没有被操做的内存地址已经初始化为0x00,那么咱们就能够把那些内存地址上为0x00的地址与PCM数据拼凑成32bit的PCM数据,PCM数据的有效位依旧是16bit,知足CS42888的要求。PCM数据间隔大小为48bit是针对16bit的PCM数据,那针对于32bit的PCM数据来讲,这4通道的PCM数据在BUFFER1上的间隔就是32Bbit。

看到这里相信读者已经明白了8通道的PCM数据该怎么处理了,没错,只须要另外再开启1路DMA,仍是采用DMA memory to memory的功能,就能够将另外DMIC的4通道PCM数据搬移到BUFFER1内存空间上那些间隔出来的32bit位宽的地址上。

整个DMIC采集的8通道PCM数据后续软件过程以下图所示。

接下来,HiFi4控制一路I2S将处理成TDM格式的PCM数据传输到CS42888编解码器。为了可以流畅地播放音频流数据,与RT600之I2S外设介绍及应用中介绍的处理方法同样,笔者采用了以下图所示的方法。图中,总共3个缓冲区用于处理PCM数据,这3个缓冲区构成一个闭环。每一个缓冲区为1024字节,包含32帧PCM数据,每一帧包含8包32bit的PCM数据。 每当一个缓冲区中的PCM数据接收满时,下一个缓冲区将当即开始接收,发送也同理。由于本次应用中须要处理的PCM数据有8路,数据量比较大,所以采用ring buffer的机制可以保证数据传输的稳定和可靠。

3、RT600 硬件演示平台搭建

8通道DMIC音频数据采集demo基于i.MX RT600 EVK RevE板子实现,整个硬件平台包括3部分:DMIC音频采集板,CS42888音频板和i.MX RT600 EVK板,以下图所示。

为了演示该demo,须要注意如下几点:

  1. DMIC音频采集板与RT600 EVK板的J31链接。

  2. CS42888音频板与RT600 EVK板进行链接,链接状况如表所示:

    CS42888 audio board RT600 EVK board
    A4 PIN J26 PIN1 (GND)
    A5 PIN J27 PIN3 (BCLK)
    A6 PIN J27 PIN2 (WS)
    A8 PIN J27 PIN1 (TX)
    A9 PIN J29 PIN4 (3V3)
    A11 PIN J28 PIN1 (RESET)
    A13 PIN J29 PIN8 (5V)
    A16 PIN JS2 PIN1 (1V8)
    B5 PIN J28 PIN10 (SCL)
    B6 PIN J28 PIN9 (SDA)
    B12 PIN J27 PIN6 (MCLK)
  3. 音频扬声器插入CS42888音频板的J11,J12,J13,J14,J15和J16端口。

  4. 对RT600 EVK板进行改动:

    • 去掉R379-A,R380-A,R384-A,R389-A,R390-A,R391-A,R392-A,R393-A这些电阻。
    • 用0欧姆电阻焊接R379-B,R380-B,R384-B,R389-B,R390-B,R391-B,R392-B,R393-B这些位置。

avatar

至此,RT600之DMIC外设介绍完毕。

相关文章
相关标签/搜索