OV7670 + 23LC1024 + Bluetooth
Dependencies: FastPWM MODSERIAL mbed
Revision 2:a7f5fa80a385, committed 2013-07-23
- Comitter:
- sampullman
- Date:
- Tue Jul 23 06:36:50 2013 +0000
- Parent:
- 1:6e4d2cff76e8
- Commit message:
- Fixed OV7670.cpp file name
Changed in this revision
OC7670.cpp | Show diff for this revision Revisions of this file |
OV7670.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/OC7670.cpp Tue Jul 23 06:33:27 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -#include "OV7670.h" - -OV7670::OV7670( - PinName sda, // Camera I2C port - PinName scl, // Camera I2C port - PinName xclk,// Camera XCLK - PinName pclkPin,// PCLK - PinName vs, // VSYNC - PinName hr, // HREF - - PortName port, // 8bit bus port - int mask // 0000 0111 4000 0111 1000 0000 0000 0000 = 0x07878000 - - ) : camera(sda,scl), data(port, mask), inPort(Port2, 0x0000001C), spi(p5, p6, p7), ram(spi, p8) -{ - camera.stop(); - camera.frequency(OV7670_I2CFREQ); - xclkPin = xclk; - spi.frequency(16000000); - size = 0; -} - -void OV7670::Init() { - FastPWM clkOut(xclkPin); - double pclk_period_us = (1.0 / 16000000.0)*1000000; - clkOut.period_us(pclk_period_us); - clkOut.pulsewidth_us(pclk_period_us/2.0); - wait_ms(50); -} - -void OV7670::WriteReg(int addr, int data) { - // WRITE 0x42, ADDR, DATA - camera.start(); - camera.write(OV7670_WRITE); - wait_us(OV7670_WRITEWAIT); - camera.write(addr); - wait_us(OV7670_WRITEWAIT); - camera.write(data); - camera.stop(); -} - -int OV7670::ReadReg(int addr) { - int data; - - // WRITE 0x42,ADDR - camera.start(); - camera.write(OV7670_WRITE); - wait_us(OV7670_WRITEWAIT); - camera.write(addr); - camera.stop(); - wait_us(OV7670_WRITEWAIT); - - // WRITE 0x43,READ - camera.start(); - camera.write(OV7670_READ); - wait_us(OV7670_WRITEWAIT); - data = camera.read(OV7670_NOACK); - camera.stop(); - - return data; -} - -void OV7670::Reset(void) { - WriteReg(0x12,0x80) ; // RESET CAMERA - wait_ms(200) ; -} - -void OV7670::InitQQVGA() { - // QQVGA RGB444 - WriteReg(REG_CLKRC,0x03); - WriteReg(REG_COM11,0x0A) ; - WriteReg(REG_TSLB,0x04); - WriteReg(REG_COM7,0x04) ; - - WriteReg(REG_RGB444, 0x00); // Disable RGB 444? - WriteReg(REG_COM15, 0xD0); // Set RGB 565? - - WriteReg(REG_HSTART,0x16) ; - WriteReg(REG_HSTOP,0x04) ; - WriteReg(REG_HREF,0x24) ; - WriteReg(REG_VSTART,0x02) ; - WriteReg(REG_VSTOP,0x7a) ; - WriteReg(REG_VREF,0x0a) ; - WriteReg(REG_COM10,0x02) ; - WriteReg(REG_COM3, 0x04); - WriteReg(REG_COM14, 0x1a); - WriteReg(REG_MVFP,0x27) ; - WriteReg(0x72, 0x22); - WriteReg(0x73, 0xf2); - - // COLOR SETTING - WriteReg(0x4f,0x80); - WriteReg(0x50,0x80); - WriteReg(0x51,0x00); - WriteReg(0x52,0x22); - WriteReg(0x53,0x5e); - WriteReg(0x54,0x80); - WriteReg(0x56,0x40); - WriteReg(0x58,0x9e); - WriteReg(0x59,0x88); - WriteReg(0x5a,0x88); - WriteReg(0x5b,0x44); - WriteReg(0x5c,0x67); - WriteReg(0x5d,0x49); - WriteReg(0x5e,0x0e); - WriteReg(0x69,0x00); - WriteReg(0x6a,0x40); - WriteReg(0x6b,0x0a); - WriteReg(0x6c,0x0a); - WriteReg(0x6d,0x55); - WriteReg(0x6e,0x11); - WriteReg(0x6f,0x9f); - - WriteReg(0xb0,0x84); - size = 160 * 120 * 2; -} - -void OV7670::scopeTest(Serial *host) { - Timer t1, t2; - int LED = 0x80000000; - PortInOut status(Port1, LED); - status = LED; - int cycles = 1000000; - while(inPort & 0x00000008) {}; - while(!(inPort & 0x00000008)) {}; - t1.start(); - while(cycles--) { - while(!(inPort & 0x00000010)) {}; - while(inPort & 0x00000010) {}; - } - status = 0; - t1.stop(); - printf("One million cycles: %d\n\r", t1.read_us()); - //printf("Avg on, off = %d, %d\n\r", t1.read_us()/100, t2.read_us()/100); -} - -int OV7670::captureImage() { - int d, i=0; - int byte = 0; - Timer t1; - // Prepare SRAM output - ram.startWriteSequence(); - // Read in the first half of the image - while(inPort & 0x00000008) {}; // Wait for VSYNC low - while(!(inPort & 0x00000008)) {}; // Wait for VSYNC high - //t1.start(); - while(inPort & 0x00000008) { // While VSYNC high - while((inPort & 0x00000008) && !(inPort & 0x00000004)) {}; // stall while VSYNC high and HREF low - if(!(inPort & 0x00000008)) { // if VSYNC low - //printf("Interrupted!\n\r"); - break; - } - while (inPort & 0x00000004) { // While HREF high - while(!(inPort & 0x00000010)) {}; // Wait for PCLK high - d = data; - byte = (d & 0x07800000) >> 19; // bit26 to bit7 - byte |= (d & 0x00078000) >> 15; // bit18 to bit3 - //arr1[i] = byte; - ram.writeSequence1(byte); - while(inPort & 0x00000010) {}; // Wait for PCLK low - while(!(inPort & 0x00000010)) {}; // Wait for PCLK high - d = data; - byte = (d & 0x07800000) >> 19; // bit26 to bit7 - byte |= (d & 0x00078000) >> 15; // bit18 to bit3 - ram.writeSequence1(byte); - //arr2[i++] = byte; - while(inPort & 0x00000010) {}; - i++; - } - } - //t1.stop(); - ram.stopSequence(); - //printf("Image read: %d\n\r", t1.read_us()); - return i*2; -} - - -void OV7670::sendImage(Serial *dest, int numBytes) { - Timer t; - Serial host = *dest; - // Write the image to the serial host - ram.startReadSequence(); - t.start(); - for (int i = 0; i < numBytes; i++) { - while(!(host.writeable())) {} - host.putc(ram.readSequence1()); - } - t.stop(); - printf("BT time: %d\n\r", t.read_us()); - ram.stopSequence(); -} - \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OV7670.cpp Tue Jul 23 06:36:50 2013 +0000 @@ -0,0 +1,192 @@ +#include "OV7670.h" + +OV7670::OV7670( + PinName sda, // Camera I2C port + PinName scl, // Camera I2C port + PinName xclk,// Camera XCLK + PinName pclkPin,// PCLK + PinName vs, // VSYNC + PinName hr, // HREF + + PortName port, // 8bit bus port + int mask // 0000 0111 4000 0111 1000 0000 0000 0000 = 0x07878000 + + ) : camera(sda,scl), data(port, mask), inPort(Port2, 0x0000001C), spi(p5, p6, p7), ram(spi, p8) +{ + camera.stop(); + camera.frequency(OV7670_I2CFREQ); + xclkPin = xclk; + spi.frequency(16000000); + size = 0; +} + +void OV7670::Init() { + FastPWM clkOut(xclkPin); + double pclk_period_us = (1.0 / 16000000.0)*1000000; + clkOut.period_us(pclk_period_us); + clkOut.pulsewidth_us(pclk_period_us/2.0); + wait_ms(50); +} + +void OV7670::WriteReg(int addr, int data) { + // WRITE 0x42, ADDR, DATA + camera.start(); + camera.write(OV7670_WRITE); + wait_us(OV7670_WRITEWAIT); + camera.write(addr); + wait_us(OV7670_WRITEWAIT); + camera.write(data); + camera.stop(); +} + +int OV7670::ReadReg(int addr) { + int data; + + // WRITE 0x42,ADDR + camera.start(); + camera.write(OV7670_WRITE); + wait_us(OV7670_WRITEWAIT); + camera.write(addr); + camera.stop(); + wait_us(OV7670_WRITEWAIT); + + // WRITE 0x43,READ + camera.start(); + camera.write(OV7670_READ); + wait_us(OV7670_WRITEWAIT); + data = camera.read(OV7670_NOACK); + camera.stop(); + + return data; +} + +void OV7670::Reset(void) { + WriteReg(0x12,0x80) ; // RESET CAMERA + wait_ms(200) ; +} + +void OV7670::InitQQVGA() { + // QQVGA RGB444 + WriteReg(REG_CLKRC,0x03); + WriteReg(REG_COM11,0x0A) ; + WriteReg(REG_TSLB,0x04); + WriteReg(REG_COM7,0x04) ; + + WriteReg(REG_RGB444, 0x00); // Disable RGB 444? + WriteReg(REG_COM15, 0xD0); // Set RGB 565? + + WriteReg(REG_HSTART,0x16) ; + WriteReg(REG_HSTOP,0x04) ; + WriteReg(REG_HREF,0x24) ; + WriteReg(REG_VSTART,0x02) ; + WriteReg(REG_VSTOP,0x7a) ; + WriteReg(REG_VREF,0x0a) ; + WriteReg(REG_COM10,0x02) ; + WriteReg(REG_COM3, 0x04); + WriteReg(REG_COM14, 0x1a); + WriteReg(REG_MVFP,0x27) ; + WriteReg(0x72, 0x22); + WriteReg(0x73, 0xf2); + + // COLOR SETTING + WriteReg(0x4f,0x80); + WriteReg(0x50,0x80); + WriteReg(0x51,0x00); + WriteReg(0x52,0x22); + WriteReg(0x53,0x5e); + WriteReg(0x54,0x80); + WriteReg(0x56,0x40); + WriteReg(0x58,0x9e); + WriteReg(0x59,0x88); + WriteReg(0x5a,0x88); + WriteReg(0x5b,0x44); + WriteReg(0x5c,0x67); + WriteReg(0x5d,0x49); + WriteReg(0x5e,0x0e); + WriteReg(0x69,0x00); + WriteReg(0x6a,0x40); + WriteReg(0x6b,0x0a); + WriteReg(0x6c,0x0a); + WriteReg(0x6d,0x55); + WriteReg(0x6e,0x11); + WriteReg(0x6f,0x9f); + + WriteReg(0xb0,0x84); + size = 160 * 120 * 2; +} + +void OV7670::scopeTest(Serial *host) { + Timer t1, t2; + int LED = 0x80000000; + PortInOut status(Port1, LED); + status = LED; + int cycles = 1000000; + while(inPort & 0x00000008) {}; + while(!(inPort & 0x00000008)) {}; + t1.start(); + while(cycles--) { + while(!(inPort & 0x00000010)) {}; + while(inPort & 0x00000010) {}; + } + status = 0; + t1.stop(); + printf("One million cycles: %d\n\r", t1.read_us()); + //printf("Avg on, off = %d, %d\n\r", t1.read_us()/100, t2.read_us()/100); +} + +int OV7670::captureImage() { + int d, i=0; + int byte = 0; + Timer t1; + // Prepare SRAM output + ram.startWriteSequence(); + // Read in the first half of the image + while(inPort & 0x00000008) {}; // Wait for VSYNC low + while(!(inPort & 0x00000008)) {}; // Wait for VSYNC high + //t1.start(); + while(inPort & 0x00000008) { // While VSYNC high + while((inPort & 0x00000008) && !(inPort & 0x00000004)) {}; // stall while VSYNC high and HREF low + if(!(inPort & 0x00000008)) { // if VSYNC low + //printf("Interrupted!\n\r"); + break; + } + while (inPort & 0x00000004) { // While HREF high + while(!(inPort & 0x00000010)) {}; // Wait for PCLK high + d = data; + byte = (d & 0x07800000) >> 19; // bit26 to bit7 + byte |= (d & 0x00078000) >> 15; // bit18 to bit3 + //arr1[i] = byte; + ram.writeSequence1(byte); + while(inPort & 0x00000010) {}; // Wait for PCLK low + while(!(inPort & 0x00000010)) {}; // Wait for PCLK high + d = data; + byte = (d & 0x07800000) >> 19; // bit26 to bit7 + byte |= (d & 0x00078000) >> 15; // bit18 to bit3 + ram.writeSequence1(byte); + //arr2[i++] = byte; + while(inPort & 0x00000010) {}; + i++; + } + } + //t1.stop(); + ram.stopSequence(); + //printf("Image read: %d\n\r", t1.read_us()); + return i*2; +} + + +void OV7670::sendImage(Serial *dest, int numBytes) { + Timer t; + Serial host = *dest; + // Write the image to the serial host + ram.startReadSequence(); + t.start(); + for (int i = 0; i < numBytes; i++) { + while(!(host.writeable())) {} + host.putc(ram.readSequence1()); + } + t.stop(); + printf("BT time: %d\n\r", t.read_us()); + ram.stopSequence(); +} + \ No newline at end of file