cancel
Showing results for 
Search instead for 
Did you mean: 

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

SNULU
Associate II

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

  }

}

4 REPLIES 4

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
Associate II

Hi Jan,

Thank you for your response.

I have give PLLSAI clock to SAI Block.

SaB0tAgE
Associate II

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!

YES, I have solved the issue.

I missed some registers.

Thank You.