Using MCUXpresso and the SDK2.11.0 for the RT1052, the SAI DMA that was working now isn't.
The rest of my peripherals are all working fine, so it seems the SAI (MQS) is the only thing affected.
In the below code segment, `SAI_UserCallback` is never getting called (used to get called
Could you provide some insight?
sai_handle_t g_saiHandle;
edma_handle_t g_TxDmaHandle;
sai_edma_handle_t g_saiTxDmaHandle;
sai_config_t user_config;
sai_transfer_t sendXfer;
volatile bool txFinished;
void SAI_UserCallback(I2S_Type *base, sai_edma_handle_t *handle, status_t status, void *userData) {
if (kStatus_SAI_TxIdle == status)
{
txFinished = true;
}
}
void buzzer_play_sound(uint32_t prediv, uint32_t div, soundclip_t sc){
edma_config_t dmaConfig = {0};
/*Clock setting for SAI1*/
CLOCK_SetMux(kCLOCK_Sai3Mux, DEMO_SAI_CLOCK_SOURCE_SELECT);
CLOCK_SetDiv(kCLOCK_Sai3PreDiv, prediv);
CLOCK_SetDiv(kCLOCK_Sai3Div, div);
/*Enable MCLK clock*/
BOARD_EnableSaiMclkOutput(true);
IOMUXC_MQSEnterSoftwareReset(IOMUXC_GPR, true); /* Reset MQS. */
IOMUXC_MQSEnterSoftwareReset(IOMUXC_GPR, false); /* Release reset MQS. */
IOMUXC_MQSEnable(IOMUXC_GPR, true); /* Enable MQS. */
IOMUXC_MQSConfig(IOMUXC_GPR, kIOMUXC_MqsPwmOverSampleRate64, 0u); /* 78.6432MHz/64/(0+1) = 1.2288MHz*/
/* SAI init */
SAI_Init(SAI3);
SAI_TxGetDefaultConfig(&user_config);
SAI_TxInit(SAI3, &user_config);
// Sets up the DMA.
DMAMUX_Init(DEMO_DMAMUX);
DMAMUX_SetSource(DEMO_DMAMUX, DEMO_TX_EDMA_CHANNEL, DEMO_SAI_TX_SOURCE);
DMAMUX_EnableChannel(DEMO_DMAMUX, DEMO_TX_EDMA_CHANNEL);
EDMA_GetDefaultConfig(&dmaConfig);
EDMA_Init(DEMO_DMA, &dmaConfig);
/* Creates the DMA handle. */
EDMA_CreateHandle(&g_TxDmaHandle, DMA0, DEMO_TX_EDMA_CHANNEL);
SAI_TransferTxCreateHandleEDMA(SAI3,&g_saiTxDmaHandle, SAI_UserCallback, NULL, &g_TxDmaHandle);
/* I2S mode configurations */
sai_transceiver_t config;
SAI_GetClassicI2SConfig(&config, kSAI_WordWidth8bits, kSAI_MonoRight, 1U << DEMO_SAI_CHANNEL);
config.masterSlave = kSAI_Master;
config.syncMode = kSAI_ModeAsync;
SAI_TransferTxSetConfigEDMA(SAI3, &g_saiTxDmaHandle, &config);
// Prepares to send.
sendXfer.data = soundclip_ptr(sc);
sendXfer.dataSize = soundclip_size(sc);
txFinished = false;
// Sends out.
SAI_TransferSendEDMA(SAI3, &g_saiTxDmaHandle, &sendXfer);
// Waits for send to complete.
while (!txFinished)
{
}
}