查看: 4250|回复: 2

[原创] 【LPC54114双核任务三】――C1、M4通过缓冲控制音频数据播放

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

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

    【LPC54114双核任务三】――C1、M4通过缓冲控制音频数据播放  

      前文我使用了SDK2.2.2中的例子(https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=611362),这次我们使用Pack 2.4中LPCOpen3的例子,Keil\ARM\Pack\Keil\LPC54000_DFP\2.4.0\LPCOpen\lpc5411x\examples_5411x\periph_i2s
      当然例子是针对NXP板子的,使用前修改满足我们的需要。
      首先检查下表中NXP和万利板子的主要不同, 无疑,按键、LED不同要在board.c和board_sysinit.c修改对应的管脚,并重新编译lib_board_lpcxpresso_54114.uvprojx库项目。
      其次DMIC、wm用到的管脚也不同,列于下几个表中(供参考)

      
    万利LPC54114
      
    按键
    LED
    LED
    PB1  Reset
    D4
    B[0][30]
    D8
    B[0][22]
    PB2
    B[1][8]
    D5
    B[0][29]
    D9
    B[0][21]
    PB3
    B[1][9]
    D6
    B[0][26]
    D10
    B[0][19]
    PB4
    B[1][10]
    D7
    B[0][25]
    D11
    B[0][15]
    PB5
    B[1][11]


      
    NXP  LPC54114
      
    按键
    LED
    测试点
    B[0][
    B[0][
    B0][
    B0][
    B[1][
    B0][
    B[0][
    B[1][


      
      
    NXP板管脚
    NXP
    万利
    万利
    管脚
    PDM_CLK
    P0_31
    DMIC
    DMIC
    PDM_CLK
    P1_15
    PDM_DATA
    P1_0
    PDM_DATA
    P1_16
    SCL0
    P0_25
    FC4
      
    I2C子地址0x1A
    I2C4地址=0x4C
      
    PCT子地址=0x0
      
    I2C子地址0x1A
    SCL1
    P1_1
    SDA0
    P0_26
    SDA1
    P1_2
    MCLK
    P1_17
    MCLK
    P1_17
    BCLKI
    P1_12
    FC7  RX
    TX   DMA15
    BCLKI
    P1_12
    WSI
    P1_8
    WSI
    P1_14
    DATAI
    P1_13
    FC7  I2S1
    DATAI
    P1_13
    BCLKO
    P0_7
    FC6  TX
    FC6 I2S0
    BCLKO
    P0_7
    WSO
    P0_6
    WSO
    P0_6
    DATAO
    P0_5
    RX DMA12
    DATAO
    P0_5


    NXP板和万利板,wm8904的RX、TX连接的FlexComm是反的,需要修改才有声音(在i2s.c文件开头)。

       periph_i2s.uvprojx项目中,有关管脚设置,要修改对应的i2c_pinmux_init();  i2s_pinmux_init();  这个例子的目的是提供前文所说的四种音频流工作方式以及直接重复播放存储音频数据,可惜百般折腾,目前仍然只有直接重复播放存储音频数据成功。本贴先介绍通过按键控制直接重复播放存储音频数据的方式,使用按键PB2、PB3、LED4、LED5,点击这些键,实现仅左声道、仅左声道、仅左声道、同时双声道、左右声道交替。附视频   观察按键与播放模式的变化。(用耳机才容易判断)
           细节代码见文后附件工程源码。先备份,用brd_xpresso54114.rar替换Keil\ARM\Pack\Keil\LPC54000_DFP\2.4.0\LPCOpen\lpc5411x\brd_xpresso54114
    用periph_i2s.rar替换Keil\ARM\Pack\Keil\LPC54000_DFP\2.4.0\LPCOpen\lpc5411x\examples_5411x\periph_i2s


    主要修改:主程序i2s——demo.c中main中while(1)下增加处理按键的代码
    1. if (!Chip_GPIO_GetPinState(LPC_GPIO,1, 8))
    2.         {
    3.   sc_alt++;  
    4.   if  (sc_alt==4) sc_alt=0;
    5.   Board_LED_Toggle(0);
    6.         }
    7.         if (!Chip_GPIO_GetPinState(LPC_GPIO,1, 9))
    8.         {   
    9.  sc_alt++;
    10.  if  (sc_alt==4)  sc_alt=0;
    11.  Board_LED_Toggle(1);
    12.         }
    复制代码

       通过改变全局变量sc_alt,进而在i2s_if.c文件中的void I2S_TX_ISR(void)判断以切换向i2s发送缓冲区写数据的方法。以实现仅左声道、仅左声道、仅左声道、同时双声道、左右声道交替发声。

    1. void I2S_TX_ISR(void)                                                                                                                        //        I2S transmit interrupt
    2. {
    3.   static i=0;
    4.   Chip_I2S_ErrorHandler(I2S_PORT_TX, &tx_stat);                                                                //        Accumulate TX errors then, clear status
    5.   //        i2s_buff_write();        
    6.   //        transmit data to I2S port
    7.   if (sc_alt==0)  i2s_buff_sine_left();
    8.    else  if         (sc_alt==1)        i2s_buff_sine_right();
    9.     else  if         (sc_alt==2) i2s_buff_sine_mono();        
    10.       else        if         (sc_alt==3)
    11.        {               
    12.         if(i<5000)
    13.           {
    14.              i2s_buff_sine_left();                                                                                                                //        transmit sine wave to the left
    15.              i++;
    16.           }
    17.        else
    18.           {
    19.              i2s_buff_sine_right();                                                                                                                //        transmit sine wave to the right
    20.              i++;
    21.              if(i==10000) i=0;
    22.           }
    23.        }
    24. //        i2s_buff_sine_mono();                                                                                                                //        transmit sine wave to the center
    25. //        i2s_buff_sine_phase();                                                                                                                //        transmit sine wave with phase and level
    26. }
    复制代码

       响应按键改变仅左声道、仅左声道、仅左声道、同时双声道、左右声道交替发声的的视频,当然视频中不易分别是否左右声道,自己执行代码用耳机听就可以了。
    视频:  VID_20170709.rar (1.07 MB, 下载次数: 12)
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5383
    最后登录
    2021-12-22
     楼主| 发表于 2017-7-10 00:01:18 | 显示全部楼层
    终于实现DMIC-->I2S-->wm8904-->耳机,实时声音的录放实现!!
    https://www.nxpic.org.cn/module/forum/thread-611432-1-1.html
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

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

    总算明白了, 那个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, 各种模式 (参考https://www.nxpic.org.cn/module/forum/thread-611426-1-1.html), 使用:
    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();
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 23:08 , Processed in 0.120755 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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