本帖最后由 day_day 于 2020-3-12 21:17 编辑
WM8904是Cirrus Logic一款立体声解码芯片,在LPC系列官方开发板上比较常见,因此SDK也为其专门设置了驱动包,可以方便地进行驱动。我手上的两块官方开发板LPC55S69和LPC54628都采用了WM8904作为音频方案。
音频数据通讯采用IIS协议,而寄存器配置则采用IIC协议。
(一)时钟配置 1-主时钟由96MHz的fro_hf提供,或者也可以启动pll0时钟 2-PLL0提供IIS所需要的精准时钟,这个时钟的频率必须是所选择的音频码率的某个倍数,可以参考IIS外设配置页面,会最接近的时钟频率可供选择。 3-由PLL0为MCLK提供时钟,MCLK为对外向WM8904输出的时钟,最好保证其为码率的倍数,某则音质会失真 4-使能第四和第七个FXCOM外设时钟,其中第七个外设时钟必须由PLL0提供,最好不作任何改变,与PLL0_CLK时钟的频率保持一致。因为该外设为IIS
(二)引脚使能 使能接到WM8904的IIS(FXCOM7)、IIC(FXCOM4)共五个引脚 再使能SYSCON中的MCLK引脚(91),该引脚向WM8904提供时钟。 主函数初始化时补充一句: 否则时钟无法输出,暂时没有发现该行语句完全由配置工具配置出来的方法,因此需要手动加入
(三)SDK加入 SDK加入wm8904_adapter、flexcomm_i2c_adapter,I2s_dma,其余关联内容会被自动选中
(四)外设配置 DMA0 FLFXCOMM4-IIC FLFXCOMM7-IIS
(五)初始化wm8904 1-创建配置结构体: - wm8904_config_t wm8904Config = {
- .i2cConfig = {
- .codecI2CInstance = BOARD_CODEC_I2C_INSTANCE,
- .codecI2CSourceClock = BOARD_CODEC_I2C_CLOCK_FREQ
- },
- .recordSource = kWM8904_RecordSourceLineInput,
- .recordChannelLeft = kWM8904_RecordChannelLeft2,
- .recordChannelRight = kWM8904_RecordChannelRight2,
- .playSource = kWM8904_PlaySourceDAC,
- .slaveAddress = WM8904_I2C_ADDRESS,
- .protocol = kWM8904_ProtocolI2S,
- .format = {
- .sampleRate = kWM8904_SampleRate48kHz,
- .bitWidth = kWM8904_BitWidth16
- },
- .mclk_HZ = 24576000,
- .master = false,
- };
- codec_config_t boardCodecConfig = {
- .codecDevType = kCODEC_WM8904,
- .codecDevConfig = &wm8904Config
- };
复制代码初始化: - codec_handle_t codecHandle;
- if (CODEC_Init(&codecHandle, &boardCodecConfig) != kStatus_Success)
- {
- PRINTF("WM8904_Init failed!\r\n");
- }
- /* Initial volume kept low for hearing safety. */
- /* Adjust it to your needs, 0x0006 for -51 dB, 0x0039 for 0 dB etc. */
- CODEC_SetVolume(&codecHandle,
- kCODEC_PlayChannelHeadphoneLeft | kCODEC_PlayChannelHeadphoneRight,
- 0x0006);
复制代码2-回调函数: - static void TxCallback(I2S_Type *base, i2s_dma_handle_t *handle, status_t completionStatus, void *userData);
- void TxCallback(
- I2S_Type *base,
- i2s_dma_handle_t *handle,
- status_t completionStatus,
- void *userData)
- {
- /* Enqueue the same original buffer all over again */
- i2s_transfer_t *transfer = (i2s_transfer_t *)userData;
- I2S_TxTransferSendDMA(base, handle, *transfer);
- }
复制代码[size=13.3333px]3-启动DMA0重复发送 - i2s_transfer_t ss_TxTransfer;
- ss_TxTransfer.data = &g_Music[0];
- ss_TxTransfer.dataSize = sizeof(g_Music);
- I2S_TxTransferCreateHandleDMA(I2S7, &FLEXCOMM7_Tx_DMA_Handle, &FLEXCOMM7_TX_Handle, TxCallback, (void *)&ss_TxTransfer);
- I2S_TxTransferSendDMA(I2S7, &FLEXCOMM7_Tx_DMA_Handle, ss_TxTransfer);
- I2S_TxTransferSendDMA(I2S7, &FLEXCOMM7_Tx_DMA_Handle, ss_TxTransfer);
复制代码g_Music是采用例程中的music.h中的一段音频数组 然后就可以听见嗡嗡声(不是哒哒哒哦)
工程:
LPC55S69_Project_sound.zip
(714.68 KB, 下载次数: 51)
|