Skip to main content
wyattcurtis
Associate
November 13, 2019
Question

DCMI only triggering line interrupt

  • November 13, 2019
  • 2 replies
  • 982 views

I have an OV7670 camera that I am trying to capture images with. I am able to communicate with and set registers for the camera. When power, GND, and XLCK (16 MHz) pins are supplied to the pin I am also able to detect that proper image data is being sent via a logic analyzer.

When acquiring the image (via HAL drivers), I only ever receive an infinite amount of "Line Interrupts" which execute the callback function HAL_DCMI_LineEventCallback. Whether I try to perform an acquisition in snapshot or continuous mode, I still receive an infinite amount of these interrupts. I also never receive any other interrupts or error functions. What could be causing this?

Shouldn't I only ever receive the amount of line interrupts associated with a single image in snapshot mode? I believe I have enabled all DCMI interrupts, is this not the case? Why am I not receiving any other interrupts? Could this be an error on the DMA side of things?

If I understand this code correctly, once the snapshot has been taken the pixel data should simply be allocated in the data_buffer variable?

DCMI Initialization:

void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi)
{
 GPIO_InitTypeDef GPIO_InitStruct = {0};
 if(hdcmi->Instance==DCMI)
 {
 /* USER CODE BEGIN DCMI_MspInit 0 */
 
 /* USER CODE END DCMI_MspInit 0 */
 /* Peripheral clock enable */
 __HAL_RCC_DCMI_CLK_ENABLE();
 
 __HAL_RCC_GPIOE_CLK_ENABLE();
 __HAL_RCC_GPIOA_CLK_ENABLE();
 __HAL_RCC_GPIOC_CLK_ENABLE();
 __HAL_RCC_GPIOB_CLK_ENABLE();
 /**DCMI GPIO Configuration 
 PE4 ------> DCMI_D4
 PE5 ------> DCMI_D6
 PE6 ------> DCMI_D7
 PA4 ------> DCMI_HSYNC
 PA6 ------> DCMI_PIXCLK
 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_LOW;
 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_LOW;
 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_LOW;
 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_LOW;
 GPIO_InitStruct.Alternate = GPIO_AF13_DCMI;
 HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
 /* DCMI DMA Init */
 /* DCMI Init */
 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_LOW;
 hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
 hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
 hdma_dcmi.Init.MemBurst = DMA_MBURST_INC4;
 hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE;
 if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK)
 {
 Error_Handler();
 }
 
 __HAL_LINKDMA(hdcmi,DMA_Handle,hdma_dcmi);
 
 /* DCMI interrupt Init */
 HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0);
 HAL_NVIC_EnableIRQ(DCMI_IRQn);
 /* USER CODE BEGIN DCMI_MspInit 1 */
 
 /* USER CODE END DCMI_MspInit 1 */
 }
 
}

Main Function:

int main(void)
{
 /* USER CODE BEGIN 1 */
 
 /* USER CODE END 1 */
 
 
 /* MCU Configuration--------------------------------------------------------*/
 
 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();
 
 /* USER CODE BEGIN Init */
	
 
 /* USER CODE END Init */
 
 /* Configure the system clock */
 SystemClock_Config();
 
 /* USER CODE BEGIN SysInit */
 
 /* USER CODE END SysInit */
 
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_DMA_Init();
 MX_DCMI_Init();
 /* USER CODE BEGIN 2 */
	Delay_Init(); //Set up sccb delay pins
	BB_SCCB_HardwareInit(); //set up sccb communication pins
	Init_OV7670();		//write camera registers to desired values
	
	uint32_t data_buffer;		//define buffer to store pixel data
 
	
	HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, data_buffer, 320*240/2); //capture in snapshot
	
 /* USER CODE END 2 */
 
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */
 
 /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
}

This topic has been closed for replies.

2 replies

waclawek.jan
Super User
November 13, 2019

Are you sure it's the line interrupt? Is it cleared properly in the ISR? Do you need the line interrupt? If not, disable it - any difference?

For general troubleshooting, read out and check the DCMI registers' content.

I don't use DCMI, I don't Cube.

JW

wyattcurtis
Associate
November 14, 2019

Yes I am sure it is line interrupt. I have spent a significant amount of time in the debugger watching it trigger in the DCMI registers. Turning off the interrupt makes it so no interrupts are transmitted