[Solved] STM32H743 SAI DMA Receiving only '0's
Hey,
I configured the stm32h743 to transfer data with sai2 and read the same data with sai1. Sai2 is in IT mode and works fine (checked it with a logic analyzer).
The SAI2 is totally working in IT mode, but when I put it in DMA mode i only receive 0's. Yes, i set the input buffer in D2, its address is 0x30000000 in the SRAM1.
the interrupts all work good, no tranfer errors ect.
This in my SAI init code:
__HAL_SAI_RESET_HANDLE_STATE(&SaiInputHandle);
SaiInputHandle.Instance = SAI1_Block_A;
SaiInputHandle.Init.AudioMode = SAI_MODESLAVE_RX;
SaiInputHandle.Init.Synchro = SAI_ASYNCHRONOUS;
SaiInputHandle.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
SaiInputHandle.Init.NoDivider = SAI_MASTERDIVIDER_DISABLE;
SaiInputHandle.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_HF;
//SaiInputHandle.Init.AudioFrequency = AUDIO_FREQUENCY;
SaiInputHandle.Init.Protocol = SAI_FREE_PROTOCOL;
SaiInputHandle.Init.DataSize = SAI_DATASIZE_32;
SaiInputHandle.Init.FirstBit = SAI_FIRSTBIT_MSB;
SaiInputHandle.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
SaiInputHandle.Init.MonoStereoMode = SAI_MONOMODE;
SaiInputHandle.FrameInit.FrameLength = 128;
SaiInputHandle.FrameInit.ActiveFrameLength = 1;
SaiInputHandle.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
SaiInputHandle.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
SaiInputHandle.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT;
SaiInputHandle.SlotInit.FirstBitOffset = 0;
SaiInputHandle.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;
SaiInputHandle.SlotInit.SlotNumber = 4;
SaiInputHandle.SlotInit.SlotActive = (SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1 | SAI_SLOTACTIVE_2 | SAI_SLOTACTIVE_3);
/* DeInit SAI PDM input */
HAL_SAI_DeInit(&SaiInputHandle);
/* Init SAI PDM input */
if(HAL_OK != HAL_SAI_Init(&SaiInputHandle))
{
Error_Handler();
}
/* Enable SAI to generate clock used by audio driver */
__HAL_SAI_ENABLE(&SaiInputHandle);And here is my dma init code;
/* Enable SAI clock */
__HAL_RCC_SAI1_CLK_ENABLE();
/* Enable GPIO clock */
__HAL_RCC_GPIOE_CLK_ENABLE();
/* pins configuration: Data */
GPIO_Init.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;
GPIO_Init.Mode = GPIO_MODE_AF_PP;
GPIO_Init.Pull = GPIO_NOPULL;
GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_Init.Alternate = GPIO_AF6_SAI1;
HAL_GPIO_Init(GPIOE, &GPIO_Init);
/* Enable the DMA clock */
__HAL_RCC_DMA1_CLK_ENABLE();
/* Configure the hdma_sai_tx handle parameters */
SaiInputDmaHandle.Instance = DMA1_Stream1;
SaiInputDmaHandle.Init.Request = DMA_REQUEST_SAI1_A;
SaiInputDmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY;
SaiInputDmaHandle.Init.PeriphInc = DMA_PINC_DISABLE;
SaiInputDmaHandle.Init.MemInc = DMA_MINC_ENABLE;
SaiInputDmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
SaiInputDmaHandle.Init.MemDataAlignment = DMA_PDATAALIGN_WORD;
SaiInputDmaHandle.Init.Mode = DMA_CIRCULAR;
SaiInputDmaHandle.Init.Priority = DMA_PRIORITY_VERY_HIGH;
SaiInputDmaHandle.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
SaiInputDmaHandle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
SaiInputDmaHandle.Init.MemBurst = DMA_MBURST_SINGLE;
SaiInputDmaHandle.Init.PeriphBurst = DMA_PBURST_SINGLE;
/* Deinitialize the Stream for new transfer */
HAL_DMA_DeInit(&SaiInputDmaHandle);
/* Configure the DMA Stream */
HAL_DMA_Init(&SaiInputDmaHandle);
/* Associate the DMA handle */
__HAL_LINKDMA(&SaiInputHandle, hdmarx, SaiInputDmaHandle);
/* SAI DMA IRQ Channel configuration */
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
/* Peripheral interrupt init*/
HAL_NVIC_SetPriority(SAI1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SAI1_IRQn);