Skip to main content
SNULU
Associate III
January 12, 2021
Question

I tried configuring the SAI peripheral in STM32F469. After initialization I was unable to get any clock outputs including MCLK.

  • January 12, 2021
  • 4 replies
  • 1374 views

Help me in initialization.

Here is the initialization i made

/* SAI1 init function */

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_TX;

 hsai_BlockA1.Init.Synchro = SAI_ASYNCHRONOUS;

 hsai_BlockA1.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;

 hsai_BlockA1.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;

 hsai_BlockA1.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;

 hsai_BlockA1.Init.ClockSource = SAI_CLKSOURCE_PLLSAI;

 hsai_BlockA1.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_8K;

 hsai_BlockA1.Init.SynchroExt = SAI_SYNCEXT_DISABLE;

 hsai_BlockA1.Init.MonoStereoMode = SAI_STEREOMODE;

 hsai_BlockA1.Init.CompandingMode = SAI_NOCOMPANDING;

 hsai_BlockA1.Init.TriState = SAI_OUTPUT_NOTRELEASED;

 if (HAL_SAI_InitProtocol(&hsai_BlockA1, SAI_PCM_SHORT, SAI_PROTOCOL_DATASIZE_16BIT, 1) != HAL_OK)

 {

  Error_Handler();

 }

 /* USER CODE BEGIN SAI1_Init 2 */

 /* USER CODE END SAI1_Init 2 */

}

void HAL_SAI_MspInit(SAI_HandleTypeDef* hsai)

{

 GPIO_InitTypeDef GPIO_InitStruct;

/* SAI1 */

  if(hsai->Instance==SAI1_Block_A)

  {

  /* SAI1 clock enable */

  if (SAI1_client == 0)

  {

    __HAL_RCC_SAI1_CLK_ENABLE();

  }

  SAI1_client ++;

  /**SAI1_A_Block_A GPIO Configuration

  PE4   ------> SAI1_FS_A

  PE5   ------> SAI1_SCK_A

  PE6   ------> SAI1_SD_A

  PG7   ------> SAI1_MCLK_A

  */

  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|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_AF6_SAI1;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_7;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  GPIO_InitStruct.Alternate = GPIO_AF6_SAI1;

  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  /* Peripheral DMA init*/

  hdma_sai1_a.Instance = DMA2_Stream1;

  hdma_sai1_a.Init.Channel = DMA_CHANNEL_0;

  hdma_sai1_a.Init.Direction = DMA_MEMORY_TO_PERIPH;

  hdma_sai1_a.Init.PeriphInc = DMA_PINC_DISABLE;

  hdma_sai1_a.Init.MemInc = DMA_MINC_ENABLE;

  hdma_sai1_a.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

  hdma_sai1_a.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

  hdma_sai1_a.Init.Mode = DMA_NORMAL;

  hdma_sai1_a.Init.Priority = DMA_PRIORITY_LOW;

  hdma_sai1_a.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

  if (HAL_DMA_Init(&hdma_sai1_a) != HAL_OK)

  {

   Error_Handler();

  }

  /* Several peripheral DMA handle pointers point to the same DMA handle.

   Be aware that there is only one stream to perform all the requested DMAs. */

  __HAL_LINKDMA(hsai,hdmarx,hdma_sai1_a);

  __HAL_LINKDMA(hsai,hdmatx,hdma_sai1_a);

  }

}

This topic has been closed for replies.

4 replies

waclawek.jan
Super User
January 12, 2021

Which clock is selected for given SAI block? Read out and check the respective RCC registers content.

If that does not answer the problem and the clock is up, running and properly routed to given SAI, read out and check also SAI and GPIO registers content.

JW

SNULU
SNULUAuthor
Associate III
January 13, 2021

Hi Jan,

Thank you for your response.

I have give PLLSAI clock to SAI Block.

SaB0tAgE
Associate
January 18, 2021

Hi Snulu, did you solve the issue ? I am also struggling with this issue and even if I have configured manually using LL drivers and dropping values to SAI register, nothing happen!

SNULU
SNULUAuthor
Associate III
April 26, 2021

YES, I have solved the issue.

I missed some registers.

Thank You.