查看: 5719|回复: 17

[原创] 【LPC54114双核任务三】――C2、DMIC-->I2S-->wm8904-->耳机

[复制链接]
  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5383
    最后登录
    2021-12-22
    发表于 2017-7-9 23:55:53 | 显示全部楼层 |阅读模式
    本帖最后由 okwh 于 2018-5-28 10:13 编辑

    【LPC54114双核任务三】――C2、实现DMIC-->I2S-->wm8904-->耳机


       经过多次失败、反复检查后,终于实现DMIC-->I2S-->wm8904-->耳机,实时声音的录放实现!!  这年头,提供源码的人越来越少了啊!!  基于Keil\ARM\Pack\Keil\LPC54000_DFP\2.4.0\LPCOpen\lpc5411x\examples_5411x\periph_i2s_dmic代码修改实现。
      关键: 修改管脚配置,满足万利板的需要。
      主要修改如下:(注释掉的是原来NXP的代码) 参考前文关于NXP板和万利板的不同:【LPC54114双核任务三】――C1、M4通过缓冲控制音频数据播放
      i2s_if.c文件:

    1. i2s_if.c文件:
    2. #define I2S6_FLEXCOMM                          6
    3. #define I2S7_FLEXCOMM                          7

    4. #define I2S_PORT_TX                                LPC_I2S7
    5. #define I2S_TX_ISR                                I2S7_IRQHandler
    6. #define I2S_TX_IRQNUM                        I2S7_IRQn
    7. #define I2S_TX_FLEXCOMM                        I2S7_FLEXCOMM

    8. #define I2S_PORT_RX                                LPC_I2S6
    9. #define I2S_RX_ISR                                I2S6_IRQHandler
    10. #define I2S_RX_IRQNUM                        I2S6_IRQn
    11. #define I2S_RX_FLEXCOMM                        I2S6_FLEXCOMM

    12. /*
    13. #define I2S_PORT_TX                                LPC_I2S6
    14. #define I2S_TX_ISR                                I2S6_IRQHandler
    15. #define I2S_TX_IRQNUM                        I2S6_IRQn
    16. #define I2S_TX_FLEXCOMM                        I2S6_FLEXCOMM

    17. #define I2S_PORT_RX                                LPC_I2S7
    18. #define I2S_RX_ISR                                I2S7_IRQHandler
    19. #define I2S_RX_IRQNUM                        I2S7_IRQn
    20. #define I2S_RX_FLEXCOMM                        I2S7_FLEXCOMM
    21. */

    22. void i2s_pinmux_init(void)
    23. {
    24.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
    25.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5,        i2s_p1);                                                        //        Flexcomm 6 / SDA
    26.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 6,        i2s_p1);                                                        //        Flexcomm 6 / WS
    27.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 7,        i2s_p1);                                                        //        Flexcomm 6 / SCK

    28.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 12,        i2s_p4);                                                        //        Flexcomm 7 / SCK
    29.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 13,         i2s_p4);                                                        //        Flexcomm 7 / SDA
    30.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 14,        i2s_p4);                                                        //        Flexcomm 7 / WS
    31. //        Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 12,        i2s_p4);                                                        //        Flexcomm 7 / SCK
    32. //        Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 7,         i2s_p2);                                                        //        Flexcomm 7 / SDA
    33. //        Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 8,        i2s_p2);                                                        //        Flexcomm 7 / WS
    34.         Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_IOCON);
    35. }
    复制代码
      i2c.if.c文件
    1. void i2c_pinmux_init(void)
    2. {
    3.         Chip_Clock_EnablePeriphClock(SYSCON_CLOCK_IOCON);
    4.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1,  1, IOCON_MODE_PULLUP | IOCON_FUNC5 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);
    5.   Chip_IOCON_PinMuxSet(LPC_IOCON, 1,  2, IOCON_MODE_PULLUP | IOCON_FUNC5 | IOCON_DIGITAL_EN | IOCON_INPFILT_OFF);

    6. //        Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 25, i2c_spd_fast);
    7. //        Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 26, i2c_spd_fast);
    8.         Chip_Clock_DisablePeriphClock(SYSCON_CLOCK_IOCON);
    9. }
    复制代码
      dmic.if.c文件:
    1. static const PINMUX_GRP_T dmic_io[] =
    2. {
    3.         {1, 15, IOCON_FUNC1 | IOCON_DIGITAL_EN},//(IOCON_FUNC1 | IOCON_MODE_INACT  | IOCON_DIGITAL_EN)}, /* PDM CLK */
    4.         {1, 16,  IOCON_FUNC1 | IOCON_DIGITAL_EN},//(IOCON_FUNC1 | IOCON_MODE_INACT  | IOCON_DIGITAL_EN)}, /* PDM DATA */
    5. //        {0, 31, (IOCON_FUNC1 | IOCON_MODE_INACT  | IOCON_DIGITAL_EN)}, /* PDM CLK */
    6. //        {1, 0,  (IOCON_FUNC1 | IOCON_MODE_INACT  | IOCON_DIGITAL_EN)}, /* PDM DATA */
    7. };        
    复制代码


    附件:  periph_i2s_dmic.rar (34.67 KB, 下载次数: 57)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-7-21 17:51
  • 签到天数: 65 天

    [LV.6]常住居民II

    0

    主题

    123

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    448
    最后登录
    2018-8-5
    发表于 2017-7-10 08:55:47 | 显示全部楼层
    IIS 输入可以么
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5383
    最后登录
    2021-12-22
     楼主| 发表于 2017-7-10 11:21:56 | 显示全部楼层
    这个是数字话筒DMIC。
    普通话筒i2s输入尚未成功,继续中.....
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-12-2 17:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    23

    主题

    448

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1135
    最后登录
    2019-12-2
    发表于 2017-7-10 11:55:58 | 显示全部楼层
    楼主实现了 录放功能?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5383
    最后登录
    2021-12-22
     楼主| 发表于 2017-7-10 15:42:45 | 显示全部楼层
    ropepeng 发表于 2017-7-10 11:55
    楼主实现了 录放功能?

    是, 
    折腾了好久才明白。
    DMIC经PDM到缓冲区,然后转都I2s缓冲区,发送到wm8904从耳机喇叭CN7播出
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-12-2 17:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    23

    主题

    448

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1135
    最后登录
    2019-12-2
    发表于 2017-7-11 09:43:14 | 显示全部楼层
    okwh 发表于 2017-7-10 15:42
    是, 
    折腾了好久才明白。
    DMIC经PDM到缓冲区,然后转都I2s缓冲区,发送到wm8904从耳机喇叭CN7播出 ...

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

    使用道具 举报

  • TA的每日心情

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

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    8032
    最后登录
    2022-5-12
    发表于 2017-7-11 10:07:30 | 显示全部楼层
    okwh 发表于 2017-7-10 15:42
    是, 
    折腾了好久才明白。
    DMIC经PDM到缓冲区,然后转都I2s缓冲区,发送到wm8904从耳机喇叭CN7播出 ...

    这个数字麦克的 ,直接把sdk的引脚,还有相应的外设基地址改一下就可以了啊
    好好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.8]以坛为家I

    61

    主题

    1582

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    8032
    最后登录
    2022-5-12
    发表于 2017-7-11 10:08:09 | 显示全部楼层
    等楼主的CN8  外置麦克 成果
    好好
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5383
    最后登录
    2021-12-22
     楼主| 发表于 2017-7-15 10:24:26 | 显示全部楼层
    本帖最后由 okwh 于 2017-7-15 14:45 编辑

    总算明白了, 那个CN8必须用line in 音频线输入, 不能用外置话筒接入!!!!!!!!!
    比如 从计算机喇叭播放口 接线到 CN8, 我 手头没有音频连接线,就用一个坏耳机的线 连接二者,
    StartDigitalLoopback(); 就成功了!!

    开始一直以为要用话筒接 CN8,  还一直疑惑,怎么有了DMIC, 还要话筒干什么? 现在总算明白了,哪个CN8是接Line in的,  若直接插外置话筒驱动不了,所以没声音。

    唉,真小白啊....犯这错误!!!  
    lpc54114\SDK_2.2.1_LPCXpresso54114\boards\lpcxpresso54114\driver_examples\dmic\dmic_codec_direct   StartDigitalLoopback();模式

    试验Lin in -- xxx --Lin out, 各种模式, 使用:
    C:\Keil\ARM\Pack\Keil\LPC54000_DFP\2.4.0\LPCOpen\lpc5411x\examples_5411x\periph_i2s\src

    wm8904_config(CONFIG_ANALOG_BYPASS);
    wm8904_config(CONFIG_DIGITAL_IO);                                                                                        //        initialize WM8904
    wm8904_config(CONFIG_DIGITAL_LOOPBACK);



    Line in --- RX:
            i2s_buff_read();                                                                                                                        //        read the data
            i2s_buff_audio_echo();        


    TX -- Lin out :
    i2s_buff_write();
    i2s_buff_sine_left();        
    i2s_buff_sine_right();
    i2s_buff_sine_mono();
    i2s_buff_sine_phase();

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

    使用道具 举报

    该用户从未签到

    0

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    100
    最后登录
    2018-7-11
    发表于 2018-5-25 10:38:26 | 显示全部楼层
    楼主,我有2块板子(1块NXP的,1块万利的)。SDK中的dmic_i2s_codec,怎么下载到nxp的板子上没有实现实时录放?楼主可否把你的工程发给我一份,NXP或者万利的随意。ruitang@tju.edu.cn
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-28 04:40 , Processed in 0.151616 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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