在线时间543 小时
UID1650185
注册时间2017-4-19
NXP金币468
TA的每日心情 | 怒 2021-1-28 20:09 |
---|
签到天数: 317 天 [LV.8]以坛为家I
金牌会员
- 积分
- 8028
- 最后登录
- 2022-5-12
|
本帖最后由 小马哥-1650185 于 2017-7-11 22:41 编辑
本帖谈下数字麦克录音通过iis总线传输给wm8904,实现音频的录音播放功能,音量调节可通过按键,WIFI,以及触摸屏。
流程:
系统上电后,需要初始化串口0,串口3,串口5,按键,led,IIC, IIS , WM8904, DMIC,然后通过数字麦克检测音频信号,经pdm接口传输给54114,经dmin转成pcm信号,在经iis传输给wm8904,经过cn7接口传输到音响上播放。。。
先来看下整体实验图吧。
按下PB2键,wiif联网开透传,串口打印提示信息
wifi发送0xaa,增加音量
wifi发送0x55,减小音量
wifi发送0--63之间的数值,直调音量
点击 触屏上的 按钮“增加音量”和“减小音量”,效果和上图是一样的,就不传了
下面说下代码思路吧
时钟配置
- /* USART0 clock */
- CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
- /* I2C clock */
- CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);
-
- /* I2S clocks */
- CLOCK_AttachClk(kFRO_HF_to_FLEXCOMM6);
- CLOCK_AttachClk(kFRO_HF_to_FLEXCOMM7);
- /* DMIC uses 12MHz FRO clock */
- CLOCK_AttachClk(kFRO12M_to_DMIC);
- /*12MHz divided by 15 = 800KHz PDM clock */
- CLOCK_SetClkDiv(kCLOCK_DivDmicClk, 14, false);
- /* Enable high speed clock for I2S*/
- SYSCON->FROCTRL |= (uint32_t)SYSCON_FROCTRL_HSPDCLK(1U);
- SYSCON->MCLKDIV = SYSCON_MCLKDIV_DIV(1 - 1);
- SYSCON->MCLKIO = 1U;
- /* Attach high speed clock to MCLK for I2S */
- CLOCK_AttachClk(kFRO_HF_to_MCLK);
复制代码
复位FLEXCOMM
- /* reset FLEXCOMM for I2C */
- RESET_PeripheralReset(kFC4_RST_SHIFT_RSTn);
- /* reset FLEXCOMM for I2S */
- RESET_PeripheralReset(kFC6_RST_SHIFT_RSTn);
- RESET_PeripheralReset(kFC7_RST_SHIFT_RSTn);
复制代码
外设初始化
- led_init();
- key_init();
- usart3_init();
- usart5_init();
复制代码
wm8904初始化
- WM8904_Init(&codecHandle, &codecConfig)
复制代码 dmic初始化
IIS初始化
- I2S_TxInit(DEMO_I2S_TX, &tx_config);
- I2S_Enable(DEMO_I2S_TX);
复制代码
配置完成后,通过数字麦克检测音频信号,把接收到的数据经cpu处理后,发到iis总线上,经编解码器wm8904,输出音频。demo参考dmic_codec_direct,需要修改下外设的gpio配置
关于按键和wifi控制调音功能,前面帖子有详细降到。
wifi模块用到了串口5,相关配置任务二的帖子有贴出来。板子上电后,按下PB2键会一键链接局域网,建立客户端--服务器的单连接透传通信模式。
此时,服务器发送 0xaa:增大音亮
服务器发送0x55:减小音量
服务器发送的数值在0--63之间,直接调到发送数值对应的音量。
触摸屏模块用到了串口3,直接看板子上是没有串口3引出的,不过没关系,spi 和串口 都是公用flexcomm的,所以就把spi的msio,miso两个引脚复用为了usart3
- void usart3_init(void)
- {
- usart_config_t config;
-
- /* attach 12 MHz clock to FLEXCOMM5 */
- CLOCK_AttachClk(BOARD_UART3_CLK_ATTACH);
- /* reset FLEXCOMM for USART5 */
- RESET_PeripheralReset(BOARD_UART3_RST);
-
- //RX:P0_12 TX:P0_12
- USART3_InitPins();
- USART_GetDefaultConfig(&config);
- config.baudRate_Bps = BOARD_UART3_BAUDRATE;
- config.enableTx = true;
- config.enableRx = true;
- USART_Init(LPC_USART3, &config, LPC_USART3_CLK_FREQ);
- /* Send g_tipString out. */
- // USART_WriteBlocking(LPC_USART3, g_tipString, sizeof(g_tipString) / sizeof(g_tipString[0]));
- /* Enable RX interrupt. */
- USART_EnableInterrupts(LPC_USART3, kUSART_RxLevelInterruptEnable | kUSART_RxErrorInterruptEnable);
复制代码 当检测到触摸屏上的 增加音量按钮的热区被按下后,音量增加,同理,
当检测到触摸屏上的 减小音量按钮的热区被按下后,音量减小
wifi和触摸屏调音公用一个处理方法
- if((wifi_data ==0xaa)||(Volume_flg == 1))
- {
- wifi_data =0;
- Volume_flg=0;
- if(VolumeValue <63 )VolumeValue += 1;
- if(VolumeValue >=63 ){
- VolumeValue =63;
- PRINTF("Current volume maximum\r\n");
- }
- WM8904_SetVolume(&codecHandle, VolumeValue, VolumeValue);
- PRINTF("Current volume value: %d%%\r\n" , VolumeValue*100/VOLUME_MAX);
- V_Buf[0] = VolumeValue*100/VOLUME_MAX;
- AT_Send(V_Buf);
- GPU_Set_Volume(V_Buf[0]);
- }
-
- else if((wifi_data ==0x55)||(Volume_flg == 2))
- {
- wifi_data =0;
- Volume_flg=0;
- if(VolumeValue >0)VolumeValue -= 1;
- if(VolumeValue <=0 ){
- VolumeValue =0;
- PRINTF("Current volume minimum\r\n");
- }
- WM8904_SetVolume(&codecHandle, VolumeValue, VolumeValue);
- PRINTF("Current volume value: %d%%\r\n" , VolumeValue*100/VOLUME_MAX);
- V_Buf[0] = VolumeValue*100/VOLUME_MAX;
- AT_Send(V_Buf);
- GPU_Set_Volume(V_Buf[0]);
- }
-
- else if((wifi_data >0)&&(wifi_data <=63))
- {
-
- WM8904_SetVolume(&codecHandle, wifi_data, wifi_data);
- PRINTF("Current volume value: %d%%\r\n" , wifi_data);
- V_Buf[0] = wifi_data;
- AT_Send(V_Buf);
- GPU_Set_Volume(V_Buf[0]);
- wifi_data=0;
- }
复制代码
。。。。。。。。。。。。。。。
这样对着麦克风讲话的时候,不论是通过wifi还是触摸屏,都可以对音量进行调节了。。。
........
|
|