STM32H7 SPI DMA not working
STM32H7 SPI DMA not working
Hi. I have stm32H745 nucleo board, in my project i want send data from MOSI via DMA (i did the same on old F4 discovery correctly).
PE_14, SPI4 , DMA2_stream3, DMUX11=84 (for tx spi4)
In project i need to send data (fb[][]) then generated interrupt. For exam for correct work the IRQ_handler inside interrupt function i switched PG_9.
It did not work, dma don't send data, there no switching PG_9 inside handler function.
Could anybody help me ?
Me code bellow
Function for SPI_DMA initialisation:
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
SPI_HandleTypeDef SpiHandle;
//static
DMA_HandleTypeDef hdma_tx;
#define SPIx SPI4
#define SPIx_MOSI_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define SPIx_CLK_ENABLE() __HAL_RCC_SPI4_CLK_ENABLE()
#define DMAx_CLK_ENABLE() __HAL_RCC_DMA2_CLK_ENABLE()
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* Enable GPIO TX/RX clock */
SPIx_MOSI_GPIO_CLK_ENABLE();
/* Enable SPI1 clock */
SPIx_CLK_ENABLE();
/* Enable DMA clock */
DMAx_CLK_ENABLE();
// Common configuration for all channels
GPIO_InitStructure.Pin = GPIO_PIN_14 ;
GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStructure.Alternate = GPIO_AF5_SPI4;
HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
/*##-3- Configure the DMA ##################################################*/
/* Configure the DMA handler for Transmission process */
hdma_tx.Instance = DMA2_Stream3; // SPI4 maybe?
hdma_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_tx.Init.MemBurst = DMA_MBURST_INC4;
hdma_tx.Init.PeriphBurst = DMA_PBURST_INC4;
hdma_tx.Init.Request = DMA_REQUEST_SPI4_TX;
hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_tx.Init.Mode = DMA_NORMAL;
hdma_tx.Init.Priority = DMA_PRIORITY_LOW;
HAL_DMA_Init(&hdma_tx);
/* Associate the initialized DMA handle to the the SPI handle */
//__HAL_LINKDMA(SPI4, hdmatx, hdma_tx); // navisho ???
/*##-1- Configure the SPI peripheral #######################################*/
/* Set the SPI parameters */
SpiHandle.Instance = SPI4;
SpiHandle.Init.Mode = SPI_MODE_MASTER;
SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; // use 4 for 400 pixels, 2 for 800 pixels
SpiHandle.Init.Direction = SPI_DIRECTION_1LINE;
SpiHandle.Init.CLKPhase = SPI_PHASE_2EDGE;
SpiHandle.Init.CLKPolarity = SPI_POLARITY_LOW;
SpiHandle.Init.DataSize = SPI_DATASIZE_8BIT;
SpiHandle.Init.FirstBit = SPI_FIRSTBIT_MSB;
SpiHandle.Init.TIMode = SPI_TIMODE_DISABLE;
SpiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SpiHandle.Init.CRCPolynomial = 7;
SpiHandle.Init.CRCLength = SPI_CRC_LENGTH_8BIT;
SpiHandle.Init.NSS = SPI_NSS_SOFT;
SpiHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
SpiHandle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* Recommanded setting to avoid glitches */
HAL_SPI_Init(&SpiHandle);
/*##-4- Configure the NVIC for DMA #########################################*/
/* NVIC configuration for DMA transfer complete interrupt (SPI4_TX) */
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 1, 1);
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
SPI4->CR1 &= ~SPI_CR1_SPE;
// SPI4->CR2 = 7;
DMA_STREAM->CR&= ~DMA_SxCR_EN; // clear the EN bit to disable the stream
DMA_STREAM->PAR = (uint32_t) &(SPI4->TXDR);
DMA_STREAM->NDTR = VTOTAL; // set number of bytes to transfer
DMA_STREAM->M0AR = (u32) &fb[0][0]; // set start of frame buffer
DMA_STREAM->CR|=DMA_SxCR_CIRC | DMA_SxCR_TCIE;
DMAMUX1_Channel11->CCR = 84; //SPI4_TX vs DMA2_Stream3;
DMAMUX1_Channel11->CCR |=DMAMUX_CxCR_EGE ; //| DMAMUX_SPI1_RX_ID;
//SPI4->IER |= SPI_IER_TXPIE;
SPI4->CFG1 |= SPI_CFG1_TXDMAEN;
//SPI4->CR1 |= SPI_CR1_CSTART;
SPI4->CR1 |= SPI_CR1_SPE;
DMA_STREAM->CR|= DMA_SxCR_EN; // set the EN bit to disable the stream
// DMAMUX1 channels 8 to 15 are connected to DMA2 channels 0 to 7
// 84 spi4_tx_dma
// DMA1_Stream_x -> DMAMUX1_Channel_x
//DMA2_Stream_x -> DMAMUX1_Channel_(x+8)
}
Function for Interrupt
void DMA2_Stream3_IRQHandler(void)
{
VIDEO_DMA->LIFCR = DMA_LIFCR_CTCIF3; // clear the transfer complete interrupt flag
DMA_STREAM->CR &= ~DMA_SxCR_EN; // clear the EN bit to disable the stream
DMA_STREAM->NDTR = VTOTAL; // reload the number of bytes to send
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_9);
}