查看: 8131|回复: 12

[已解决] lpc54114 SKD DMIC DMA examples疑问

[复制链接]
  • TA的每日心情
    郁闷
    2018-2-7 18:18
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    13

    主题

    126

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1628
    最后登录
    2021-7-13
    发表于 2017-8-7 15:02:06 | 显示全部楼层 |阅读模式
    lpc54114 SKD DMIC DMA examples疑问:
    从DATA sheet 上看 lpc54114 DMIC FIFO数据寄存器是32位的,为什么例子中的数据Buffer定义位16位的呢?
    十分不解!
    */

    #include "fsl_device_registers.h"
    #include "fsl_debug_console.h"
    #include "board.h"
    #include "fsl_dmic.h"
    #include "fsl_dma.h"
    #include "fsl_dmic_dma.h"
    #include <stdlib.h>
    #include <string.h>

    #include "pin_mux.h"
    #include <stdbool.h>
    /*******************************************************************************
    * Definitions
    ******************************************************************************/

    #define DMAREQ_DMIC0 16U
    #define DMAREQ_DMIC1 17U
    #define APP_DMAREQ_CHANNEL DMAREQ_DMIC0
    #define APP_DMIC_CHANNEL kDMIC_Channel0
    #define APP_DMIC_CHANNEL_ENABLE DMIC_CHANEN_EN_CH0(1)
    #define FIFO_DEPTH 15U
    #define BUFFER_LENGTH 32U
    /*******************************************************************************

    * Prototypes
    ******************************************************************************/
    /* DMIC user callback */
    void DMIC_UserCallback(DMIC_Type *base, dmic_dma_handle_t *handle, status_t status, void *userData);

    /*******************************************************************************
    * Variables
    ******************************************************************************/
    uint16_t g_rxBuffer[BUFFER_LENGTH] = {0};

    dmic_dma_handle_t g_dmicDmaHandle;
    dma_handle_t g_dmicRxDmaHandle;
    volatile bool g_Transfer_Done = false;

    /*******************************************************************************
    * Code
    ******************************************************************************/
    /* DMIC user callback */
    void DMIC_UserCallback(DMIC_Type *base, dmic_dma_handle_t *handle, status_t status, void *userData)
    {
        userData = userData;
        if (status == kStatus_DMIC_Idle)
        {
            g_Transfer_Done = true;
        }
    }

    //------------------------------------------------------------------------------
    //    main application
    //------------------------------------------------------------------------------
    int main(void)
    {
        dmic_channel_config_t dmic_channel_cfg;

        dmic_transfer_t receiveXfer;

        uint32_t i;
        /* Board pin, clock, debug console init */
        CLOCK_EnableClock(kCLOCK_InputMux);
        CLOCK_EnableClock(kCLOCK_Gpio0);
        CLOCK_EnableClock(kCLOCK_Gpio1);

        /* USART0 clock */
        CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

        /* DMIC uses 12MHz FRO clock */
        CLOCK_AttachClk(kFRO12M_to_DMIC);

        /*12MHz divided by 5 = 2.4MHz PDM clock --> gives 48kHz sample rate */
        /*12MHz divided by 15 = 800 KHz PDM clock --> gives 16kHz sample rate */
        CLOCK_SetClkDiv(kCLOCK_DivDmicClk, 14, false);

        BOARD_InitPins();
        BOARD_BootClockFROHF48M();
        BOARD_InitDebugConsole();

        dmic_channel_cfg.divhfclk = kDMIC_PdmDiv1;
        dmic_channel_cfg.osr = 25U;
        dmic_channel_cfg.gainshft = 2U;
        dmic_channel_cfg.preac2coef = kDMIC_CompValueZero;
        dmic_channel_cfg.preac4coef = kDMIC_CompValueZero;
        dmic_channel_cfg.dc_cut_level = kDMIC_DcCut155;
        dmic_channel_cfg.post_dc_gain_reduce = 1;
        dmic_channel_cfg.saturate16bit = 1U;
        dmic_channel_cfg.sample_rate = kDMIC_PhyFullSpeed;
        DMIC_Init(DMIC0);

        DMIC_ConfigIO(DMIC0, kDMIC_PdmDual);
        DMIC_Use2fs(DMIC0, true);
        DMIC_SetOperationMode(DMIC0, kDMIC_OperationModeDma);
        DMIC_ConfigChannel(DMIC0, APP_DMIC_CHANNEL, kDMIC_Left, &dmic_channel_cfg);

        DMIC_FifoChannel(DMIC0, APP_DMIC_CHANNEL, FIFO_DEPTH, true, true);

        DMIC_EnableChannnel(DMIC0, APP_DMIC_CHANNEL_ENABLE);
        PRINTF("Configure DMA\r\n");

        DMA_Init(DMA0);

        DMA_EnableChannel(DMA0, APP_DMAREQ_CHANNEL);

        /* Request dma channels from DMA manager. */
        DMA_CreateHandle(&g_dmicRxDmaHandle, DMA0, APP_DMAREQ_CHANNEL);

        /* Create DMIC DMA handle. */
        DMIC_TransferCreateHandleDMA(DMIC0, &g_dmicDmaHandle, DMIC_UserCallback, NULL, &g_dmicRxDmaHandle);
       receiveXfer.dataSize = 2 * BUFFER_LENGTH;
        receiveXfer.data = g_rxBuffer;

        PRINTF("Buffer Data before transfer \r\n");
        for (i = 0; i < BUFFER_LENGTH; i++)
        {
            PRINTF("%d\r\n", g_rxBuffer);
        }
        DMIC_TransferReceiveDMA(DMIC0, &g_dmicDmaHandle, &receiveXfer, APP_DMIC_CHANNEL);

        /* Wait for DMA transfer finish */
        while (g_Transfer_Done == false)
        {
        }

        PRINTF("Transfer completed\r\n");
        PRINTF("Buffer Data after transfer \r\n");
        for (i = 0; i < BUFFER_LENGTH; i++)
        {
            PRINTF("%d\r\n", g_rxBuffer);
        }
        while (1)
        {
        }
    }


    最佳答案

    本帖最后由 okwh 于 2017-8-9 09:55 编辑 pythonworld 发表于 2017-8-8 18:15 感谢回复我的问题! 应该不是这样,每个通道有各自的FIFO数据寄存器,而且数据寄存器是24位的。 ... PDM--24bits--&gtCM--24bits, 但 ...
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-11-30 16:16
  • 签到天数: 206 天

    连续签到: 1 天

    [LV.7]常住居民III

    74

    主题

    2793

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    7879
    最后登录
    2025-4-11
    发表于 2017-8-7 15:24:49 | 显示全部楼层

    回帖奖励 +2 NXP金币

    还真没注意过这个问题
    来根华子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5618
    最后登录
    2021-12-22
    发表于 2017-8-7 20:31:37 | 显示全部楼层

    回帖奖励 +2 NXP金币

    本帖最后由 okwh 于 2017-8-7 20:55 编辑

    大概是:
    FIFO是16个32位,但声音数据实际是16位值,
    DMIC是双声道立体声的,录音数据要左右声道交替传输的,所以数据实际是左右半字交替传输的。 或者说 32位是指左右声道立体声合计32。   
    但这里代码可能只使用了左声道,数据实际是16位的。

    细节和PCM数据如何存、发有关。还和DMIC模块使用的AD有关,通常这里用的AD是那种delt-sigma型的



    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-1-28 20:09
  • 签到天数: 317 天

    连续签到: 1 天

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    9273
    最后登录
    2022-5-12
    发表于 2017-8-8 08:49:09 | 显示全部楼层

    回帖奖励 +2 NXP金币

    应该是酱紫
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2017-8-8 14:27:31 | 显示全部楼层

    回帖奖励 +2 NXP金币

    研究的有深度,666
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2018-2-7 18:18
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    13

    主题

    126

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1628
    最后登录
    2021-7-13
     楼主| 发表于 2017-8-8 18:15:35 | 显示全部楼层
    本帖最后由 pythonworld 于 2017-8-8 18:16 编辑
    okwh 发表于 2017-8-7 20:31
    大概是:
    FIFO是16个32位,但声音数据实际是16位值,
    DMIC是双声道立体声的,录音数据要左右声道交替传输的 ...
    感谢回复我的问题!
    应该不是这样,每个通道有各自的FIFO数据寄存器,而且数据寄存器是24位的。
    1.PNG
    2.PNG
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5618
    最后登录
    2021-12-22
    发表于 2017-8-9 09:54:21 | 显示全部楼层
    本帖最后由 okwh 于 2017-8-9 09:55 编辑
    pythonworld 发表于 2017-8-8 18:15
    感谢回复我的问题!
    应该不是这样,每个通道有各自的FIFO数据寄存器,而且数据寄存器是24位的。 ...

    PDM--24bits-->PCM--24bits, 但是dmic_channel_cfg 会设置 DC Control register的SATURATEAT16BIT为16bit.
    导致最后得到的是16bits.   通常不用24bits
    说明书 table 488

    跟踪检查:
    dmic_channel_cfg.saturate16bit = 1U;
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-12-27 10:15
  • 签到天数: 2475 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    4

    主题

    4486

    帖子

    4

    禁止访问

    积分
    10248
    最后登录
    2024-12-30
    发表于 2017-11-28 12:33:34 | 显示全部楼层

    回帖奖励 +2 NXP金币

    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2019-4-1 22:48
  • 签到天数: 302 天

    连续签到: 1 天

    [LV.8]以坛为家I

    87

    主题

    7322

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    4613
    最后登录
    2021-1-25
    发表于 2017-11-29 10:42:55 | 显示全部楼层

    回帖奖励 +2 NXP金币

    厉害了额
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-8-16 10:32
  • 签到天数: 105 天

    连续签到: 1 天

    [LV.6]常住居民II

    19

    主题

    549

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    1084
    最后登录
    2021-6-22
    发表于 2017-11-29 12:18:19 | 显示全部楼层

    回帖奖励 +2 NXP金币

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 23:26 , Processed in 0.111801 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表