| /* |
| * Copyright (c) 2016, Freescale Semiconductor, Inc. |
| * Copyright 2016-2020 NXP |
| * All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #include "board.h" |
| #include "fsl_debug_console.h" |
| #include "fsl_sai.h" |
| #include "music.h" |
| #include "fsl_codec_common.h" |
| |
| #include "fsl_wm8524.h" |
| #include "pin_mux.h" |
| #include "clock_config.h" |
| #include "fsl_common.h" |
| #include "fsl_gpio.h" |
| #include "fsl_codec_adapter.h" |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| #define DEMO_SAI (I2S2) |
| #define DEMO_SAI_CHANNEL (0) |
| #define DEMO_SAI_CLK_FREQ \ |
| CLOCK_GetPllFreq(kCLOCK_SystemPll1Ctrl) / (CLOCK_GetRootPreDivider(kCLOCK_RootSai2)) / \ |
| (CLOCK_GetRootPostDivider(kCLOCK_RootSai2)) / 6 |
| #define DEMO_CODEC_WM8524 (1) |
| #define CODEC_USEGPIO (1) |
| #define DEMO_CODEC_BUS_PIN (NULL) |
| #define DEMO_CODEC_BUS_PIN_NUM (0) |
| #define DEMO_CODEC_MUTE_PIN (GPIO1) |
| #define DEMO_CODEC_MUTE_PIN_NUM (8) |
| |
| #define DEMO_SAI_TX_SYNC_MODE kSAI_ModeAsync |
| #define DEMO_SAI_RX_SYNC_MODE kSAI_ModeSync |
| #define DEMO_SAI_MCLK_OUTPUT true |
| #define DEMO_SAI_MASTER_SLAVE kSAI_Master |
| |
| #define DEMO_AUDIO_DATA_CHANNEL (2U) |
| #define DEMO_AUDIO_BIT_WIDTH kSAI_WordWidth16bits |
| #define DEMO_AUDIO_SAMPLE_RATE (kSAI_SampleRate16KHz) |
| #define DEMO_AUDIO_MASTER_CLOCK DEMO_SAI_CLK_FREQ |
| |
| #define BOARD_MASTER_CLOCK_CONFIG() |
| #define BOARD_SAI_RXCONFIG(config, mode) |
| |
| /******************************************************************************* |
| * Prototypes |
| ******************************************************************************/ |
| void BOARD_WM8524_Mute_GPIO(uint32_t output); |
| extern void BOARD_SAI_RXConfig(sai_transceiver_t *config, sai_sync_mode_t sync); |
| /******************************************************************************* |
| * Variables |
| ******************************************************************************/ |
| static wm8524_config_t wm8524Config = { |
| .setMute = BOARD_WM8524_Mute_GPIO, |
| .setProtocol = NULL, |
| .protocol = kWM8524_ProtocolI2S, |
| }; |
| codec_config_t boardCodecConfig = {.codecDevType = kCODEC_WM8524, .codecDevConfig = &wm8524Config}; |
| |
| sai_handle_t txHandle = {0}; |
| static volatile bool isFinished = false; |
| extern codec_config_t boardCodecConfig; |
| codec_handle_t codecHandle; |
| |
| /******************************************************************************* |
| * Code |
| ******************************************************************************/ |
| |
| void BOARD_WM8524_Mute_GPIO(uint32_t output) |
| { |
| GPIO_PinWrite(DEMO_CODEC_MUTE_PIN, DEMO_CODEC_MUTE_PIN_NUM, output); |
| } |
| |
| static void callback(I2S_Type *base, sai_handle_t *handle, status_t status, void *userData) |
| { |
| isFinished = true; |
| } |
| |
| /*! |
| * @brief Main function |
| */ |
| int main(void) |
| { |
| sai_transfer_t xfer; |
| uint32_t temp = 0; |
| sai_transceiver_t config; |
| |
| /* Board specific RDC settings */ |
| BOARD_RdcInit(); |
| |
| BOARD_InitPins(); |
| BOARD_BootClockRUN(); |
| BOARD_InitDebugConsole(); |
| BOARD_InitMemory(); |
| |
| CLOCK_SetRootMux(kCLOCK_RootSai2, kCLOCK_SaiRootmuxSysPll1Div6); /* Set SAI source to SYS PLL1 Div6 133MHZ */ |
| CLOCK_SetRootDivider(kCLOCK_RootSai2, 1U, 3U); /* Set root clock to 133MHZ / 3 = 44MHZ */ |
| |
| /* gpio initialization */ |
| gpio_pin_config_t gpioConfig = {kGPIO_DigitalOutput, 1}; |
| GPIO_PinInit(DEMO_CODEC_MUTE_PIN, DEMO_CODEC_MUTE_PIN_NUM, &gpioConfig); |
| |
| PRINTF("SAI example started!\n\r"); |
| |
| /* SAI init */ |
| SAI_Init(DEMO_SAI); |
| SAI_TransferTxCreateHandle(DEMO_SAI, &txHandle, callback, NULL); |
| /* I2S mode configurations */ |
| SAI_GetClassicI2SConfig(&config, DEMO_AUDIO_BIT_WIDTH, kSAI_Stereo, 1U << DEMO_SAI_CHANNEL); |
| config.syncMode = DEMO_SAI_TX_SYNC_MODE; |
| config.masterSlave = DEMO_SAI_MASTER_SLAVE; |
| SAI_TransferTxSetConfig(DEMO_SAI, &txHandle, &config); |
| |
| /* set bit clock divider */ |
| SAI_TxSetBitClockRate(DEMO_SAI, DEMO_AUDIO_MASTER_CLOCK, DEMO_AUDIO_SAMPLE_RATE, DEMO_AUDIO_BIT_WIDTH, |
| DEMO_AUDIO_DATA_CHANNEL); |
| /* sai rx configurations */ |
| BOARD_SAI_RXCONFIG(&config, DEMO_SAI_RX_SYNC_MODE); |
| /* master clock configurations */ |
| BOARD_MASTER_CLOCK_CONFIG(); |
| |
| /* Use default setting to init codec */ |
| CODEC_Init(&codecHandle, &boardCodecConfig); |
| |
| /* xfer structure */ |
| temp = (uint32_t)music; |
| xfer.data = (uint8_t *)temp; |
| xfer.dataSize = MUSIC_LEN; |
| SAI_TransferSendNonBlocking(DEMO_SAI, &txHandle, &xfer); |
| /* Wait until finished */ |
| while (isFinished != true) |
| { |
| } |
| |
| PRINTF("\n\r SAI example finished!\n\r "); |
| while (1) |
| { |
| } |
| } |