cancel
Showing results for 
Search instead for 
Did you mean: 

Problem with SAI and dma Receive.

Htzuh
Associate II

Dear all,

The following are codes of SAI protocol and dma init.The MCU I using was stm32wb.

Then i use HAL_SAI_Receive_DMA(); to receive the microphone senor data in standard i2s protocol,

but i the receive data is 0.

Did i need to modify in DMA settings or SAI?

Thanks.

void MX_SAI1_Init(void)

{

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

 hsai_BlockA1.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;

 hsai_BlockA1.Init.MckOverSampling = SAI_MCK_OVERSAMPLING_DISABLE;

 hsai_BlockA1.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;

 hsai_BlockA1.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_48K;

 hsai_BlockA1.Init.SynchroExt = SAI_SYNCEXT_DISABLE;

 hsai_BlockA1.Init.MonoStereoMode = SAI_MONOMODE;

 hsai_BlockA1.Init.CompandingMode = SAI_NOCOMPANDING;

 hsai_BlockA1.Init.TriState = SAI_OUTPUT_NOTRELEASED;

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

 {

  Error_Handler();

 }

}

static uint32_t SAI1_client =0;

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   

  PC3   ------> SAI1_SD_A

  PA8   ------> SAI1_SCK_A

  PA9   ------> SAI1_FS_A 

  */

  GPIO_InitStruct.Pin = GPIO_PIN_3;

  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(GPIOC, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;

  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(GPIOA, &GPIO_InitStruct);

  hdma_sai1_a.Instance = DMA1_Channel3;

  hdma_sai1_a.Init.Request = DMA_REQUEST_SAI1_A;

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

  hdma_sai1_a.Init.Mode = DMA_CIRCULAR;

  hdma_sai1_a.Init.Priority = DMA_PRIORITY_HIGH;

  HAL_DMA_DeInit(&hdma_sai1_a);

  if (HAL_DMA_Init(&hdma_sai1_a) != HAL_OK)

  {

   Error_Handler();

  }

  __HAL_LINKDMA(hsai,hdmarx,hdma_sai1_a);

  __HAL_LINKDMA(hsai,hdmatx,hdma_sai1_a);

  }

}

void MX_DMA_Init(void) 

{

 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMAMUX1);

 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);

 /* DMA interrupt init */

 /* DMA1_Channel1_IRQn interrupt configuration */

 NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));

 NVIC_EnableIRQ(DMA1_Channel1_IRQn);

 /* DMA1_Channel2_IRQn interrupt configuration */

 NVIC_SetPriority(DMA1_Channel2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));

 NVIC_EnableIRQ(DMA1_Channel2_IRQn);

 HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);

 HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);

}

0 REPLIES 0