AnsweredAssumed Answered

Infinite loop issue with spi_dma

Question asked by DOSS FOF on May 24, 2017
Latest reply on May 29, 2017 by DOSS FOF

 Hello everyone,

I'm using SPI with DMA and the programme seems working well , but after one execution of SPI_tramit_DMA function the programme get into infinite loop :

 

      Default_Handler:
         Infinite_Loop:
          b    Infinite_Loop
          .size    Default_Handler, .-Default_Handler

 

and I don't manage to solve this issue. Someone have the idea about that.

 

Below are main() and spi_init function :

 

#include "stm32l4xx_nucleo_32.h"
#include <string.h>
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    /* STM32L4xx HAL library initialization:429496729
       - Configure the Flash prefetch, instruction and Data caches
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
     */

    HAL_Init();

    // Configure the system clock to 32 Mhz
    OscConfig();
    ClockConfig();

 

    //Initialization
    SPI1_init();

    SPI_DMA1_Transmit();
    while(1){}
}

 

void SPI1_init(void)
{
    GPIO_InitTypeDef GPIO_init_struct;

 

    // Peripheral clock enable /
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_SPI1_CLK_ENABLE();

 

    //    SPI1 GPIO Configuration
    //    PA6     ------> SPI1_MISO
    //    PA7     ------> SPI1_MOSI
    //    PA1     ------> SPI1_SCK
    //      PA5      ------> SPI_CS

 

    GPIO_init_struct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_init_struct.Mode = GPIO_MODE_AF_PP;
    GPIO_init_struct.Pull = GPIO_NOPULL ;
    GPIO_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_init_struct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_init_struct);

 

    GPIO_init_struct.Pin = GPIO_PIN_1 |GPIO_PIN_4;
    GPIO_init_struct.Mode = GPIO_MODE_AF_PP;
    GPIO_init_struct.Pull = GPIO_NOPULL ;
    GPIO_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_init_struct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_init_struct);

 

    SPI_init_struct.Instance = SPI1;
    SPI_init_struct.Init.Mode = SPI_MODE_MASTER;
    SPI_init_struct.Init.Direction = SPI_DIRECTION_1LINE;
    SPI_init_struct.Init.DataSize = SPI_DATASIZE_8BIT;
    SPI_init_struct.Init.CLKPolarity = SPI_POLARITY_LOW;
    SPI_init_struct.Init.CLKPhase = SPI_PHASE_1EDGE;
    SPI_init_struct.Init.NSS = SPI_NSS_HARD_OUTPUT ;//SPI_NSS_SOFT;
    SPI_init_struct.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
    SPI_init_struct.Init.FirstBit = SPI_FIRSTBIT_MSB;
    SPI_init_struct.Init.TIMode = SPI_TIMODE_DISABLE;
    SPI_init_struct.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    SPI_init_struct.Init.CRCPolynomial = 7;
    SPI_init_struct.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
    SPI_init_struct.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;// SPI_NSS_PULSE_DISABLE;

 

   if (HAL_OK != HAL_SPI_Init(&SPI_init_struct)) {
        SPI_Error_Handler();
    }
}

 

void HAL_SPI_MspInit (SPI_HandleTypeDef *hspi)// DMA_Init(void)
{
      /* DMA controller clock enable */

 

    __HAL_RCC_DMA1_CLK_ENABLE();

 


        DMA1_init_struct.Instance = DMA1_Channel3;
        DMA1_init_struct.Init.Request = DMA_REQUEST_1;
        DMA1_init_struct.Init.Direction          = DMA_MEMORY_TO_PERIPH;       
        DMA1_init_struct.Init.Mode               = DMA_NORMAL ;
        DMA1_init_struct.Init.Priority           = DMA_PRIORITY_HIGH;     
        DMA1_init_struct.Init.MemDataAlignment   = DMA_MDATAALIGN_WORD ;
        DMA1_init_struct.Init.MemInc             = DMA_MINC_ENABLE;            
        DMA1_init_struct.Init.PeriphDataAlignment= DMA_PDATAALIGN_WORD;
        DMA1_init_struct.Init.PeriphInc          = DMA_PINC_DISABLE;   

 

        // Initialize the DMA stream ...
        if (HAL_DMA_Init(&DMA1_init_struct) != HAL_OK)
            {
            SPI_Error_Handler();

 

        __HAL_LINKDMA(hspi, hdmatx, DMA1_init_struct);

 

          /* DMA interrupt init */
          /* DMA1_Channel3_IRQn interrupt configuration */
         HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0,0);
         HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);

 

}
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
{

 

    if(hspi->Instance == SPI1)
      {
        /*##-1- Reset peripherals ##################################################*/
        __HAL_RCC_SPI1_FORCE_RESET();
        __HAL_RCC_SPI1_RELEASE_RESET();

 

        /*##-2- Disable peripherals and GPIO Clocks ################################*/
        /* Deconfigure SPI SCK */
        HAL_GPIO_DeInit(GPIOA,GPIO_PIN_1);
        /* Deconfigure SPI CS */
        HAL_GPIO_DeInit(GPIOA,GPIO_PIN_4);
        /* Deconfigure SPI MOSI */
        HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7);

 

        /*##-3- Disable the DMA ####################################################*/
        /* De-Initialize the DMA associated to transmission process */
        HAL_DMA_DeInit(&DMA1_init_struct);

 

        /*##-4- Disable the NVIC for DMA ###########################################*/
        HAL_NVIC_DisableIRQ(DMA1_Channel3_IRQn);

 

      }
}

 

void SPI1_DMA_TX_IRQHandler()
{
            HAL_DMA_IRQHandler(&DMA1_init_struct);
  }

 

void SPI_DMA1_Transmit(void)
{

 

                        if (HAL_OK !=HAL_SPI_Transmit_DMA(&SPI_init_struct, Txdata,16))
                        {
                            SPI_Error_Handler();
                        };


}

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
  {
    DMA1_init_struct.Instance->CCR = 0u;
    DMA1_init_struct.Instance->CNDTR = 16;

 

  }

Outcomes