查看: 6718|回复: 3

[原创] 【LPC54114双核任务三】+ LPC54114音频学习

[复制链接]
  • TA的每日心情
    慵懒
    2019-11-22 09:55
  • 签到天数: 179 天

    连续签到: 1 天

    [LV.7]常住居民III

    12

    主题

    1122

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1377
    最后登录
    2019-11-22
    发表于 2017-7-31 20:33:58 | 显示全部楼层 |阅读模式
    本帖最后由 队长shiwo 于 2017-7-31 20:33 编辑

           LPC54114 开发板上与音频部分相关的模块有:PDM 数字麦克风(SPH0641LM4H)--->板子上的U7 和 I2S 音频接口(WM8904)--->板子上的CN7(音频输出) 和 CN8(音频输入)。
    SPH0641LM4H主要特点 :
    1、灵敏度范围:-26+/-1DBdB
    2、卓越的可靠性及稳定性,100%工厂测试
    3. 卓越的信噪比:59dB
    4、低功耗,超小体积
    5、表面贴装技术
    6、优良的温度系数:Max±0.60 dB/℃
    7、优良的抗压系数:Max±0.55 dB/Kpa
    8、专利新型硅技术,典型应用于手机、数字及模拟录音机、数码相机、便携式游戏控制器、火警报警设备、噪声控制器、汽车电子等。
    WM8904主要特点:
    1、高信噪比的64分贝
    2、
    235 uA的低电流消耗的低功耗模式
    3、多性能模式(睡眠、低功耗、标准性能和超声波模式)
    4、平直的频率响应
    5、射频屏蔽
    6、零高度Mic
    7、支持双多路复用通道
    8、标准SMD回流
    9、超声波支持
    10、敏感性匹配
    11、体积小


    板子上原理图连接:
    4444.png 3333.png 2222.png

            LPC5411x系列包含了一个无晶振全速USB接口,一个DMIC(数字麦克风)子系统连接两个PDM麦克风和两个IIS接口,DMIC接口用来连接数字PDM麦克风和转换在硬件上的PDM音频数据流成16位PCM音频数据,PDM麦克风操作只需要两种信号线(时钟和数据),而IIS需要三种(时钟、数据和声道选择)。

    左边是麦克风接口,右边是两路输出
    1111.png
    5555.png


    LPC54114的通过IIS总线的DMA0发送音频数据到WM8904,然后通过CN7播放音频数据
    使用万利的Demo程序来测试下:
    1、dmic_init()是PDM 数字麦克风(SPH0641LM4H)的初始化函数, 并通过中断函数来控制LD8来指示外部声音对它的影响
    1. uint8_t dmic_init(void)
    2. {       
    3.         uint8_t ret = 0;
    4.         uint32_t i = 0;
    5.         dmic_channel_config_t dmic_channel_cfg;
    6.        
    7.         /* PDM interface */
    8.         IOCON_PinMuxSet(IOCON, 1, 15, IOCON_FUNC1 | IOCON_DIGITAL_EN);  /* PDM CLK  0 */
    9.         IOCON_PinMuxSet(IOCON, 1, 16, IOCON_FUNC1 | IOCON_DIGITAL_EN);  /* PDM DATA 0 */
    10.        
    11.         /* DMIC uses 12MHz FRO clock */
    12.   CLOCK_AttachClk(kFRO12M_to_DMIC);
    13.         /*12MHz divided by 15 = 800KHz PDM clock */
    14.         CLOCK_SetClkDiv(kCLOCK_DivDmicClk, 14, false);
    15.         dmic_channel_cfg.divhfclk = kDMIC_PdmDiv1;
    16.         dmic_channel_cfg.osr = 25U;
    17.         dmic_channel_cfg.gainshft = 3U;
    18.         dmic_channel_cfg.preac2coef = kDMIC_CompValueZero;
    19.         dmic_channel_cfg.preac4coef = kDMIC_CompValueZero;
    20.         dmic_channel_cfg.dc_cut_level = kDMIC_DcCut155;
    21.         dmic_channel_cfg.post_dc_gain_reduce = 0U;
    22.         dmic_channel_cfg.saturate16bit = 1U;
    23.         dmic_channel_cfg.sample_rate = kDMIC_PhyFullSpeed;
    24.         DMIC_Init(DMIC0);
    25.        
    26.         DMIC_ConfigIO(DMIC0, kDMIC_PdmStereo);
    27.         DMIC_Use2fs(DMIC0, true);
    28.         DMIC_SetOperationMode(DMIC0, kDMIC_OperationModeInterrupt);
    29.         DMIC_ConfigChannel(DMIC0, kDMIC_Channel0, kDMIC_Left, &dmic_channel_cfg);
    30.         DMIC_ConfigChannel(DMIC0, kDMIC_Channel1, kDMIC_Right, &dmic_channel_cfg);
    31.         DMIC_FifoChannel(DMIC0, kDMIC_Channel0, FIFO_DEPTH, true, true);
    32.         DMIC_FifoChannel(DMIC0, kDMIC_Channel1, FIFO_DEPTH, true, true);
    33.        
    34.         /*Gain of the noise estimator */
    35.         DMIC_SetGainNoiseEstHwvad(DMIC0, 0x02U);
    36.         /*Gain of the signal estimator */
    37.         DMIC_SetGainSignalEstHwvad(DMIC0, 0x01U);
    38.         /* 00 = first filter by-pass, 01 = hpf_shifter=1, 10 = hpf_shifter=4 */
    39.         DMIC_SetFilterCtrlHwvad(DMIC0, 0x01U);
    40.         /*input right-shift of (GAIN x 2 -10) bits (from -10bits (0000) to +14bits (1100)) */
    41.         DMIC_SetInputGainHwvad(DMIC0, 0x04U);
    42.         DisableDeepSleepIRQ(HWVAD0_IRQn);
    43.         DMIC_HwvadEnableIntCallback(DMIC0, DMIC0_HWVAD_Callback);
    44.         DMIC_EnableChannnel(DMIC0, (DMIC_CHANEN_EN_CH0(1) | DMIC_CHANEN_EN_CH1(1)));
    45.         /* reset hwvad internal interrupt */
    46.         DMIC_CtrlClrIntrHwvad(DMIC0, true);
    47.         /* To clear first spurious interrupt */
    48.         for (i = 0; i < 0xFFFFU; i++)
    49.         {
    50.         }
    51.         /*HWVAD Normal operation */
    52.         DMIC_CtrlClrIntrHwvad(DMIC0, false);
    53.         NVIC_ClearPendingIRQ(HWVAD0_IRQn);
    54.         EnableDeepSleepIRQ(HWVAD0_IRQn);

    55.         ret = 1;
    56.        
    57.         return ret;
    58. }
    复制代码

    2、wm8904_i2s_init() 是I2S 音频输入/输出接口(WM8904)的初始化函数,并以LD4来指示WM8904的存在。通过对StartSoundPlayback()函数的调用,可播放存储在music.h中的音频数据
    1. uint8_t wm8904_i2s_init(void)
    2. {
    3. // we need initial i2c here, but we initial the right i2c at pct2075 already
    4.        
    5.         /* Initialize PLL clock */
    6.         CLOCK_AttachClk(kFRO12M_to_SYS_PLL);
    7.         CLOCK_SetPLLFreq(&pllSetup);

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

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

    58.         DMA_EnableChannel(DMA0, I2S_DMA_TX);
    59.         DMA_EnableChannel(DMA0, I2S_DMA_RX);
    60.         DMA_SetChannelPriority(DMA0, I2S_DMA_TX, kDMA_ChannelPriority3);
    61.         DMA_SetChannelPriority(DMA0, I2S_DMA_RX, kDMA_ChannelPriority2);
    62.         DMA_CreateHandle(&s_DmaTxHandle, DMA0, I2S_DMA_TX);
    63.         DMA_CreateHandle(&s_DmaRxHandle, DMA0, I2S_DMA_RX);

    64.         if (true)
    65.         {
    66.                 StartSoundPlayback();
    67.         }
    68.         else
    69.         {
    70.                 StartDigitalLoopback();
    71.         }
    72. }
    复制代码
    3、在函数StartSoundPlayback中创建DMA,并发送两次音频数据
    1. static void StartSoundPlayback(void)
    2. {
    3.     PRINTF("Setup looping playback of sine wave\r\n");

    4.     s_TxTransfer.data = &g_Music[0];
    5.     s_TxTransfer.dataSize = sizeof(g_Music);

    6.     I2S_TxTransferCreateHandleDMA(I2S_TX, &s_TxHandle, &s_DmaTxHandle, TxCallback, (void *)&s_TxTransfer);//创建DMA
    7.     I2S_TxTransferSendDMA(I2S_TX, &s_TxHandle, s_TxTransfer);
    8.     I2S_TxTransferSendDMA(I2S_TX, &s_TxHandle, s_TxTransfer); /* TODO needed to queue twice due to current state of driver */
    9. }
    复制代码
    1. /*!
    2. * @brief One period of sine wave in 108 32-bit samples.
    3. * One sample contains two 16-bit channels.
    4. */
    5. __ALIGN_BEGIN uint8_t g_Music[] __ALIGN_END = {
    6.     0x00U, 0x00U, 0x00U, 0x00U, 0x71U, 0x07U, 0x71U, 0x07U, 0xDCU, 0x0EU, 0xDCU, 0x0EU, 0x39U, 0x16U, 0x39U, 0x16U,
    7.     0x84U, 0x1DU, 0x84U, 0x1DU, 0xB5U, 0x24U, 0xB5U, 0x24U, 0xC6U, 0x2BU, 0xC6U, 0x2BU, 0xB2U, 0x32U, 0xB2U, 0x32U,
    8.     0x71U, 0x39U, 0x71U, 0x39U, 0xFFU, 0x3FU, 0xFFU, 0x3FU, 0x55U, 0x46U, 0x55U, 0x46U, 0x6FU, 0x4CU, 0x6FU, 0x4CU,
    9.     0x46U, 0x52U, 0x46U, 0x52U, 0xD6U, 0x57U, 0xD6U, 0x57U, 0x19U, 0x5DU, 0x19U, 0x5DU, 0x0CU, 0x62U, 0x0CU, 0x62U,
    10.     0xABU, 0x66U, 0xABU, 0x66U, 0xF0U, 0x6AU, 0xF0U, 0x6AU, 0xD9U, 0x6EU, 0xD9U, 0x6EU, 0x61U, 0x72U, 0x61U, 0x72U,
    11.     0x87U, 0x75U, 0x87U, 0x75U, 0x46U, 0x78U, 0x46U, 0x78U, 0x9EU, 0x7AU, 0x9EU, 0x7AU, 0x8BU, 0x7CU, 0x8BU, 0x7CU,
    12.     0x0DU, 0x7EU, 0x0DU, 0x7EU, 0x21U, 0x7FU, 0x21U, 0x7FU, 0xC7U, 0x7FU, 0xC7U, 0x7FU, 0xFEU, 0x7FU, 0xFEU, 0x7FU,
    13.     0xC7U, 0x7FU, 0xC7U, 0x7FU, 0x21U, 0x7FU, 0x21U, 0x7FU, 0x0DU, 0x7EU, 0x0DU, 0x7EU, 0x8BU, 0x7CU, 0x8BU, 0x7CU,
    14.     0x9EU, 0x7AU, 0x9EU, 0x7AU, 0x46U, 0x78U, 0x46U, 0x78U, 0x87U, 0x75U, 0x87U, 0x75U, 0x61U, 0x72U, 0x61U, 0x72U,
    15.     0xD9U, 0x6EU, 0xD9U, 0x6EU, 0xF0U, 0x6AU, 0xF0U, 0x6AU, 0xABU, 0x66U, 0xABU, 0x66U, 0x0CU, 0x62U, 0x0CU, 0x62U,
    16.     0x19U, 0x5DU, 0x19U, 0x5DU, 0xD6U, 0x57U, 0xD6U, 0x57U, 0x46U, 0x52U, 0x46U, 0x52U, 0x6FU, 0x4CU, 0x6FU, 0x4CU,
    17.     0x55U, 0x46U, 0x55U, 0x46U, 0xFFU, 0x3FU, 0xFFU, 0x3FU, 0x71U, 0x39U, 0x71U, 0x39U, 0xB2U, 0x32U, 0xB2U, 0x32U,
    18.     0xC6U, 0x2BU, 0xC6U, 0x2BU, 0xB5U, 0x24U, 0xB5U, 0x24U, 0x84U, 0x1DU, 0x84U, 0x1DU, 0x39U, 0x16U, 0x39U, 0x16U,
    19.     0xDCU, 0x0EU, 0xDCU, 0x0EU, 0x71U, 0x07U, 0x71U, 0x07U, 0x00U, 0x00U, 0x00U, 0x00U, 0x8FU, 0xF8U, 0x8FU, 0xF8U,
    20.     0x24U, 0xF1U, 0x24U, 0xF1U, 0xC7U, 0xE9U, 0xC7U, 0xE9U, 0x7CU, 0xE2U, 0x7CU, 0xE2U, 0x4BU, 0xDBU, 0x4BU, 0xDBU,
    21.     0x3AU, 0xD4U, 0x3AU, 0xD4U, 0x4EU, 0xCDU, 0x4EU, 0xCDU, 0x8FU, 0xC6U, 0x8FU, 0xC6U, 0x01U, 0xC0U, 0x01U, 0xC0U,
    22.     0xABU, 0xB9U, 0xABU, 0xB9U, 0x91U, 0xB3U, 0x91U, 0xB3U, 0xBAU, 0xADU, 0xBAU, 0xADU, 0x2AU, 0xA8U, 0x2AU, 0xA8U,
    23.     0xE7U, 0xA2U, 0xE7U, 0xA2U, 0xF4U, 0x9DU, 0xF4U, 0x9DU, 0x55U, 0x99U, 0x55U, 0x99U, 0x10U, 0x95U, 0x10U, 0x95U,
    24.     0x27U, 0x91U, 0x27U, 0x91U, 0x9FU, 0x8DU, 0x9FU, 0x8DU, 0x79U, 0x8AU, 0x79U, 0x8AU, 0xBAU, 0x87U, 0xBAU, 0x87U,
    25.     0x62U, 0x85U, 0x62U, 0x85U, 0x75U, 0x83U, 0x75U, 0x83U, 0xF3U, 0x81U, 0xF3U, 0x81U, 0xDFU, 0x80U, 0xDFU, 0x80U,
    26.     0x39U, 0x80U, 0x39U, 0x80U, 0x02U, 0x80U, 0x02U, 0x80U, 0x39U, 0x80U, 0x39U, 0x80U, 0xDFU, 0x80U, 0xDFU, 0x80U,
    27.     0xF3U, 0x81U, 0xF3U, 0x81U, 0x75U, 0x83U, 0x75U, 0x83U, 0x62U, 0x85U, 0x62U, 0x85U, 0xBAU, 0x87U, 0xBAU, 0x87U,
    28.     0x79U, 0x8AU, 0x79U, 0x8AU, 0x9FU, 0x8DU, 0x9FU, 0x8DU, 0x27U, 0x91U, 0x27U, 0x91U, 0x10U, 0x95U, 0x10U, 0x95U,
    29.     0x55U, 0x99U, 0x55U, 0x99U, 0xF4U, 0x9DU, 0xF4U, 0x9DU, 0xE7U, 0xA2U, 0xE7U, 0xA2U, 0x2AU, 0xA8U, 0x2AU, 0xA8U,
    30.     0xBAU, 0xADU, 0xBAU, 0xADU, 0x91U, 0xB3U, 0x91U, 0xB3U, 0xABU, 0xB9U, 0xABU, 0xB9U, 0x01U, 0xC0U, 0x01U, 0xC0U,
    31.     0x8FU, 0xC6U, 0x8FU, 0xC6U, 0x4EU, 0xCDU, 0x4EU, 0xCDU, 0x3AU, 0xD4U, 0x3AU, 0xD4U, 0x4BU, 0xDBU, 0x4BU, 0xDBU,
    32.     0x7CU, 0xE2U, 0x7CU, 0xE2U, 0xC7U, 0xE9U, 0xC7U, 0xE9U, 0x24U, 0xF1U, 0x24U, 0xF1U, 0x8FU, 0xF8U, 0x8FU, 0xF8U,
    33. };
    复制代码






    测试只听到有“嗯嗯嗯嗯嗯嗯”的声音,不知道是哪里有问题了,搞不懂。。。


    SPH0641LM4H.pdf (920.21 KB, 下载次数: 4)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5636
    最后登录
    2021-12-22
    发表于 2017-8-1 13:49:39 | 显示全部楼层
    没问题,那个music.h中是单频率数据,就是这声音
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-11-22 09:55
  • 签到天数: 179 天

    连续签到: 1 天

    [LV.7]常住居民III

    12

    主题

    1122

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1377
    最后登录
    2019-11-22
     楼主| 发表于 2017-8-1 20:58:33 | 显示全部楼层
    okwh 发表于 2017-8-1 13:49
    没问题,那个music.h中是单频率数据,就是这声音

    好的,谢谢大神了,我再学习学习
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-9-15 08:42
  • 签到天数: 1952 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    1

    主题

    4686

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9405
    最后登录
    2023-9-15
    发表于 2017-8-1 22:12:56 | 显示全部楼层
    好内容!值得参考!
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-31 06:37 , Processed in 0.099067 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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