在线时间279 小时
UID3181444
注册时间2015-12-8
NXP金币8
TA的每日心情 | 开心 2017-11-15 10:33 |
---|
签到天数: 79 天 [LV.6]常住居民II
金牌会员
- 积分
- 1779
- 最后登录
- 2020-8-22
|
这段时间一直忙考试,今天得空来试试音频操作,使用官方的SDK并参考万利的demo进行更改。
通过电位器调节音量
手机作为音频输入源
小音箱作为音频输出
板卡作为中转,DMA传输
数字麦克风,顾名思义,就是将传统模拟音频信号转换为数字信号进行处理和传输。
dmic初始化:
- /* PDM interface */
- IOCON_PinMuxSet(IOCON, 1, 15, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* PDM CLK 0 */
- IOCON_PinMuxSet(IOCON, 1, 16, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* PDM DATA 0 */
-
- /* DMIC uses 12MHz FRO clock */
- CLOCK_AttachClk(kFRO12M_to_DMIC);
- /*12MHz divided by 15 = 800KHz PDM clock */
- CLOCK_SetClkDiv(kCLOCK_DivDmicClk, 14, false);
- dmic_channel_cfg.divhfclk = kDMIC_PdmDiv1;
- dmic_channel_cfg.osr = 25U;
- dmic_channel_cfg.gainshft = 3U;
- dmic_channel_cfg.preac2coef = kDMIC_CompValueZero;
- dmic_channel_cfg.preac4coef = kDMIC_CompValueZero;
- dmic_channel_cfg.dc_cut_level = kDMIC_DcCut155;
- dmic_channel_cfg.post_dc_gain_reduce = 0U;
- dmic_channel_cfg.saturate16bit = 1U;
- dmic_channel_cfg.sample_rate = kDMIC_PhyFullSpeed;
- DMIC_Init(DMIC0);
-
- DMIC_ConfigIO(DMIC0, kDMIC_PdmStereo);
- DMIC_Use2fs(DMIC0, true);
- DMIC_SetOperationMode(DMIC0, kDMIC_OperationModeInterrupt);
- DMIC_ConfigChannel(DMIC0, kDMIC_Channel0, kDMIC_Left, &dmic_channel_cfg);
- DMIC_ConfigChannel(DMIC0, kDMIC_Channel1, kDMIC_Right, &dmic_channel_cfg);
- DMIC_FifoChannel(DMIC0, kDMIC_Channel0, FIFO_DEPTH, true, true);
- DMIC_FifoChannel(DMIC0, kDMIC_Channel1, FIFO_DEPTH, true, true);
-
- /*Gain of the noise estimator */
- DMIC_SetGainNoiseEstHwvad(DMIC0, 0x02U);
- /*Gain of the signal estimator */
- DMIC_SetGainSignalEstHwvad(DMIC0, 0x01U);
- /* 00 = first filter by-pass, 01 = hpf_shifter=1, 10 = hpf_shifter=4 */
- DMIC_SetFilterCtrlHwvad(DMIC0, 0x01U);
- /*input right-shift of (GAIN x 2 -10) bits (from -10bits (0000) to +14bits (1100)) */
- DMIC_SetInputGainHwvad(DMIC0, 0x04U);
- DisableDeepSleepIRQ(HWVAD0_IRQn);
- DMIC_HwvadEnableIntCallback(DMIC0, DMIC0_HWVAD_Callback);
- DMIC_EnableChannnel(DMIC0, (DMIC_CHANEN_EN_CH0(1) | DMIC_CHANEN_EN_CH1(1)));
- /* reset hwvad internal interrupt */
- DMIC_CtrlClrIntrHwvad(DMIC0, true);
- /* To clear first spurious interrupt */
- for (i = 0; i < 0xFFFFU; i++)
- {
- }
- /*HWVAD Normal operation */
- DMIC_CtrlClrIntrHwvad(DMIC0, false);
- NVIC_ClearPendingIRQ(HWVAD0_IRQn);
- EnableDeepSleepIRQ(HWVAD0_IRQn);
复制代码
I2S(Inter—IC Sound)总线, 又称 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专门用於音频设备之间的数据传输,广泛应用于各种多媒体系统。它采用了沿独立的导线传输时钟与数据信号的设计,通过将数据和时钟信号分离,避免了因时差诱发的失真,为用户节省了购买抵抗音频抖动的专业设备的费用。
I2S初始化:
- /* Initialize PLL clock */
- CLOCK_AttachClk(kFRO12M_to_SYS_PLL);
- CLOCK_SetPLLFreq(&pllSetup);
- CLOCK_AttachClk(kSYS_PLL_to_FLEXCOMM6);
- CLOCK_AttachClk(kSYS_PLL_to_FLEXCOMM7);
- /* Attach PLL clock to MCLK for I2S, no divider */
- CLOCK_AttachClk(kSYS_PLL_to_MCLK);
- SYSCON->MCLKDIV = SYSCON_MCLKDIV_DIV(0U);
- /* reset FLEXCOMM for I2S */
- RESET_PeripheralReset(kFC6_RST_SHIFT_RSTn);
- RESET_PeripheralReset(kFC7_RST_SHIFT_RSTn);
-
- /* I2S */
- // Flexcomm 6 I2S Rx
- IOCON_PinMuxSet(IOCON, 0, 5, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* Flexcomm 6 / SDA */
- IOCON_PinMuxSet(IOCON, 0, 6, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* Flexcomm 6 / WS */
- IOCON_PinMuxSet(IOCON, 0, 7, IOCON_FUNC1 | IOCON_DIGITAL_EN); /* Flexcomm 6 / SCK */
- // Flexcomm 7 I2S Tx
- IOCON_PinMuxSet(IOCON, 1, 12, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / SCK */
- IOCON_PinMuxSet(IOCON, 1, 13, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / SDA */
- IOCON_PinMuxSet(IOCON, 1, 14, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / WS */
- /* MCLK output for I2S */
- IOCON_PinMuxSet(IOCON, 1, 17, IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGITAL_EN);
- SYSCON->MCLKIO = 1U;
- /*
- * enableMaster = true;
- * baudRate_Bps = 100000U;
- * enableTimeout = false;
- */
- WM8904_GetDefaultConfig(&codecConfig);
- codecHandle.i2c = I2C4;
- if (WM8904_Init(&codecHandle, &codecConfig) != kStatus_Success)
- {
- PRINTF("WM8904_Init failed!\r\n");
- led_off(7);
- }
- else
- {
- led_on(7);
- }
- /* Initial volume kept low for hearing safety. */
- /* Adjust it to your needs, 0x0006 for -51 dB, 0x0039 for 0 dB etc. */
- WM8904_SetVolume(&codecHandle, 0x0039, 0x0039);
-
- I2S_TxGetDefaultConfig(&s_TxConfig);
- s_TxConfig.divider = CLOCK_GetPllOutFreq() / 48000U / 16U / 2U;
- I2S_RxGetDefaultConfig(&s_RxConfig);
-
- I2S_TxInit(I2S_TX, &s_TxConfig);
- I2S_RxInit(I2S_RX, &s_RxConfig);
-
- DMA_Init(DMA0);
- DMA_EnableChannel(DMA0, I2S_DMA_TX);
- DMA_EnableChannel(DMA0, I2S_DMA_RX);
- DMA_SetChannelPriority(DMA0, I2S_DMA_TX, kDMA_ChannelPriority3);
- DMA_SetChannelPriority(DMA0, I2S_DMA_RX, kDMA_ChannelPriority2);
- DMA_CreateHandle(&s_DmaTxHandle, DMA0, I2S_DMA_TX);
- DMA_CreateHandle(&s_DmaRxHandle, DMA0, I2S_DMA_RX);
- StartSoundPlayback(); //选用文件的正弦波音频输出
- //StartDigitalLoopback(); //选用音频输入源输出
复制代码 代码移植时注意引脚配置
最后附上视频和代码:
123.part1.rar
(20 MB, 下载次数: 56)
|
|