cancel
Showing results for 
Search instead for 
Did you mean: 

STM32N6 PSSI with GPDMA Over-run Error

Neuraleanus
Associate II

I am attempting to get a PSSI interface to an ADC working on the STM32N657.  Due to the speed, it is necessary to use DMA.  I'm seeing an over-run error from the error call-back.

The clock is produced from one of the PWM timers, presently set to 1MHz, but will eventually need to be increased to 10MHz.  This is tied to the PSSI clock input.  The clock signal looks very good:

Neuraleanus_0-1779304600684.png

Here is the PSSI setup:

static void MX_PSSI_Init(void)
{
  /* USER CODE BEGIN PSSI_Init 0 */
  // handle_GPDMA1_Channel0.Instance = GPDMA1_Channel0;
  handle_GPDMA1_Channel0.Instance = GPDMA1_Channel12;
  // handle_GPDMA1_Channel0.Instance = HPDMA1_Channel12;
  handle_GPDMA1_Channel0.Init.Request = GPDMA1_REQUEST_DCMI_PSSI;
  handle_GPDMA1_Channel0.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
  handle_GPDMA1_Channel0.Init.Direction = DMA_PERIPH_TO_MEMORY;
  handle_GPDMA1_Channel0.Init.SrcInc = DMA_SINC_FIXED;
  handle_GPDMA1_Channel0.Init.DestInc = DMA_DINC_INCREMENTED;
  handle_GPDMA1_Channel0.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_HALFWORD;
  handle_GPDMA1_Channel0.Init.DestDataWidth = DMA_DEST_DATAWIDTH_HALFWORD;
  handle_GPDMA1_Channel0.Init.Priority = DMA_HIGH_PRIORITY;
  handle_GPDMA1_Channel0.Init.SrcBurstLength = 1;
  handle_GPDMA1_Channel0.Init.DestBurstLength = 1;
  handle_GPDMA1_Channel0.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
  handle_GPDMA1_Channel0.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
  handle_GPDMA1_Channel0.Init.Mode = DMA_NORMAL;
  if (HAL_DMA_Init(&handle_GPDMA1_Channel0) != HAL_OK)
  {
    Error_Handler();
  }
  // __HAL_LINKDMA(hpssi, hdmarx, handle_GPDMA1_Channel0);
  if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel0, DMA_CHANNEL_SEC | DMA_CHANNEL_NPRIV) != HAL_OK)
  {
      Error_Handler();
  }
  /* USER CODE END PSSI_Init 0 */

  /* USER CODE BEGIN PSSI_Init 1 */
  hpssi.hdmarx = &handle_GPDMA1_Channel0;
  handle_GPDMA1_Channel0.Parent = (void *)&hpssi;
  hpssi.hdmatx = NULL;
  /* USER CODE END PSSI_Init 1 */
  hpssi.Instance = PSSI;
  hpssi.Init.DataWidth = HAL_PSSI_16BITS;
  hpssi.Init.BusWidth = HAL_PSSI_16LINES;
  hpssi.Init.ControlSignal = HAL_PSSI_RDY_ENABLE;
  hpssi.Init.ClockPolarity = HAL_PSSI_FALLING_EDGE;
  hpssi.Init.DataEnablePolarity = HAL_PSSI_DEPOL_ACTIVE_HIGH;
  hpssi.Init.ReadyPolarity = HAL_PSSI_RDYPOL_ACTIVE_HIGH;
  if (HAL_PSSI_Init(&hpssi) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN PSSI_Init 2 */
  // External clock
  HAL_PSSI_ClockConfig(&hpssi, HAL_PSSI_CLOCK_EXT);
}

I noticed that the PSSI DMA setup is missing from STM32CubeMX so I added it manually.  The data transfer is attempted by calling:

  ret_code = HAL_PSSI_Receive_DMA(&hpssi, (uint32_t *)dop, INPUT_BUFFER_SIZE*sizeof(short));
  if (ret_code != HAL_OK)
  {
    // Busy?
    if (ret_code == HAL_BUSY)
      printf("PSSI Reception is busy! ");
    else
    {
      printf("PSSI reception error %u! ", ret_code);
      /* Stop PWM generation */
      // Stop_Clock_Generation();
    }
  }
  else
  {
    printf("PSSI Reception started! ");
  }

The first call to HAL_PSSI_Receive_DMA() returns HAL_OK and then I get the error call-back.  The transfer complete call-back never occurs.

Any idea what is wrong?  Could this be a case where the security stuff from FSBL is preventing normal operation?

 

0 REPLIES 0