cancel
Showing results for 
Search instead for 
Did you mean: 

SPI communication using DMA on the STM32H743.

pass3master
Senior

SPI communication using DMA on the STM32H743.

We have created a program for SPI communication using DMA, The first send/receive with HAL_SPI_TransmitReceive_DMA is successful.
However, when the exact same process is executed afterwards, all received values are 0.
The second send/receive with HAL_SPI_TransmitReceive_DMA is not successful.

Does anyone know why this is happening?

 

1 ACCEPTED SOLUTION

Accepted Solutions
TDK
Super User

What are you talking to?

Can you verify on a logic analyzer that the data coming in is non-zero?

Are you managing cache appropriately or is it turned off?

What specifically makes you think all received values are zero?

How are you observing them?

Does HAL_SPI_TransmitReceive_DMA return HAL_OK and does the transfer complete callback get called?

If you feel a post has answered your question, please click "Accept as Solution".

View solution in original post

3 REPLIES 3
pass3master
Senior

We are not sure if this is relevant, but I will post the SPI handle Structure values.

 

first dma_spi hspi1 SPI_HandleTypeDef {...} Instance SPI_TypeDef * 0x40013000 CR1 volatile uint32_t 0x1001 CR2 volatile uint32_t 0x0 CFG1 volatile uint32_t 0x70007 CFG2 volatile uint32_t 0x47400000 IER volatile uint32_t 0x0 SR volatile uint32_t 0x1002 IFCR volatile uint32_t 0x0 RESERVED0 uint32_t 0x0 TXDR volatile uint32_t 0x0 RESERVED1 uint32_t [3] 0x40013024 RESERVED1[0] uint32_t 0x0 RESERVED1[1] uint32_t 0x0 RESERVED1[2] uint32_t 0x0 RXDR volatile uint32_t 0x0 RESERVED2 uint32_t [3] 0x40013034 RESERVED2[0] uint32_t 0x0 RESERVED2[1] uint32_t 0x0 RESERVED2[2] uint32_t 0x0 CRCPOLY volatile uint32_t 0x107 TXCRC volatile uint32_t 0x0 RXCRC volatile uint32_t 0x0 UDRDR volatile uint32_t 0x0 I2SCFGR volatile uint32_t 0x0 Init SPI_InitTypeDef {...} Mode uint32_t 0x400000 Direction uint32_t 0x0 DataSize uint32_t 0x7 CLKPolarity uint32_t 0x2000000 CLKPhase uint32_t 0x1000000 NSS uint32_t 0x4000000 BaudRatePrescaler uint32_t 0x0 FirstBit uint32_t 0x0 TIMode uint32_t 0x0 CRCCalculation uint32_t 0x0 CRCPolynomial uint32_t 0x0 CRCLength uint32_t 0x0 NSSPMode uint32_t 0x40000000 NSSPolarity uint32_t 0x0 FifoThreshold uint32_t 0x0 TxCRCInitializationPattern uint32_t 0x0 RxCRCInitializationPattern uint32_t 0x0 MasterSSIdleness uint32_t 0x0 MasterInterDataIdleness uint32_t 0x0 MasterReceiverAutoSusp uint32_t 0x0 MasterKeepIOState uint32_t 0x0 IOSwap uint32_t 0x0 pTxBuffPtr const uint8_t * 0x0 *pTxBuffPtr const uint8_t 0x40 TxXferSize uint16_t 0x0 TxXferCount volatile uint16_t 0x0 pRxBuffPtr uint8_t * 0x0 *pRxBuffPtr uint8_t 0x40 RxXferSize uint16_t 0x0 RxXferCount volatile uint16_t 0x0 CRCSize uint32_t 0x0 RxISR void (*)(struct __SPI_HandleTypeDef *) 0x0 TxISR void (*)(struct __SPI_HandleTypeDef *) 0x0 hdmatx DMA_HandleTypeDef * 0x240714a8 Instance void * 0x40020058 Init DMA_InitTypeDef {...} Request uint32_t 0x26 Direction uint32_t 0x40 PeriphInc uint32_t 0x0 MemInc uint32_t 0x400 PeriphDataAlignment uint32_t 0x0 MemDataAlignment uint32_t 0x0 Mode uint32_t 0x0 Priority uint32_t 0x10000 FIFOMode uint32_t 0x0 FIFOThreshold uint32_t 0x0 MemBurst uint32_t 0x0 PeriphBurst uint32_t 0x0 Lock HAL_LockTypeDef 0x0 State volatile HAL_DMA_StateTypeDef 0x1 Parent void * 0x24071100 XferCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferHalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1CpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1HalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferErrorCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferAbortCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 ErrorCode volatile uint32_t 0x0 StreamBaseAddress uint32_t 0x40020000 StreamIndex uint32_t 0x16 DMAmuxChannel DMAMUX_Channel_TypeDef * 0x4002080c CCR volatile uint32_t 0x26 DMAmuxChannelStatus DMAMUX_ChannelStatus_TypeDef * 0x40020880 CSR volatile uint32_t 0x0 CFR volatile uint32_t 0x0 DMAmuxChannelStatusMask uint32_t 0x8 DMAmuxRequestGen DMAMUX_RequestGen_TypeDef * 0x0 RGCR volatile uint32_t 0x47868640 DMAmuxRequestGenStatus DMAMUX_RequestGenStatus_TypeDef * 0x0 RGSR volatile uint32_t 0x47868640 RGCFR volatile uint32_t 0x25d3796f DMAmuxRequestGenStatusMask uint32_t 0x0 hdmarx DMA_HandleTypeDef * 0x24071430 Instance void * 0x40020040 Init DMA_InitTypeDef {...} Request uint32_t 0x25 Direction uint32_t 0x0 PeriphInc uint32_t 0x0 MemInc uint32_t 0x400 PeriphDataAlignment uint32_t 0x0 MemDataAlignment uint32_t 0x0 Mode uint32_t 0x0 Priority uint32_t 0x10000 FIFOMode uint32_t 0x0 FIFOThreshold uint32_t 0x0 MemBurst uint32_t 0x0 PeriphBurst uint32_t 0x0 Lock HAL_LockTypeDef 0x0 State volatile HAL_DMA_StateTypeDef 0x1 Parent void * 0x24071100 XferCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferHalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1CpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1HalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferErrorCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferAbortCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 ErrorCode volatile uint32_t 0x0 StreamBaseAddress uint32_t 0x40020000 StreamIndex uint32_t 0x10 DMAmuxChannel DMAMUX_Channel_TypeDef * 0x40020808 CCR volatile uint32_t 0x25 DMAmuxChannelStatus DMAMUX_ChannelStatus_TypeDef * 0x40020880 CSR volatile uint32_t 0x0 CFR volatile uint32_t 0x0 DMAmuxChannelStatusMask uint32_t 0x4 DMAmuxRequestGen DMAMUX_RequestGen_TypeDef * 0x0 RGCR volatile uint32_t 0x47868640 DMAmuxRequestGenStatus DMAMUX_RequestGenStatus_TypeDef * 0x0 RGSR volatile uint32_t 0x47868640 RGCFR volatile uint32_t 0x25d3796f DMAmuxRequestGenStatusMask uint32_t 0x0 Lock HAL_LockTypeDef 0x0 State volatile HAL_SPI_StateTypeDef 0x1 ErrorCode volatile uint32_t 0x0 txdata[0] uint8_t 0x80 txdata[1] uint8_t 0x0 txdata[2] uint8_t 0x0 txdata[3] uint8_t 0x0 txdata[4] uint8_t 0x0 txdata[5] uint8_t 0x0
View more
second dma_spi hspi1 SPI_HandleTypeDef {...} Instance SPI_TypeDef * 0x40013000 CR1 volatile uint32_t 0x1000 CR2 volatile uint32_t 0x5 CFG1 volatile uint32_t 0x70007 CFG2 volatile uint32_t 0x47400000 IER volatile uint32_t 0x0 SR volatile uint32_t 0xe007 IFCR volatile uint32_t 0x0 RESERVED0 uint32_t 0x0 TXDR volatile uint32_t 0x0 RESERVED1 uint32_t [3] 0x40013024 RESERVED1[0] uint32_t 0x0 RESERVED1[1] uint32_t 0x0 RESERVED1[2] uint32_t 0x0 RXDR volatile uint32_t 0x0 RESERVED2 uint32_t [3] 0x40013034 RESERVED2[0] uint32_t 0x0 RESERVED2[1] uint32_t 0x0 RESERVED2[2] uint32_t 0x0 CRCPOLY volatile uint32_t 0x107 TXCRC volatile uint32_t 0x0 RXCRC volatile uint32_t 0x0 UDRDR volatile uint32_t 0x0 I2SCFGR volatile uint32_t 0x0 Init SPI_InitTypeDef {...} Mode uint32_t 0x400000 Direction uint32_t 0x0 DataSize uint32_t 0x7 CLKPolarity uint32_t 0x2000000 CLKPhase uint32_t 0x1000000 NSS uint32_t 0x4000000 BaudRatePrescaler uint32_t 0x0 FirstBit uint32_t 0x0 TIMode uint32_t 0x0 CRCCalculation uint32_t 0x0 CRCPolynomial uint32_t 0x0 CRCLength uint32_t 0x0 NSSPMode uint32_t 0x40000000 NSSPolarity uint32_t 0x0 FifoThreshold uint32_t 0x0 TxCRCInitializationPattern uint32_t 0x0 RxCRCInitializationPattern uint32_t 0x0 MasterSSIdleness uint32_t 0x0 MasterInterDataIdleness uint32_t 0x0 MasterReceiverAutoSusp uint32_t 0x0 MasterKeepIOState uint32_t 0x0 IOSwap uint32_t 0x0 pTxBuffPtr const uint8_t * 0x30000260 *pTxBuffPtr const uint8_t 0x80 TxXferSize uint16_t 0x5 TxXferCount volatile uint16_t 0x0 pRxBuffPtr uint8_t * 0x30000040 *pRxBuffPtr uint8_t 0x0 RxXferSize uint16_t 0x5 RxXferCount volatile uint16_t 0x0 CRCSize uint32_t 0x0 RxISR void (*)(struct __SPI_HandleTypeDef *) 0x0 TxISR void (*)(struct __SPI_HandleTypeDef *) 0x0 hdmatx DMA_HandleTypeDef * 0x240714a8 Instance void * 0x40020058 Init DMA_InitTypeDef {...} Lock HAL_LockTypeDef 0x0 State volatile HAL_DMA_StateTypeDef 0x1 Parent void * 0x24071100 XferCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferHalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1CpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1HalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferErrorCallback void (*)(struct __DMA_HandleTypeDef *) 0x800fe6f XferAbortCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 ErrorCode volatile uint32_t 0x0 StreamBaseAddress uint32_t 0x40020000 StreamIndex uint32_t 0x16 DMAmuxChannel DMAMUX_Channel_TypeDef * 0x4002080c DMAmuxChannelStatus DMAMUX_ChannelStatus_TypeDef * 0x40020880 DMAmuxChannelStatusMask uint32_t 0x8 DMAmuxRequestGen DMAMUX_RequestGen_TypeDef * 0x0 DMAmuxRequestGenStatus DMAMUX_RequestGenStatus_TypeDef * 0x0 DMAmuxRequestGenStatusMask uint32_t 0x0 hdmarx DMA_HandleTypeDef * 0x24071430 Instance void * 0x40020040 Init DMA_InitTypeDef {...} Request uint32_t 0x25 Direction uint32_t 0x0 PeriphInc uint32_t 0x0 MemInc uint32_t 0x400 PeriphDataAlignment uint32_t 0x0 MemDataAlignment uint32_t 0x0 Mode uint32_t 0x0 Priority uint32_t 0x10000 FIFOMode uint32_t 0x0 FIFOThreshold uint32_t 0x0 MemBurst uint32_t 0x0 PeriphBurst uint32_t 0x0 Lock HAL_LockTypeDef 0x0 State volatile HAL_DMA_StateTypeDef 0x1 Parent void * 0x24071100 XferCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x800fe0d XferHalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x800fe53 XferM1CpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferM1HalfCpltCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 XferErrorCallback void (*)(struct __DMA_HandleTypeDef *) 0x800fe6f XferAbortCallback void (*)(struct __DMA_HandleTypeDef *) 0x0 ErrorCode volatile uint32_t 0x0 StreamBaseAddress uint32_t 0x40020000 StreamIndex uint32_t 0x10 DMAmuxChannel DMAMUX_Channel_TypeDef * 0x40020808 CCR volatile uint32_t 0x25 DMAmuxChannelStatus DMAMUX_ChannelStatus_TypeDef * 0x40020880 CSR volatile uint32_t 0x0 CFR volatile uint32_t 0x0 DMAmuxChannelStatusMask uint32_t 0x4 DMAmuxRequestGen DMAMUX_RequestGen_TypeDef * 0x0 RGCR volatile uint32_t 0x47868640 DMAmuxRequestGenStatus DMAMUX_RequestGenStatus_TypeDef * 0x0 RGSR volatile uint32_t 0x47868640 RGCFR volatile uint32_t 0x25d3796f DMAmuxRequestGenStatusMask uint32_t 0x0 Lock HAL_LockTypeDef 0x0 State volatile HAL_SPI_StateTypeDef 0x1 ErrorCode volatile uint32_t 0x0 txdata[0] uint8_t 0x80 txdata[1] uint8_t 0x0 txdata[2] uint8_t 0x0 txdata[3] uint8_t 0x0 txdata[4] uint8_t 0x0 txdata[5] uint8_t 0x0
View more
TDK
Super User

What are you talking to?

Can you verify on a logic analyzer that the data coming in is non-zero?

Are you managing cache appropriately or is it turned off?

What specifically makes you think all received values are zero?

How are you observing them?

Does HAL_SPI_TransmitReceive_DMA return HAL_OK and does the transfer complete callback get called?

If you feel a post has answered your question, please click "Accept as Solution".
JBias
Associate III

I was seeing something similar on the STM32H7S3L8 except for me I was not getting the next callbacks unless I did a HAL_SPI_INIT as well as a HAL_DMA_INIT in between. Later I was able to reduce the time by optimizing out what was not needed. Of course, I would check the data stream coming in to verify that there is non-zero data as suggested by TDK

 

// HAL_SPI_Init(hspi); //1. Verify SPI Initialization <-- works but too long SPI3->IER |= SPI_IER_RXPIE | SPI_IER_EOTIE; // Enable RX Packet Interrupt, End of Transfer Interrupt <--works instead of full HAL_SPI_Init(hspi) // HAL_DMA_Init(&handle_HPDMA1_Channel15); //2. Confirm DMA Configuration <-- works but too long if ((HPDMA1_Channel14->CFCR != 0 )|(handle_HPDMA1_Channel14.Lock != HAL_UNLOCKED)|(handle_HPDMA1_Channel14.State != HAL_DMA_STATE_READY)) { __HAL_DMA_DISABLE(&handle_HPDMA1_Channel14); //Disable DMA to allow register changes __HAL_DMA_RESET_HANDLE_STATE(&handle_HPDMA1_Channel14); //Put into reset state to allow LOCK change todo needed ? __HAL_DMA_CLEAR_FLAG(&handle_HPDMA1_Channel14, (DMA_FLAG_TC | DMA_FLAG_HT | DMA_FLAG_DTE | DMA_FLAG_ULE | DMA_FLAG_USE | DMA_FLAG_SUSP | DMA_FLAG_TO)); //Clear all flags todo needed ? handle_HPDMA1_Channel14.Lock = HAL_UNLOCKED; //Unlock handle_HPDMA1_Channel14.State = HAL_DMA_STATE_READY; //Ready State HPDMA1_Channel14->CCR |= DMA_CCR_EN; //Restart DMA } // Restart DMA for continuous reception volatile uint8_t *vBuffer = &gS2_RxData[0]; //8-bit buffer HAL_SPI_Receive_DMA(hspi, (uint8_t *)vBuffer, gS2_RxSize); //DMA/SPI Start - Ready to receive