cancel
Showing results for 
Search instead for 
Did you mean: 

STM32U585 + SAI

Ephraimoved
Associate III

Dear Sir.

I use ICS-43434 connected to STM32U585 through SAI.

The lines of the ICS-43434 SD,SCK,WS works fine ,

But when the interrupt is enabled the program crash.

Attached some code frgaments.

Main.c.

MX_SAI1_Init();

static void MX_SAI1_Init(void)

{

 /* USER CODE BEGIN SAI1_Init 0 */

 /* USER CODE END SAI1_Init 0 */

 /* USER CODE BEGIN SAI1_Init 1 */

 /* USER CODE END SAI1_Init 1 */

 hsai_BlockA1.Instance = SAI1_Block_A;

 hsai_BlockA1.Init.AudioMode = SAI_MODEMASTER_RX;

 hsai_BlockA1.Init.Synchro = SAI_ASYNCHRONOUS;

 hsai_BlockA1.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLE; //SAI_OUTPUTDRIVE_ENABLE;//SAI_OUTPUTDRIVE_DISABLE;

 hsai_BlockA1.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;//SAI_MASTERDIVIDER_DISABLE;//SAI_MASTERDIVIDER_ENABLE;

 hsai_BlockA1.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;//SAI_FIFOTHRESHOLD_FULL;//SAI_FIFOTHRESHOLD_EMPTY;

 hsai_BlockA1.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_16K;

 hsai_BlockA1.Init.SynchroExt = SAI_SYNCEXT_DISABLE;

 hsai_BlockA1.Init.MckOutput = SAI_MCK_OUTPUT_DISABLE;

 hsai_BlockA1.Init.MonoStereoMode = SAI_MONOMODE;

 hsai_BlockA1.Init.CompandingMode = SAI_NOCOMPANDING;

 hsai_BlockA1.Init.TriState = SAI_OUTPUT_NOTRELEASED;//SAI_OUTPUT_RELEASED ; //SAI_OUTPUT_NOTRELEASED;

 if (HAL_SAI_InitProtocol(&hsai_BlockA1, SAI_I2S_STANDARD, SAI_PROTOCOL_DATASIZE_24BIT,2) != HAL_OK)

// if (HAL_SAI_InitProtocol(&hsai_BlockA1, SAI_I2S_MSBJUSTIFIED, SAI_PROTOCOL_DATASIZE_24BIT,2) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN SAI1_Init 2 */

 /* USER CODE END SAI1_Init 2 */

}

audio_len = 4096;

AL_SAI_Receive_IT(&hsai_BlockA1, &audio[0],audio_len);

HAL_StatusTypeDef HAL_SAI_Receive_IT(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)

{

 if ((pData == NULL) || (Size == 0U))

 {

  return HAL_ERROR;

 }

 if (hsai->State == HAL_SAI_STATE_READY)

 {

  /* Process Locked */

  __HAL_LOCK(hsai);

  hsai->pBuffPtr = pData;

  hsai->XferSize = Size;

  hsai->XferCount = Size;

  hsai->ErrorCode = HAL_SAI_ERROR_NONE;

  hsai->State = HAL_SAI_STATE_BUSY_RX;

  if ((hsai->Init.DataSize == SAI_DATASIZE_8) && (hsai->Init.CompandingMode == SAI_NOCOMPANDING))

  {

   hsai->InterruptServiceRoutine = SAI_Receive_IT8Bit;

  }

  else if (hsai->Init.DataSize <= SAI_DATASIZE_16)

  {

   hsai->InterruptServiceRoutine = SAI_Receive_IT16Bit;

  }

  else

  {

   hsai->InterruptServiceRoutine = SAI_Receive_IT32Bit;

  }

  /* Enable TXE and OVRUDR interrupts */

  __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_IT));

  /* Check if the SAI is already enabled */

  if ((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == 0U)

  {

   /* Enable SAI peripheral */

   __HAL_SAI_ENABLE(hsai);

  }

  /* Process Unlocked */

  __HAL_UNLOCK(hsai);

  return HAL_OK;

 }

 else

 {

  return HAL_BUSY;

 }

}

stm32u5xx_hal_msp.c

static uint32_t SAI1_client =0;

void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai)

{

 GPIO_InitTypeDef GPIO_InitStruct;

 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

/* SAI1 */

  if(hsai->Instance==SAI1_Block_A)

  {

  /* Peripheral clock enable */

 /** Initializes the peripherals clock

 */

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SAI1;

  PeriphClkInit.Sai1ClockSelection = RCC_SAI1CLKSOURCE_PLL2;

  PeriphClkInit.PLL2.PLL2Source = RCC_PLLSOURCE_MSI;

  PeriphClkInit.PLL2.PLL2M = 3;//4; //3;

  PeriphClkInit.PLL2.PLL2N = 8;//20;//8;

  PeriphClkInit.PLL2.PLL2P = 1;//5;//1;

  PeriphClkInit.PLL2.PLL2Q = 2;

  PeriphClkInit.PLL2.PLL2R = 2;

  PeriphClkInit.PLL2.PLL2RGE = RCC_PLLVCIRANGE_1;

  PeriphClkInit.PLL2.PLL2FRACN = 0.0;

  PeriphClkInit.PLL2.PLL2ClockOut = RCC_PLL2_DIVP;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)

  {

   Error_Handler();

  }

  if (SAI1_client == 0)

  {

    __HAL_RCC_SAI1_CLK_ENABLE();

    /* Peripheral interrupt init*/

    HAL_NVIC_SetPriority(SAI1_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(SAI1_IRQn);

  }

  SAI1_client ++;

  /**SAI1_A_Block_A GPIO Configuration

  PE5   ------> SAI1_SCK_A

  PE4   ------> SAI1_FS_A

  PE6   ------> SAI1_SD_A

  */

  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  GPIO_InitStruct.Alternate = GPIO_AF13_SAI1;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  }

}

stm32u5xx_it.c

SAI_HandleTypeDef hsai_BlockA1;

void SAI1_IRQHandler(void)

{

// static uint8_t a = 0;

//

// switch(a)

// {

// case 0 : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET);

// a = 1;

// break;

// case 1 : HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET);

// a = 0;

// break;

// }

 /* USER CODE BEGIN SAI1_IRQn 0 */

 /* USER CODE END SAI1_IRQn 0 */

 HAL_SAI_IRQHandler(&hsai_BlockA1);

 /* USER CODE BEGIN SAI1_IRQn 1 */

 /* USER CODE END SAI1_IRQn 1 */

}

even if I comment out the line HAL_SAI_IRQHandler(&hsai_BlockA1);

still the program crashes

Please Advise.

1 REPLY 1
Mohamed Aymen HZAMI
ST Employee

Hello @Community member​ and welcome to the community,

What kind of error/crash you have?, is it hardfault?

Mohamed Aymen