Уже куда только не писал, пытаюсь запустить камеру OV7670 на STM32F429
Работаю с халом, ибо приходится.
При попытки забрать данных с буфера он оказывается пустым, на дисплее черный экран
Для теста записал в первую ячейку белый пиксель - выводиться, но остальны ячейки по нулям, DMA даже не прикосается к массиву
Прерывания работают, DMA2_Stream1_IRQHandler срабатывает один раз сразу после вызова HAL_DCMI_Start_DMA(). DCMI_IRQHandler срабатывает просто очень часто, если вынуть камеру - все перестает работаеть (значит, данные то идут?)
Думаю, не стоит говорить о том, что инициализация по I2C тоже проходит успешно
Код инициализации для ленивых:
// Настрока DCMI и DMA
uint8_t DCMI_DMA_init(void){
GPIO_InitTypeDef GPIO_InitStruct;
DCMI_HandleTypeDef *hdcmi = &OV7670_hdcmi_eval;
// Тактирование
__GPIOE_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOC_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
__DCMI_CLK_ENABLE();
__DMA2_CLK_ENABLE();
// .... DCMI порты (обрезано, чтоб не грузить читателя) ....
// DMA ( - изначально)
OV7670_hdma.Init.Direction = DMA_PERIPH_TO_MEMORY;
OV7670_hdma.Init.PeriphInc = DMA_PINC_DISABLE;
OV7670_hdma.Init.MemInc = DMA_MINC_ENABLE;
OV7670_hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
OV7670_hdma.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; // DMA_MDATAALIGN_WORD - DMA_MDATAALIGN_HALFWORD
OV7670_hdma.Init.Mode = DMA_NORMAL; // DMA_CIRCULAR - DMA_NORMAL
OV7670_hdma.Init.Priority = DMA_PRIORITY_HIGH;
OV7670_hdma.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // DMA_FIFOMODE_DISABLE - DMA_FIFOMODE_ENABLE
OV7670_hdma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
OV7670_hdma.Init.MemBurst = DMA_MBURST_SINGLE;
OV7670_hdma.Init.PeriphBurst = DMA_PBURST_SINGLE;
OV7670_hdma.Instance = DMA2_Stream1;
// DCMI
hdcmi->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi->Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi->Init.HSPolarity = DCMI_HSPOLARITY_LOW;
hdcmi->Init.VSPolarity = DCMI_VSPOLARITY_HIGH;
hdcmi->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
hdcmi->Init.JPEGMode = DCMI_JPEG_DISABLE;
hdcmi->Instance = DCMI;
// Прерывание по завершении передачи
HAL_NVIC_SetPriority(DCMI_IRQn, 5, 1);
HAL_NVIC_EnableIRQ(DCMI_IRQn);
// Прерывание при полном приеме
HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
// Связываем DMA с DCMI
__HAL_LINKDMA(hdcmi, DMA_Handle, OV7670_hdma);
// Инициализация DCMI
if(HAL_DCMI_Init(hdcmi) != HAL_OK){
return 0;
}
// Инициализация DMA
if(HAL_DMA_Init(hdcmi->DMA_Handle) != HAL_OK){
return 0;
}
return 1;
}
Пытаюсь получить картинку так:
if(HAL_DCMI_Start_DMA(&OV7670_hdcmi_eval, DCMI_MODE_SNAPSHOT, &OV7670_buffer, (uint32_t)((IMG_ROWS * IMG_COLUMNS * 2) / 4)) != HAL_OK){
LCD_ILI9341_Puts(100, 165, "Error DMA", &LCD_Font_16x26, ILI9341_COLOR_WHITE, ILI9341_COLOR_BLACK);
}
HAL_Delay(100);
LCD_ILI9341_DisplayImage((uint16_t*)OV7670_buffer);
А вот файлы для того, кому не лень:
main.c: http://code.re/8fG
OV7670.c: http://code.re/8fF
OV7670.h: http://code.re/8fE
Меня волнуют слейдущие моменты:
- Подтяжка портов к плюсу
- DMA_FIFOMODE_ENABLE
- DMA_MDATAALIGN_HALFWORD
- мод DMA - DMA_NORMAL
- клок камеры настроеный на 16МГц