本帖最后由 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用到的管脚也不同,列于下几个表中(供参考)
| | | | | | | | | | | | | | | | | | | | | | | | | | | I2C4地址=0x4C PCT子地址=0x0 I2C子地址0x1A | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
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)下增加处理按键的代码 - if (!Chip_GPIO_GetPinState(LPC_GPIO,1, 8))
- {
- sc_alt++;
- if (sc_alt==4) sc_alt=0;
- Board_LED_Toggle(0);
- }
- if (!Chip_GPIO_GetPinState(LPC_GPIO,1, 9))
- {
- sc_alt++;
- if (sc_alt==4) sc_alt=0;
- Board_LED_Toggle(1);
- }
复制代码
通过改变全局变量sc_alt,进而在i2s_if.c文件中的void I2S_TX_ISR(void)判断以切换向i2s发送缓冲区写数据的方法。以实现仅左声道、仅左声道、仅左声道、同时双声道、左右声道交替发声。
- void I2S_TX_ISR(void) // I2S transmit interrupt
- {
- static i=0;
- Chip_I2S_ErrorHandler(I2S_PORT_TX, &tx_stat); // Accumulate TX errors then, clear status
- // i2s_buff_write();
- // transmit data to I2S port
- if (sc_alt==0) i2s_buff_sine_left();
- else if (sc_alt==1) i2s_buff_sine_right();
- else if (sc_alt==2) i2s_buff_sine_mono();
- else if (sc_alt==3)
- {
- if(i<5000)
- {
- i2s_buff_sine_left(); // transmit sine wave to the left
- i++;
- }
- else
- {
- i2s_buff_sine_right(); // transmit sine wave to the right
- i++;
- if(i==10000) i=0;
- }
- }
- // i2s_buff_sine_mono(); // transmit sine wave to the center
- // i2s_buff_sine_phase(); // transmit sine wave with phase and level
- }
复制代码
响应按键改变仅左声道、仅左声道、仅左声道、同时双声道、左右声道交替发声的的视频,当然视频中不易分别是否左右声道,自己执行代码用耳机听就可以了。 |