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 бібліотеки OV9655 (Камера через DCMI)
// Hinweis  : Ці два файли повинні бути на 8MHz
//              "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 і окрема бібліотека для використання в інших проектах. Автор оригіналу статті просить ставити запитання на його сайті німецькою або англійською мовами.

Оригінал статті

Прикріплені файли:

Top