sai_transceiver_t SAI1_Rx_config = {
.masterSlave = kSAI_Master,
.bitClock = {
.bclkSrcSwap = false,
.bclkSource = kSAI_BclkSourceBusclk,
.bclkPolarity = kSAI_SampleOnRisingEdge,
.bclkInputDelay = false
},
.frameSync = {
.frameSyncWidth = 32U,
.frameSyncPolarity = kSAI_PolarityActiveLow,
.frameSyncEarly = true,
.frameSyncGenerateOnDemand = false
},
.syncMode = kSAI_ModeAsync,
.channelMask = kSAI_Channel0Mask | kSAI_Channel1Mask,
.startChannel = 0U,
.endChannel = 1U,
.channelNums = 2U,
.serialData = {
.dataMode = kSAI_DataPinStateTriState,
.dataWord0Length = (uint8_t)kSAI_WordWidth32bits,
.dataWordNLength = (uint8_t)kSAI_WordWidth32bits,
.dataWordLength = (uint8_t)kSAI_WordWidth32bits,
.dataOrder = kSAI_DataMSB,
.dataFirstBitShifted = 32U,
.dataWordNum = 1U,
.dataMaskedWord = 0x0U
},
.fifo = {
.fifoWatermark = 4U,
.fifoCombine = kSAI_FifoCombineDisabled,
.fifoPacking = kSAI_FifoPackingDisabled,
.fifoContinueOneError = true
}
};
sai_master_clock_t SAI1_MCLK_config = {
.mclkOutputEnable = false,
.mclkSourceClkHz = SAI1_MCLK_SOURCE_CLOCK_HZ,
.mclkHz = SAI1_USER_MCLK_HZ
};
static void SAI1_init(void) {
/* Initialize SAI clock gate */
SAI_Init(SAI1_PERIPHERAL);
/* Configures SAI Rx sub-module functionality */
SAI_RxSetConfig(SAI1_PERIPHERAL, &SAI1_Rx_config);
/* Set up SAI Rx bitclock rate by calculation of divider. */
SAI_RxSetBitClockRate(SAI1_PERIPHERAL, SAI1_RX_BCLK_SOURCE_CLOCK_HZ, SAI1_RX_SAMPLE_RATE, SAI1_RX_WORD_WIDTH, SAI1_RX_WORDS_PER_FRAME);
/* Enable selected Rx interrupts */
SAI_RxEnableInterrupts(SAI1_PERIPHERAL, (kSAI_SyncErrorInterruptEnable | kSAI_FIFOErrorInterruptEnable | kSAI_FIFORequestInterruptEnable));
/* Enable interrupt SAI1_IRQN request in the NVIC */
EnableIRQ(SAI1_IRQN);
}