Регистры ArduChip
ArduChip — ядро платы Arducam, в качестве основного процессора в нём используется ПЛИС Altera MAX II CPLD EPM240. Главная задача ArduChip — передача данных по DMA в реальном времени между модулем камеры и ЖК-дисплеем 3.2", а также мультиплексирование шины между Arduino, камерой и дисплеем. Кроме того, ArduChip даёт расширение GPIO в стиле AVR: каждый вывод можно настроить как вход или выход, что решает проблему нехватки линий ввода-вывода на плате Arduino. Выводы GPIO можно использовать как входы и выходы сигналов-событий (триггеров).
| Адрес | Имя | Режим | Описание |
|---|---|---|---|
| 0 × 00 | DDR | R/W | Регистр направления данных. биты [7:6]: резерв; бит [5]: выбор входа/выхода IO5; бит [4]: выбор входа/выхода IO4; бит [3]: выбор входа/выхода IO3; бит [2]: выбор входа/выхода IO2; бит [1]: выбор входа/выхода IO1; бит [0]: выбор входа/выхода IO0. 1 = выход, 0 = вход |
| 0 × 01 | PORT | R/W | Регистр выходного порта. Значение отражается на выводах IO0–IO5 соответственно. биты [7:6]: резерв; бит [5]: выходное значение IO5; бит [4]: выходное значение IO4; бит [3]: выходное значение IO3; бит [2]: выходное значение IO2; бит [1]: выходное значение IO1; бит [0]: выходное значение IO0. 1 = высокий уровень, 0 = низкий |
| 0 × 03 | MODE | R/W | Режим шины. Определяет, кто владеет шиной данных; владелец может быть только один. биты [7:3]: резерв; бит [2]: MCU читает шину ЖК-дисплея; бит [1]: камера пишет в шину ЖК-дисплея; бит [0]: MCU пишет в шину ЖК-дисплея |
| 0 × 80 | PIN | RO | Регистр входных выводов. Значение отражает состояние выводов IO0–IO5 соответственно. биты [7:6]: резерв; бит [5]: входное значение IO5; бит [4]: входное значение IO4; бит [3]: входное значение IO3; бит [2]: входное значение IO2; бит [1]: входное значение IO1; бит [0]: входное значение IO0. 1 = высокий уровень, 0 = низкий |
| 0 × 81 | Trigger | RO | Регистр входа запуска. биты [7:2]: резерв; бит [1]: состояние кнопки съёмки, 0 = нажата, 1 = отпущена; бит [0]: сигнал начала кадра, совпадает с VSYNC |
| 0 × 82 | Revision ID | RO | биты [7:6]: целая часть номера версии; биты [5:0]: дробная часть номера версии. ID первой выпущенной версии — 0 × 40, что означает V1.00 |
Примеры:
Пример записи GPIO (ArduCAM GPIO Write demo)
// ArduCAM GPIO Write demo (C)2012 Lee
// web: http://www.ArduCAM.com
// This program is a demo of how to use GPIOs in ArduCAM to turn on/off
// LEDs or trigger any ohter devices.
//
// This program requires the ArduCAM library.
//
#include <Wire.h>
#include <ArduCAM.h>
#include <avr/pgmspace.h>
#include <SoftwareSerial.h>
#define ARDUCHIP_DDR 0x00 //GPIO direction register
#define ARDUCHIP_PORT 0x01 //GPIO output register
#define ARDUCHIP_PIN 0x80 //GPIO input register
//ArduCAM(byte model,int RS, int WR, int RD, int CS)
ArduCAM myCAM(OV7670,A2,A1,A0,A3);
//Uncomment if use software serial
SoftwareSerial mySerial(8, 9); // RX, TX
void setup()
{
mySerial.begin(9600);
mySerial.println("hello");
myCAM.write_reg( ARDUCHIP_DDR, 0xff); //Set GPIO as output
}
void loop()
{
uint8_t val = 0xff;
uint8_t read_val;
while(1)
{
delay(1000);
myCAM.write_reg( ARDUCHIP_PORT, val); //Output Register
val = val ^ 0xff; //toggle output value
read_val = myCAM.read_reg(ARDUCHIP_PORT); //Read it back
mySerial.write(read_val);
}
return;
}
Пример чтения GPIO (ArduCAM GPIO Read demo)
// ArduCAM GPIO Read demo (C)2012 Lee
// web: http://www.ArduCAM.com
// This program is a demo of how to use GPIOs in ArduCAM to read
// trigger signals from any ohter devices.
//
// This program requires the ArduCAM library.
//
#include <Wire.h>
#include <ArduCAM.h>
#include <avr/pgmspace.h>
#include <SoftwareSerial.h>
#define ARDUCHIP_DDR 0x00 //GPIO direction register
#define ARDUCHIP_PORT 0x01 //GPIO output register
#define ARDUCHIP_PIN 0x80 //GPIO input register
//ArduCAM(byte model,int RS, int WR, int RD, int CS)
ArduCAM myCAM(OV7670,A2,A1,A0,A3);
//Uncomment if use software serial
SoftwareSerial mySerial(8, 9); // RX, TX
void setup()
{
mySerial.begin(9600);
mySerial.println("hello");
myCAM.write_reg( ARDUCHIP_DDR, 0x00); //Set GPIO as input
}
void loop()
{
uint8_t temp;
while(1)
{
temp = myCAM.read_reg(ARDUCHIP_PIN); //Read from GPIO
mySerial.write(temp); //Send value read from GPIO
delay(1000);
}
return;
}
