Question
STM32H7 HAL SPI DMA Not receiving data
I'm having a problem using DMA with SPI.
Fault is almost certainly me as this is the first time I have used SPI/DMA. Normally I just wait for SPI to finish, but on this occasion it is taking too long so I need to move the process away from the CPU waiting.
When I use normal SPI_TransmitReceive it is all ok so not suspecting a hardware problem. I'm not familiar with DMA at all, so not sure whether to use FIFO, circular buffers or how to allow enough space for the 27 Byte transfer.
RxBuffer is always 0x00...
Receive/Tx:
/Read all 8 channels
void SPI_ADC_READ(uint8_t ADCn)
{
uint8_t Cmd[27] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//HAL_SPI_TransmitReceive(&ADC_SPI, Cmd, ADC_DATA, 27, 1000);
// HAL_SPI_TransmitReceive(&ADC_SPI, Cmd, ADS1298RData.ByteValue, 27, 1000);
// counter1++;
// HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size);
HAL_SPI_TransmitReceive_DMA(&ADC_SPI, Cmd, RxBuffer, 27);
counter1++;
}SPI/DMA config
/* SPI3 init function */
void MX_SPI_ADC_Init(void)
{
/* SPI3 parameter configuration*/
ADC_SPI.Instance = SPI4;
ADC_SPI.Init.Mode = SPI_MODE_MASTER;
ADC_SPI.Init.Direction = SPI_DIRECTION_2LINES;
ADC_SPI.Init.DataSize = SPI_DATASIZE_8BIT;
ADC_SPI.Init.CLKPolarity = SPI_POLARITY_LOW;
ADC_SPI.Init.CLKPhase = SPI_PHASE_2EDGE;//1EDGE or 2
ADC_SPI.Init.NSS = SPI_NSS_SOFT;
ADC_SPI.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
ADC_SPI.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2 is 20Mhz which is flat out for the ADC
ADC_SPI.Init.FirstBit = SPI_FIRSTBIT_MSB;
ADC_SPI.Init.TIMode = SPI_TIMODE_DISABLE;
ADC_SPI.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
ADC_SPI.Init.CRCPolynomial = 10;
ADC_SPI.Init.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE;
//New for DMA
ADC_SPI.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
//Configure the Peripheral
HAL_SPI_Init(&ADC_SPI);
/* Configure the DMA handler for Transmission process */
hdma_spi4_rx.Instance = DMA1_Stream0;
hdma_spi4_rx.Init.Request = DMA_REQUEST_SPI4_RX;
hdma_spi4_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_spi4_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_spi4_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_spi4_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_spi4_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_spi4_rx.Init.Mode = DMA_NORMAL;
hdma_spi4_rx.Init.Priority = DMA_PRIORITY_LOW;
hdma_spi4_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&hdma_spi4_rx);
__HAL_LINKDMA(&ADC_SPI,hdmarx,hdma_spi4_rx);
/* SPI4 interrupt Init */
HAL_NVIC_SetPriority(SPI4_DMA_TX_IRQn, 1, 1);
HAL_NVIC_EnableIRQ(SPI4_DMA_TX_IRQn);
/* NVIC configuration for DMA transfer complete interrupt (SPI1_RX) */
HAL_NVIC_SetPriority(SPI4_DMA_RX_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(SPI4_DMA_RX_IRQn);
/*##-5- Configure the NVIC for SPI #########################################*/
/* NVIC configuration for SPI transfer complete interrupt (SPI1) */
HAL_NVIC_SetPriority(SPI4_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(SPI4_IRQn);
}
