OV7670 + 23LC1024 + Bluetooth

Dependencies:   FastPWM MODSERIAL mbed

Committer:
sampullman
Date:
Tue Jul 23 06:36:50 2013 +0000
Revision:
2:a7f5fa80a385
Parent:
OC7670.cpp@1:6e4d2cff76e8
Fixed OV7670.cpp file name

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sampullman 0:f309a2b2f27b 1 #include "OV7670.h"
sampullman 0:f309a2b2f27b 2
sampullman 0:f309a2b2f27b 3 OV7670::OV7670(
sampullman 0:f309a2b2f27b 4 PinName sda, // Camera I2C port
sampullman 0:f309a2b2f27b 5 PinName scl, // Camera I2C port
sampullman 0:f309a2b2f27b 6 PinName xclk,// Camera XCLK
sampullman 0:f309a2b2f27b 7 PinName pclkPin,// PCLK
sampullman 0:f309a2b2f27b 8 PinName vs, // VSYNC
sampullman 0:f309a2b2f27b 9 PinName hr, // HREF
sampullman 0:f309a2b2f27b 10
sampullman 0:f309a2b2f27b 11 PortName port, // 8bit bus port
sampullman 0:f309a2b2f27b 12 int mask // 0000 0111 4000 0111 1000 0000 0000 0000 = 0x07878000
sampullman 0:f309a2b2f27b 13
sampullman 1:6e4d2cff76e8 14 ) : camera(sda,scl), data(port, mask), inPort(Port2, 0x0000001C), spi(p5, p6, p7), ram(spi, p8)
sampullman 0:f309a2b2f27b 15 {
sampullman 0:f309a2b2f27b 16 camera.stop();
sampullman 0:f309a2b2f27b 17 camera.frequency(OV7670_I2CFREQ);
sampullman 0:f309a2b2f27b 18 xclkPin = xclk;
sampullman 1:6e4d2cff76e8 19 spi.frequency(16000000);
sampullman 1:6e4d2cff76e8 20 size = 0;
sampullman 0:f309a2b2f27b 21 }
sampullman 0:f309a2b2f27b 22
sampullman 0:f309a2b2f27b 23 void OV7670::Init() {
sampullman 0:f309a2b2f27b 24 FastPWM clkOut(xclkPin);
sampullman 0:f309a2b2f27b 25 double pclk_period_us = (1.0 / 16000000.0)*1000000;
sampullman 0:f309a2b2f27b 26 clkOut.period_us(pclk_period_us);
sampullman 0:f309a2b2f27b 27 clkOut.pulsewidth_us(pclk_period_us/2.0);
sampullman 0:f309a2b2f27b 28 wait_ms(50);
sampullman 0:f309a2b2f27b 29 }
sampullman 0:f309a2b2f27b 30
sampullman 0:f309a2b2f27b 31 void OV7670::WriteReg(int addr, int data) {
sampullman 0:f309a2b2f27b 32 // WRITE 0x42, ADDR, DATA
sampullman 0:f309a2b2f27b 33 camera.start();
sampullman 0:f309a2b2f27b 34 camera.write(OV7670_WRITE);
sampullman 0:f309a2b2f27b 35 wait_us(OV7670_WRITEWAIT);
sampullman 0:f309a2b2f27b 36 camera.write(addr);
sampullman 0:f309a2b2f27b 37 wait_us(OV7670_WRITEWAIT);
sampullman 0:f309a2b2f27b 38 camera.write(data);
sampullman 0:f309a2b2f27b 39 camera.stop();
sampullman 0:f309a2b2f27b 40 }
sampullman 0:f309a2b2f27b 41
sampullman 0:f309a2b2f27b 42 int OV7670::ReadReg(int addr) {
sampullman 0:f309a2b2f27b 43 int data;
sampullman 0:f309a2b2f27b 44
sampullman 0:f309a2b2f27b 45 // WRITE 0x42,ADDR
sampullman 0:f309a2b2f27b 46 camera.start();
sampullman 0:f309a2b2f27b 47 camera.write(OV7670_WRITE);
sampullman 0:f309a2b2f27b 48 wait_us(OV7670_WRITEWAIT);
sampullman 0:f309a2b2f27b 49 camera.write(addr);
sampullman 0:f309a2b2f27b 50 camera.stop();
sampullman 0:f309a2b2f27b 51 wait_us(OV7670_WRITEWAIT);
sampullman 0:f309a2b2f27b 52
sampullman 0:f309a2b2f27b 53 // WRITE 0x43,READ
sampullman 0:f309a2b2f27b 54 camera.start();
sampullman 0:f309a2b2f27b 55 camera.write(OV7670_READ);
sampullman 0:f309a2b2f27b 56 wait_us(OV7670_WRITEWAIT);
sampullman 0:f309a2b2f27b 57 data = camera.read(OV7670_NOACK);
sampullman 0:f309a2b2f27b 58 camera.stop();
sampullman 0:f309a2b2f27b 59
sampullman 0:f309a2b2f27b 60 return data;
sampullman 0:f309a2b2f27b 61 }
sampullman 0:f309a2b2f27b 62
sampullman 0:f309a2b2f27b 63 void OV7670::Reset(void) {
sampullman 0:f309a2b2f27b 64 WriteReg(0x12,0x80) ; // RESET CAMERA
sampullman 0:f309a2b2f27b 65 wait_ms(200) ;
sampullman 0:f309a2b2f27b 66 }
sampullman 0:f309a2b2f27b 67
sampullman 0:f309a2b2f27b 68 void OV7670::InitQQVGA() {
sampullman 0:f309a2b2f27b 69 // QQVGA RGB444
sampullman 0:f309a2b2f27b 70 WriteReg(REG_CLKRC,0x03);
sampullman 0:f309a2b2f27b 71 WriteReg(REG_COM11,0x0A) ;
sampullman 0:f309a2b2f27b 72 WriteReg(REG_TSLB,0x04);
sampullman 0:f309a2b2f27b 73 WriteReg(REG_COM7,0x04) ;
sampullman 0:f309a2b2f27b 74
sampullman 0:f309a2b2f27b 75 WriteReg(REG_RGB444, 0x00); // Disable RGB 444?
sampullman 0:f309a2b2f27b 76 WriteReg(REG_COM15, 0xD0); // Set RGB 565?
sampullman 0:f309a2b2f27b 77
sampullman 0:f309a2b2f27b 78 WriteReg(REG_HSTART,0x16) ;
sampullman 0:f309a2b2f27b 79 WriteReg(REG_HSTOP,0x04) ;
sampullman 0:f309a2b2f27b 80 WriteReg(REG_HREF,0x24) ;
sampullman 0:f309a2b2f27b 81 WriteReg(REG_VSTART,0x02) ;
sampullman 0:f309a2b2f27b 82 WriteReg(REG_VSTOP,0x7a) ;
sampullman 0:f309a2b2f27b 83 WriteReg(REG_VREF,0x0a) ;
sampullman 0:f309a2b2f27b 84 WriteReg(REG_COM10,0x02) ;
sampullman 0:f309a2b2f27b 85 WriteReg(REG_COM3, 0x04);
sampullman 0:f309a2b2f27b 86 WriteReg(REG_COM14, 0x1a);
sampullman 0:f309a2b2f27b 87 WriteReg(REG_MVFP,0x27) ;
sampullman 0:f309a2b2f27b 88 WriteReg(0x72, 0x22);
sampullman 0:f309a2b2f27b 89 WriteReg(0x73, 0xf2);
sampullman 0:f309a2b2f27b 90
sampullman 0:f309a2b2f27b 91 // COLOR SETTING
sampullman 0:f309a2b2f27b 92 WriteReg(0x4f,0x80);
sampullman 0:f309a2b2f27b 93 WriteReg(0x50,0x80);
sampullman 0:f309a2b2f27b 94 WriteReg(0x51,0x00);
sampullman 0:f309a2b2f27b 95 WriteReg(0x52,0x22);
sampullman 0:f309a2b2f27b 96 WriteReg(0x53,0x5e);
sampullman 0:f309a2b2f27b 97 WriteReg(0x54,0x80);
sampullman 0:f309a2b2f27b 98 WriteReg(0x56,0x40);
sampullman 0:f309a2b2f27b 99 WriteReg(0x58,0x9e);
sampullman 0:f309a2b2f27b 100 WriteReg(0x59,0x88);
sampullman 0:f309a2b2f27b 101 WriteReg(0x5a,0x88);
sampullman 0:f309a2b2f27b 102 WriteReg(0x5b,0x44);
sampullman 0:f309a2b2f27b 103 WriteReg(0x5c,0x67);
sampullman 0:f309a2b2f27b 104 WriteReg(0x5d,0x49);
sampullman 0:f309a2b2f27b 105 WriteReg(0x5e,0x0e);
sampullman 0:f309a2b2f27b 106 WriteReg(0x69,0x00);
sampullman 0:f309a2b2f27b 107 WriteReg(0x6a,0x40);
sampullman 0:f309a2b2f27b 108 WriteReg(0x6b,0x0a);
sampullman 0:f309a2b2f27b 109 WriteReg(0x6c,0x0a);
sampullman 0:f309a2b2f27b 110 WriteReg(0x6d,0x55);
sampullman 0:f309a2b2f27b 111 WriteReg(0x6e,0x11);
sampullman 0:f309a2b2f27b 112 WriteReg(0x6f,0x9f);
sampullman 0:f309a2b2f27b 113
sampullman 0:f309a2b2f27b 114 WriteReg(0xb0,0x84);
sampullman 1:6e4d2cff76e8 115 size = 160 * 120 * 2;
sampullman 0:f309a2b2f27b 116 }
sampullman 0:f309a2b2f27b 117
sampullman 0:f309a2b2f27b 118 void OV7670::scopeTest(Serial *host) {
sampullman 0:f309a2b2f27b 119 Timer t1, t2;
sampullman 0:f309a2b2f27b 120 int LED = 0x80000000;
sampullman 0:f309a2b2f27b 121 PortInOut status(Port1, LED);
sampullman 0:f309a2b2f27b 122 status = LED;
sampullman 0:f309a2b2f27b 123 int cycles = 1000000;
sampullman 0:f309a2b2f27b 124 while(inPort & 0x00000008) {};
sampullman 0:f309a2b2f27b 125 while(!(inPort & 0x00000008)) {};
sampullman 0:f309a2b2f27b 126 t1.start();
sampullman 0:f309a2b2f27b 127 while(cycles--) {
sampullman 0:f309a2b2f27b 128 while(!(inPort & 0x00000010)) {};
sampullman 0:f309a2b2f27b 129 while(inPort & 0x00000010) {};
sampullman 0:f309a2b2f27b 130 }
sampullman 0:f309a2b2f27b 131 status = 0;
sampullman 0:f309a2b2f27b 132 t1.stop();
sampullman 0:f309a2b2f27b 133 printf("One million cycles: %d\n\r", t1.read_us());
sampullman 0:f309a2b2f27b 134 //printf("Avg on, off = %d, %d\n\r", t1.read_us()/100, t2.read_us()/100);
sampullman 0:f309a2b2f27b 135 }
sampullman 0:f309a2b2f27b 136
sampullman 1:6e4d2cff76e8 137 int OV7670::captureImage() {
sampullman 0:f309a2b2f27b 138 int d, i=0;
sampullman 0:f309a2b2f27b 139 int byte = 0;
sampullman 0:f309a2b2f27b 140 Timer t1;
sampullman 1:6e4d2cff76e8 141 // Prepare SRAM output
sampullman 1:6e4d2cff76e8 142 ram.startWriteSequence();
sampullman 0:f309a2b2f27b 143 // Read in the first half of the image
sampullman 0:f309a2b2f27b 144 while(inPort & 0x00000008) {}; // Wait for VSYNC low
sampullman 0:f309a2b2f27b 145 while(!(inPort & 0x00000008)) {}; // Wait for VSYNC high
sampullman 0:f309a2b2f27b 146 //t1.start();
sampullman 0:f309a2b2f27b 147 while(inPort & 0x00000008) { // While VSYNC high
sampullman 0:f309a2b2f27b 148 while((inPort & 0x00000008) && !(inPort & 0x00000004)) {}; // stall while VSYNC high and HREF low
sampullman 0:f309a2b2f27b 149 if(!(inPort & 0x00000008)) { // if VSYNC low
sampullman 0:f309a2b2f27b 150 //printf("Interrupted!\n\r");
sampullman 0:f309a2b2f27b 151 break;
sampullman 0:f309a2b2f27b 152 }
sampullman 0:f309a2b2f27b 153 while (inPort & 0x00000004) { // While HREF high
sampullman 0:f309a2b2f27b 154 while(!(inPort & 0x00000010)) {}; // Wait for PCLK high
sampullman 0:f309a2b2f27b 155 d = data;
sampullman 0:f309a2b2f27b 156 byte = (d & 0x07800000) >> 19; // bit26 to bit7
sampullman 0:f309a2b2f27b 157 byte |= (d & 0x00078000) >> 15; // bit18 to bit3
sampullman 1:6e4d2cff76e8 158 //arr1[i] = byte;
sampullman 1:6e4d2cff76e8 159 ram.writeSequence1(byte);
sampullman 0:f309a2b2f27b 160 while(inPort & 0x00000010) {}; // Wait for PCLK low
sampullman 0:f309a2b2f27b 161 while(!(inPort & 0x00000010)) {}; // Wait for PCLK high
sampullman 0:f309a2b2f27b 162 d = data;
sampullman 0:f309a2b2f27b 163 byte = (d & 0x07800000) >> 19; // bit26 to bit7
sampullman 0:f309a2b2f27b 164 byte |= (d & 0x00078000) >> 15; // bit18 to bit3
sampullman 1:6e4d2cff76e8 165 ram.writeSequence1(byte);
sampullman 1:6e4d2cff76e8 166 //arr2[i++] = byte;
sampullman 0:f309a2b2f27b 167 while(inPort & 0x00000010) {};
sampullman 1:6e4d2cff76e8 168 i++;
sampullman 0:f309a2b2f27b 169 }
sampullman 0:f309a2b2f27b 170 }
sampullman 1:6e4d2cff76e8 171 //t1.stop();
sampullman 1:6e4d2cff76e8 172 ram.stopSequence();
sampullman 0:f309a2b2f27b 173 //printf("Image read: %d\n\r", t1.read_us());
sampullman 0:f309a2b2f27b 174 return i*2;
sampullman 0:f309a2b2f27b 175 }
sampullman 1:6e4d2cff76e8 176
sampullman 1:6e4d2cff76e8 177
sampullman 1:6e4d2cff76e8 178 void OV7670::sendImage(Serial *dest, int numBytes) {
sampullman 1:6e4d2cff76e8 179 Timer t;
sampullman 1:6e4d2cff76e8 180 Serial host = *dest;
sampullman 1:6e4d2cff76e8 181 // Write the image to the serial host
sampullman 1:6e4d2cff76e8 182 ram.startReadSequence();
sampullman 1:6e4d2cff76e8 183 t.start();
sampullman 1:6e4d2cff76e8 184 for (int i = 0; i < numBytes; i++) {
sampullman 1:6e4d2cff76e8 185 while(!(host.writeable())) {}
sampullman 1:6e4d2cff76e8 186 host.putc(ram.readSequence1());
sampullman 1:6e4d2cff76e8 187 }
sampullman 1:6e4d2cff76e8 188 t.stop();
sampullman 1:6e4d2cff76e8 189 printf("BT time: %d\n\r", t.read_us());
sampullman 1:6e4d2cff76e8 190 ram.stopSequence();
sampullman 1:6e4d2cff76e8 191 }
sampullman 0:f309a2b2f27b 192