STM32F4. Урок 27 — Подключение камеры OV9655

В данной библиотеке описывается подключение модуля цифровой камеры 1,3МПикселя (на базе контроллера OV9655) с использованием DMA через интерфейс DCMI к отладочной плате TM32F4 Discovery.

Стоимость модуля на Ebay составляет примерно 15 евро. Камера имеет разрешение 1280х1024 (SXGA) и глубину цвета 16 бит. Связь с чипом осуществляется через I2C (400кГц максимум), а данные изображения передаются по 8ми битной шине DCMI. Поддерживаются 15 и 30 кадров в секунду.

В данной статье автор реализует просмотр изображения на ЖК-дисплее, на данный момент имеются библиотеки для работы с QVGA дисплеем (320×240) и QQVGA (160×120). Передача осуществляется через DMA для разгрузки процессора и более плавного отображения на дисплее (на данный момент картинка отображается зеркально). Версия библиотеки 1.1 позволяет сохранять снимки. Если выбрано разрешение 160х120 пикселей, снимок может быть сохранен в оперативную память. Полученное изображение может быть в итоге может быть преобразовано из массива в памяти в BMP формат с помощью библиотеки “UB_OV9655_RAM2BMP”. Данные могут быть переданы через UART (для этого требуется подключение UART-библиотеки).

Примечание: некоторые DCMI-порты процессора на модуле Discovery уже заняты кодеком CS43L22 и акселерометром LIS302 (PA4, PA6, PB6, PB9, PC7). Проблем с работой камеры замечено не было, однако, две микросхемы, наверное, одновременно не могут быть использованы.

Важное замечание по отладочной плате: При использовании отладочной платы необходимо переподключить два пина. Стандартное подключение DCMI (CON6) предусматривает использование D2 и D3 на пинах процессора PE0 и PE1. Но эти порты используются для обработки прерываний LIS302 и линии всегда подтянуты к низкому уровню!! Автор подключает эти линии к выводам PC8 и PC9, которые также являются линиями D2 и D3 шины DCMI.

Еще одно замечание: 18 пиновый разъем CON6, помеченный как OV9655, не совсем совместим по пинам, поэтому необходимо припаять переходник. Модуль камеры требует подачи частоты (10-48МГц). В примере используется генератор 16МГц, по умолчанию используется 24МГц, но у автора его не было:-) Для работы с дисплеем и I2C-шиной используется две библиотеки «STM32_UB_LCD_ST7783» и «STM32_UB_I2C1». Для отображения на QQVGA используется библиотека версии 1.5.

Пример исполнения:

Используемые выводы и DMA:

 PA4  -> DCMI_HSYNC  = Camera HSYNC (HREF) PA6  -> DCMI_PCLK   = Camera PIXCLK (PCLK) PB6  -> DCMI_D5     = Camera D5 (D7) PB7  -> DCMI_VSYNC  = Camera VSYNC (VSYNC) PB8  -> I2C1-SCL    = Camera I2C-SCL (SIOC) PB9  -> I2C1-SDA    = Camera I2C-SDA (SIOD) PC6  -> DCMI_D0     = Camera D0 (D2) PC7  -> DCMI_D1     = Camera D1 (D3) PC8  -> DCMI_D2     = Camera D2 (D4) PC9  -> DCMI_D3     = Camera D3 (D5) PE4  -> DCMI_D4     = Camera D4 (D6) PE5  -> DCMI_D6     = Camera D6 (D8) PE6  -> DCMI_D7     = Camera D7 (D9)    (*) Текст в скобках соответствует выводу на модуле OV9655       DMA : или DMA2_STREAM1_CHANNEL1            или DMA2_STREAM7_CHANNEL1       Camera (GND)  = GND      Camera (Vcc)  = 3,3V      Camera (XCLK) = 24MHz (10...48MHz)      Camera (PWDN) = nc      Camera (RET)  = nc

Требуемые библиотеки:

Подключаемые модули CooCox-IDE: DCMI, DMA
Поддерживаемые библиотеки: STM32_UB_I2C1, STM32_UB_LCD_ST7783

Перечисления:

 typedef enum {   OV9655_OK =0,    // OV9655 OK   OV9655_I2C_ERR,  // Ошибка I2C   OV9655_MIDH_ERR, // Ошибка ID-HIByte   OV9655_MIDL_ERR, // Ошибка ID-LoByte   OV9655_PID_ERR,  // Ошибка Produkt-ID   OV9655_LCD_ERR   // Ошибка Display }OV9655_ERR_t;

Функции:

 OV9655_ERR_t UB_OV9655_Init(void);  // Инициализация OV9655 void UB_OV9655_CaptureStart(void);  // Запуск режима Capture void UB_OV9655_CaptureStop(void);   // Остановка режима Capture void UB_OV9655_Snapshot(void);      // Сделать один снимок void UB_OV9655_SetHelligkeit(uint8_t wert); // Регулировка яркости void UB_OV9655_Snapshot2RAM(void);          // Сохранить снимок в памяти void UB_OV9655_RAM2BMP(void);               // Создать файл в формате BMP

Пример использования:

 //-------------------------------------------------------------- // File     : main.c // Datum    : 29.03.2013 // Version  : 1.0 // Autor    : UB // EMail    : mc-4u(@)t-online.de // Web      : www.mikrocontroller-4u.de // CPU      : STM32F4 // IDE      : CooCox CoIDE 1.7.0 // Module   : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der OV9655-Library (Camera per DCMI) // Hinweis  : Diese zwei Files muessen auf 8MHz stehen //              "cmsis_boot/stm32f4xx.h" //              "cmsis_boot/system_stm32f4xx.c" //--------------------------------------------------------------  #include "main.h" #include "stm32_ub_ov9655.h"  int main(void) {   OV9655_ERR_t check;    SystemInit(); // Инициализация настроек кварца    // Инициализация модуля камеры (OV9655)   check=UB_OV9655_Init();   if(check==OV9655_OK) {     // Если прошла успешно -> Запуск в режиме Capture 	UB_OV9655_CaptureStart();   }   else {     // Если ошибка 	// Сделать экран красным 	UB_LCD_FillScreen(RGB_COL_RED);   }    while(1)   {    } } 

В приложении проект CooCox и отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.