查看: 4484|回复: 4

[原创] 【LPC54114双核任务三】音频DMA传输播放

[复制链接]
  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
    发表于 2017-7-9 00:10:00 | 显示全部楼层 |阅读模式
    这段时间一直忙考试,今天得空来试试音频操作,使用官方的SDK并参考万利的demo进行更改。
    通过电位器调节音量
    手机作为音频输入源
    小音箱作为音频输出
    板卡作为中转,DMA传输

    数字麦克风,顾名思义,就是将传统模拟音频信号转换为数字信号进行处理和传输。
    dmic初始化:
    1. /* PDM interface */
    2.         IOCON_PinMuxSet(IOCON, 1, 15, IOCON_FUNC1 | IOCON_DIGITAL_EN);  /* PDM CLK  0 */
    3.         IOCON_PinMuxSet(IOCON, 1, 16, IOCON_FUNC1 | IOCON_DIGITAL_EN);  /* PDM DATA 0 */
    4.        
    5.         /* DMIC uses 12MHz FRO clock */
    6.   CLOCK_AttachClk(kFRO12M_to_DMIC);
    7.         /*12MHz divided by 15 = 800KHz PDM clock */
    8.         CLOCK_SetClkDiv(kCLOCK_DivDmicClk, 14, false);
    9.         dmic_channel_cfg.divhfclk = kDMIC_PdmDiv1;
    10.         dmic_channel_cfg.osr = 25U;
    11.         dmic_channel_cfg.gainshft = 3U;
    12.         dmic_channel_cfg.preac2coef = kDMIC_CompValueZero;
    13.         dmic_channel_cfg.preac4coef = kDMIC_CompValueZero;
    14.         dmic_channel_cfg.dc_cut_level = kDMIC_DcCut155;
    15.         dmic_channel_cfg.post_dc_gain_reduce = 0U;
    16.         dmic_channel_cfg.saturate16bit = 1U;
    17.         dmic_channel_cfg.sample_rate = kDMIC_PhyFullSpeed;
    18.         DMIC_Init(DMIC0);
    19.        
    20.         DMIC_ConfigIO(DMIC0, kDMIC_PdmStereo);
    21.         DMIC_Use2fs(DMIC0, true);
    22.         DMIC_SetOperationMode(DMIC0, kDMIC_OperationModeInterrupt);
    23.         DMIC_ConfigChannel(DMIC0, kDMIC_Channel0, kDMIC_Left, &dmic_channel_cfg);
    24.         DMIC_ConfigChannel(DMIC0, kDMIC_Channel1, kDMIC_Right, &dmic_channel_cfg);
    25.         DMIC_FifoChannel(DMIC0, kDMIC_Channel0, FIFO_DEPTH, true, true);
    26.         DMIC_FifoChannel(DMIC0, kDMIC_Channel1, FIFO_DEPTH, true, true);
    27.        
    28.         /*Gain of the noise estimator */
    29.         DMIC_SetGainNoiseEstHwvad(DMIC0, 0x02U);
    30.         /*Gain of the signal estimator */
    31.         DMIC_SetGainSignalEstHwvad(DMIC0, 0x01U);
    32.         /* 00 = first filter by-pass, 01 = hpf_shifter=1, 10 = hpf_shifter=4 */
    33.         DMIC_SetFilterCtrlHwvad(DMIC0, 0x01U);
    34.         /*input right-shift of (GAIN x 2 -10) bits (from -10bits (0000) to +14bits (1100)) */
    35.         DMIC_SetInputGainHwvad(DMIC0, 0x04U);
    36.         DisableDeepSleepIRQ(HWVAD0_IRQn);
    37.         DMIC_HwvadEnableIntCallback(DMIC0, DMIC0_HWVAD_Callback);
    38.         DMIC_EnableChannnel(DMIC0, (DMIC_CHANEN_EN_CH0(1) | DMIC_CHANEN_EN_CH1(1)));
    39.         /* reset hwvad internal interrupt */
    40.         DMIC_CtrlClrIntrHwvad(DMIC0, true);
    41.         /* To clear first spurious interrupt */
    42.         for (i = 0; i < 0xFFFFU; i++)
    43.         {
    44.         }
    45.         /*HWVAD Normal operation */
    46.         DMIC_CtrlClrIntrHwvad(DMIC0, false);
    47.         NVIC_ClearPendingIRQ(HWVAD0_IRQn);
    48.         EnableDeepSleepIRQ(HWVAD0_IRQn);
    复制代码

    I2S(Inter—IC Sound)总线, 又称 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用於音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。

    I2S初始化:
    1.         /* Initialize PLL clock */
    2.         CLOCK_AttachClk(kFRO12M_to_SYS_PLL);
    3.         CLOCK_SetPLLFreq(&pllSetup);

    4.         CLOCK_AttachClk(kSYS_PLL_to_FLEXCOMM6);
    5.         CLOCK_AttachClk(kSYS_PLL_to_FLEXCOMM7);
    6.         /* Attach PLL clock to MCLK for I2S, no divider */
    7.         CLOCK_AttachClk(kSYS_PLL_to_MCLK);
    8.         SYSCON->MCLKDIV = SYSCON_MCLKDIV_DIV(0U);
    9.         /* reset FLEXCOMM for I2S */
    10.         RESET_PeripheralReset(kFC6_RST_SHIFT_RSTn);
    11.         RESET_PeripheralReset(kFC7_RST_SHIFT_RSTn);
    12.        
    13.         /* I2S */
    14. // Flexcomm 6 I2S Rx
    15.         IOCON_PinMuxSet(IOCON, 0, 5, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* Flexcomm 6 / SDA */
    16.         IOCON_PinMuxSet(IOCON, 0, 6, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* Flexcomm 6 / WS */
    17.         IOCON_PinMuxSet(IOCON, 0, 7, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* Flexcomm 6 / SCK */
    18. // Flexcomm 7 I2S Tx
    19.         IOCON_PinMuxSet(IOCON, 1, 12, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / SCK */
    20.         IOCON_PinMuxSet(IOCON, 1, 13, IOCON_FUNC4 | IOCON_DIGITAL_EN);  /* Flexcomm 7 / SDA */
    21.         IOCON_PinMuxSet(IOCON, 1, 14, IOCON_FUNC4 | IOCON_DIGITAL_EN);  /* Flexcomm 7 / WS */

    22.         /* MCLK output for I2S */
    23.         IOCON_PinMuxSet(IOCON, 1, 17, IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGITAL_EN);
    24.         SYSCON->MCLKIO = 1U;
    25.         /*
    26.          * enableMaster = true;
    27.          * baudRate_Bps = 100000U;
    28.          * enableTimeout = false;
    29.          */
    30.         WM8904_GetDefaultConfig(&codecConfig);
    31.         codecHandle.i2c = I2C4;
    32.         if (WM8904_Init(&codecHandle, &codecConfig) != kStatus_Success)
    33.         {
    34.                 PRINTF("WM8904_Init failed!\r\n");
    35.                 led_off(7);
    36.         }
    37.         else
    38.         {
    39.                 led_on(7);
    40.         }
    41.         /* Initial volume kept low for hearing safety. */
    42.         /* Adjust it to your needs, 0x0006 for -51 dB, 0x0039 for 0 dB etc. */
    43.         WM8904_SetVolume(&codecHandle, 0x0039, 0x0039);
    44.        
    45.         I2S_TxGetDefaultConfig(&s_TxConfig);
    46.         s_TxConfig.divider = CLOCK_GetPllOutFreq() / 48000U / 16U / 2U;       
    47.         I2S_RxGetDefaultConfig(&s_RxConfig);
    48.        
    49.         I2S_TxInit(I2S_TX, &s_TxConfig);
    50.         I2S_RxInit(I2S_RX, &s_RxConfig);
    51.        
    52.         DMA_Init(DMA0);

    53.         DMA_EnableChannel(DMA0, I2S_DMA_TX);
    54.         DMA_EnableChannel(DMA0, I2S_DMA_RX);
    55.         DMA_SetChannelPriority(DMA0, I2S_DMA_TX, kDMA_ChannelPriority3);
    56.         DMA_SetChannelPriority(DMA0, I2S_DMA_RX, kDMA_ChannelPriority2);
    57.         DMA_CreateHandle(&s_DmaTxHandle, DMA0, I2S_DMA_TX);
    58.         DMA_CreateHandle(&s_DmaRxHandle, DMA0, I2S_DMA_RX);

    59.         StartSoundPlayback();       //选用文件的正弦波音频输出
    60.         //StartDigitalLoopback();    //选用音频输入源输出
    复制代码
    代码移植时注意引脚配置

    最后附上视频和代码:
    123.part1.rar (20 MB, 下载次数: 56)
    签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-7-9 08:22:53 | 显示全部楼层
    StartDigitalLoopback(),没有声音,CN8 外接麦克 怎么没有声音,楼主试了么?s_Buffer 是有数据变化,接收和发送的回调都能进去,

    一样的代码StartSoundPlayback();是额可以播放正弦波的

    不知道哪里出了问题
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-11-15 10:33
  • 签到天数: 79 天

    [LV.6]常住居民II

    89

    主题

    2169

    帖子

    3

    金牌会员

    Rank: 6Rank: 6

    积分
    1779
    最后登录
    2020-8-22
     楼主| 发表于 2017-7-9 10:09:18 | 显示全部楼层
    NXP+LPC+FSL 发表于 2017-7-9 08:22
    StartDigitalLoopback(),没有声音,CN8 外接麦克 怎么没有声音,楼主试了么?s_Buffer 是有数据变化,接收 ...

    看下引脚配置 没有麦克用手触摸也是有声音的
    签到
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5383
    最后登录
    2021-12-22
    发表于 2017-7-9 10:33:03 | 显示全部楼层
    本帖最后由 okwh 于 2017-7-9 12:06 编辑

    •         StartSoundPlayback();       //选用文件的正弦波音频输出
    •         //StartDigitalLoopback();    //选用音频输入源输出

    楼主 能成功这个吗?  StartDigitalLoopback();    //选用音频输入源输出


    我的:
    StartSoundPlayback();  成功,   
    StartDigitalLoopback()  失败
    DMIC、话筒录、耳机喇叭直接放, 我也没成功,不明所以....

    楼主发的lpc54110_package.zip 是万利原始的,不是楼主修改后的,

    能共享您修改后的让学习学习吗??
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-7-12 20:45
  • 签到天数: 75 天

    [LV.6]常住居民II

    7

    主题

    213

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    441
    最后登录
    2018-10-25
    发表于 2017-7-9 11:21:47 | 显示全部楼层
    何昌昕 发表于 2017-7-9 10:09
    看下引脚配置 没有麦克用手触摸也是有声音的

    引脚配置 对的啊StartSoundPlayback();  都可以的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-28 18:43 , Processed in 0.113836 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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