Главная > Hard > Чтение регистров: Arduino due и ov7670

Чтение регистров: Arduino due и ov7670

Не прошло и полгода, как в руки мне попала плата Arduino Due. Работая на частоте 84МГц. она кажется больше подходящей для доступа к камере ov7670. Кроме высокой частоты достоинством является и рабочее напряжение 3V. Теперь оба устройства будут работать при одинаковом напряжении, что снижает риск испортить камеру при неправильном подключении резисторов.

Начать работу в камерой можно с простого упражнения  — чтение регистров.

Чтение регистров arduino due + ov7670

Для этого необходимо подать на камеру напряжение в 3.3 вольта, подключить XCLK к Pin 7, SIOC к Pin 21 и SIOD к Pin 20.

Схема подключения arduino due и ov7670

 Дальше необходимо подать на камеру сигнал с частотой более 8МГц. На arduino due получается без труда только 10.5МгЦ, поэтому его и будем использовать.

Код для чтения регистров приведён ниже (читаются только первый 50 регистров):

#include <Wire.h>
#include <SPI.h>

#define address (0x42 >> 1)

void setup() {
  Serial.begin(115200);
  Wire.begin();
  
  int32_t mask_PWM_pin = digitalPinToBitMask(7);
  REG_PMC_PCER1 = 1<<4;               // activate clock for PWM controller
  REG_PIOC_PDR |= mask_PWM_pin;  // activate peripheral functions for pin (disables all PIO functionality)
  REG_PIOC_ABSR |= mask_PWM_pin; // choose peripheral option B    
  REG_PWM_CLK = 0;                     // choose clock rate, 0 -> full MCLK as reference 84MHz
  REG_PWM_CMR6 = 0<<9;             // select clock and polarity for PWM channel (pin7) -> (CPOL = 0)
  REG_PWM_CPRD6 = 8;                // initialize PWM period -> T = value/84MHz (value: up to 16bit), value=8 -> 10.5MHz
  REG_PWM_CDTY6 = 4;                // initialize duty cycle, REG_PWM_CPRD6 / value = duty cycle, for 8/4 = 50%
  REG_PWM_ENA = 1<<6;               // enable PWM on PWM channel (pin 7 = PWML6)
}

void loop() {
  Serial.print("Looping ");    
  int i = 0;
  for (i = 0; i < 50 ;i++) {
    Serial.print("Register ");    
    Serial.print(i);    
    Serial.print(" = ");    
    Serial.println(read(i));    
  }
}


byte read(uint8_t regID){
  Wire.beginTransmission(address);
  Wire.write(regID & 0x00FF);    
  Wire.endTransmission();
  delay(1);
  Wire.requestFrom(address,1);
  if(Wire.available())
    return Wire.read(); 
  Serial.print("error read reg ");
  Serial.println(regID);
  return 0;
}

Результат:

Looping

Register 0 = 251
Register 1 = 128
Register 2 = 134
Register 3 = 0
Register 4 = 1
Register 5 = 123
Register 6 = 58
Register 7 = 64
Register 8 = 123
Register 9 = 1
Register 10 = 118
Register 11 = 115
Register 12 = 0
Register 13 = 0
Register 14 = 1
Register 15 = 67
Register 16 = 127
Register 17 = 128
Register 18 = 0
Register 19 = 143
Register 20 = 74
Register 21 = 0
Register 22 = 0
Register 23 = 17
Register 24 = 97
Register 25 = 3
Register 26 = 123
Register 27 = 0
Register 28 = 127
Register 29 = 162
Register 30 = 1
Register 31 = 0
Register 32 = 4
Register 33 = 2
Register 34 = 1
Register 35 = 0
Register 36 = 117
Register 37 = 99
Register 38 = 212
Register 39 = 128
Register 40 = 128
Register 41 = 7
Register 42 = 0
Register 43 = 0
Register 44 = 128
Register 45 = 0
Register 46 = 0
Register 47 = 58
Register 48 = 8
Register 49 = 48

UPD (02.07.2016): Боюсь, что значение регистров выводится неправильное. Делал попытки записать в несколько регистров определённые величины и потом их считать, но результат не совпадал. Есть подозрение, что проблема в связке TWI <-> SCCB.

Categories: Hard Tags: , ,
  1. Andrew
    28 Июнь 2016 в 12:23 | #1

    Hi! is the Arduino 101 compatible with your arduino bluetooth ov7670 project? sorry i know you dont have one but maybe by looking at schematics you could tell? i know its a big request but if you could iam grateful! here are specs .. 32 bit ( intel curie processor ) ..clock rate is 32 mhz .. 3.3v .. Thank You!

    • Admin
      28 Июнь 2016 в 21:25 | #2

      Hardware seems to be suitable. I think you can reuse Android app from «arduino bluetooth ov7670 project».

  1. Пока что нет уведомлений.