cancel
Showing results for 
Search instead for 
Did you mean: 

Data Loss in DCMI Interface of STM32F407VG Micro-controller

shweta.G
Associate

Hi,

I am working on DCMI interface of STM32f407VGT micro controller to connect external device(not camera).And i am trying to get data from external device using 8-bit parallel data lines and PIXCLK frequency as 6.3MHz. Also providing H SYNC and V SYNC Signals as Hardware Synchronization.Always i am getting data from external device(Parallel) but initial data is missing .So how can i get proper data from external device without losing initial data.

Here is my configuration and Initialization code.

//GPIO Configuration

/**DCMI GPIO Configuration

  PE4   ------> DCMI_D4

  PE5   ------> DCMI_D6

  PE6   ------> DCMI_D7

  PA4   ------> DCMI_HSYNC

  PA6   ------> DCMI_PIXCK

  PC6   ------> DCMI_D0

  PC7   ------> DCMI_D1

  PC8   ------> DCMI_D2

  PC9   ------> DCMI_D3

  PB6   ------> DCMI_D5

  PB7   ------> DCMI_VSYNC 

*/

  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

  GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

   

  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

  GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_4;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_PULLDOWN;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

  GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

  GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;

  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;

  GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

//DCMI Initialization

static void MX_DCMI_Init(void)

{

 hdcmi.Instance = DCMI;

 hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;

 hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;

 hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;

 hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_HIGH;

 hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;

 hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;

 hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;

 if (HAL_DCMI_Init(&hdcmi) != HAL_OK)

 {

  Error_Handler();

 }

}

//DMA Initialization

  hdma_dcmi.Instance = DMA2_Stream1;

  hdma_dcmi.Init.Channel = DMA_CHANNEL_1;

  hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY;

  hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE;

  hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE;

  hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;

  hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

  hdma_dcmi.Init.Mode = DMA_NORMAL;

  hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH;

  hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

  if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK)

  {

Error_Handler();

  }

//MAIN CODE

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_DMA_Init(void);

static void MX_DCMI_Init(void);

int main(void)

{

 HAL_Init();

 SystemClock_Config();

 MX_GPIO_Init();

 MX_DMA_Init();

 MX_DCMI_Init();

/* USER CODE */

 if(HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)pData, 512)!= HAL_OK)

 {

  Error_Handler();

 }

 while (1)

 {

  if(DataRecieved)

   {

    DataRecieved = 0;

   }

 }

}

/**

 * @User Callback (peripheral_ Memory transfer complete)

 * @retval None

 */

void XfercmpltcallBack(DCMI_HandleTypeDef *hdcmi)

{

   if(hdcmi->Instance == DCMI)

   {

    if(HAL_DCMI_Start_DMA(hdcmi, DCMI_MODE_CONTINUOUS, (uint32_t)pData, 512) != HAL_OK)

{

  Error_Handler();

}

 DataRecieved++;

   }

}

/**

 * @brief System Clock Configuration

 * @retval None

 */

void SystemClock_Config(void)

{

 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

 /**Configure the main internal regulator output voltage 

 */

 __HAL_RCC_PWR_CLK_ENABLE();

 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

 /**Initializes the CPU, AHB and APB busses clocks 

 */

 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;

 RCC_OscInitStruct.PLL.PLLM = 8;

 RCC_OscInitStruct.PLL.PLLN = 50;

 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;

 RCC_OscInitStruct.PLL.PLLQ = 7;

 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

 {

  Error_Handler();

 }

 /**Initializes the CPU, AHB and APB busses clocks 

 */

 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV8;

 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;

 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

 {

  Error_Handler();

 }

}

2 REPLIES 2

How many frames of data do you lose and how do you flag to the device that you're ready to accept data?​

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

Only last 4-bits of data i am losing in initial frame.

Here for the first time i am enabling capture bit (DCMI_CR Register) so it captures data from external device and it performs memory transfer operation after that if memory transfer is done than i am again enabling capture bit using user callback function (XfercmpltcallBack(hdcmi) ).

 hdcmi->Instance->CR |= DCMI_CR_CAPTURE;

/**

 * @brief DMA conversion complete callback.

 * @param hdma pointer to a DMA_HandleTypeDef structure that contains

 *        the configuration information for the specified DMA module.

 * @retval None

 */

static void DCMI_DMAXferCplt(DMA_HandleTypeDef *hdma)

{

 uint32_t tmp = 0U;

 DCMI_HandleTypeDef* hdcmi = ( DCMI_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->Parent;

   

 if(hdcmi->XferCount != 0U)

 {

  /* Update memory 0 address location */

  tmp = ((hdcmi->DMA_Handle->Instance->CR) & DMA_SxCR_CT);

  if(((hdcmi->XferCount % 2U) == 0U) && (tmp != 0U))

  {

   tmp = hdcmi->DMA_Handle->Instance->M0AR;

   HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U*hdcmi->XferSize)), MEMORY0);

   hdcmi->XferCount--;

  }

  /* Update memory 1 address location */

  else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)

  {

   tmp = hdcmi->DMA_Handle->Instance->M1AR;

   HAL_DMAEx_ChangeMemory(hdcmi->DMA_Handle, (tmp + (8U*hdcmi->XferSize)), MEMORY1);

   hdcmi->XferCount--;

  }

 }

 /* Update memory 0 address location */

 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) != 0U)

 {

  hdcmi->DMA_Handle->Instance->M0AR = hdcmi->pBuffPtr;

 }

 /* Update memory 1 address location */

 else if((hdcmi->DMA_Handle->Instance->CR & DMA_SxCR_CT) == 0U)

 {

  tmp = hdcmi->pBuffPtr;

  hdcmi->DMA_Handle->Instance->M1AR = (tmp + (4U*hdcmi->XferSize));

  hdcmi->XferCount = hdcmi->XferTransferNumber;

 }

  

 /* Check if the frame is transferred */

 if(hdcmi->XferCount == hdcmi->XferTransferNumber)

 {

  /* Enable the Frame interrupt */

  __HAL_DCMI_ENABLE_IT(hdcmi, DCMI_IT_FRAME);

  /* When snapshot mode, set dcmi state to ready */

  if((hdcmi->Instance->CR & DCMI_CR_CM) == DCMI_MODE_SNAPSHOT)

  {  

   hdcmi->State= HAL_DCMI_STATE_READY;

  }

  /* User callback after Frame interrupt(transferred) */

  if(DCMI_IT_FRAME)

  {

  XfercmpltcallBack(hdcmi);

  }

 }