Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: 3D_Scanner_OV7670_
Fork of OV7670 with FIFO by
Revision 1:f5f5d7c979cf, committed 2017-10-03
- Comitter:
- rulla
- Date:
- Tue Oct 03 16:39:42 2017 +0000
- Parent:
- 0:101fbacf126f
- Commit message:
- ok
Changed in this revision
--- a/OV7670.cpp Wed Nov 16 10:37:49 2016 +0000
+++ b/OV7670.cpp Tue Oct 03 16:39:42 2017 +0000
@@ -2,161 +2,149 @@
#include "ov7670reg.h"
#include "OV7670.h"
- // capture request
- void OV7670::CaptureNext(void)
- {
- CaptureReq = true ;
- Busy = true ;
- printf("CaptReq\n");
- }
-
- // capture done? (with clear)
- bool OV7670::CaptureDone(void)
- {
- bool result ;
- if (Busy) {
- result = false ;
- } else {
- result = Done ;
- Done = false ;
- }
- return result ;
- }
+OV7670::OV7670(PinName sda, PinName scl, PinName vs, PinName hr, PinName we, PortName port, int mask, PinName rt, PinName o, PinName rc) : camera(sda,scl),vsync(vs),href(hr),wen(we),dataP(port,mask),rrst(rt),oe(o),rclk(rc)
+{
+ camera.stop() ;
+ camera.frequency(OV7670_I2CFREQ) ;
+ vsync.fall(this,&OV7670::VsyncHandler) ;
+ //camera.start() ;
+ CaptureReq = false ;
+ Busy = false ;
+ Done = false ;
+ LineCounter = 0 ;
+ rrst = 1 ;
+ oe = 1 ;
+ rclk = 1 ;
+ wen = 0 ;
+}
+
+
+OV7670::~OV7670()
+{
+
+}
+// capture request
+void OV7670::CaptureNext(void)
+{
+ CaptureReq = true ;
+ Busy = true ;
+}
- // write to camera
- void OV7670::WriteReg(int addr,char data)
- {
- // WRITE 0x42,ADDR,DATA
- //camera.write(OV7670_WRITE,d1,2) ;
- camera.start() ;
- camera.write(OV7670_WRITE) ;
- wait_us(OV7670_WRITEWAIT);
- camera.write(addr) ;
- wait_us(OV7670_WRITEWAIT);
- camera.write(data) ;
- camera.stop() ;
+// capture done? (with clear)
+bool OV7670::CaptureDone(void)
+{
+ bool result ;
+ if (Busy) {
+ result = false ;
+ } else {
+ result = Done ;
+ Done = false ;
}
+ return result ;
+}
- // read from camera
- char OV7670::ReadReg(int addr)
- {
- /*
- char buff[20];
- char buf[20];
- buff[0] = addr;
- buff[1] = OV7670_NOACK;
+// write to camera
+void OV7670::WriteReg(int addr,char data)
+{
+ // WRITE 0x42,ADDR,DATA
+ //camera.write(OV7670_WRITE,d1,2) ;
+ camera.start() ;
+ camera.write(OV7670_WRITE) ;
+ wait_us(OV7670_WRITEWAIT);
+ camera.write(addr) ;
+ wait_us(OV7670_WRITEWAIT);
+ camera.write(data) ;
+ camera.stop() ;
+}
- camera.write(OV7670_WRITE,buff,1);
- camera.read(OV7670_WRITE+1,buf,1);
- return buf[0];*/
+// read from camera
+char OV7670::ReadReg(int addr)
+{
+ /*
+ char buff[20];
+ char buf[20];
+ buff[0] = addr;
+ buff[1] = OV7670_NOACK;
+
+ camera.write(OV7670_WRITE,buff,1);
+ camera.read(OV7670_WRITE+1,buf,1);
+ return buf[0];*/
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 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::test(void)
+{
+ printf("ResetMAMT\n");
+}
- // 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(REG_COM7,0x80) ; // RESET CAMERA
+ wait_ms(200) ;
+ printf("Reset\n");
+}
+
+void OV7670::InitQQVGA(int SIZEX)
+{
+ Reset(); // Resets all registers to default values
+ Reset(); // Resets all registers to default values
+
+ WriteReg(DBLV, 0x0a); // bypass PLL
+ WriteReg(REG_CLKRC,0x80);//0x80
+ WriteReg(SCALING_XSC, 0x3a);
+ WriteReg(SCALING_YSC, 0x35);
+ WriteReg(REG_HREF, 0x24);
+ WriteReg(REG_HSTART, 0x16);
+ WriteReg(REG_HSTOP, 0x04);
+ WriteReg(REG_VREF, 0x0a);
+ WriteReg(REG_VSTART,0x02);
+ WriteReg(REG_VSTOP, 0x7a);
+
+ if(SIZEX==640) {
+ WriteReg(REG_CLKRC,0x0);//0x80
+ WriteReg(REG_COM7,0x04) ;
+ WriteReg(REG_COM3,0x0) ;
+ WriteReg(REG_COM14, 0x00);
+ WriteReg(SCALING_DCWCTR,0x11);
+ WriteReg(SCALING_PCLK_DIV,0xf0);
+ WriteReg(SCALING_PCLK_DELAY,0x02);
+
+ WriteReg(0xff, 0xff); /* END MARKER */
}
- void OV7670::test(void)
- {
- printf("ResetMAMT\n");
- }
-
- void OV7670::Reset(void)
- {
- WriteReg(0x12,0x80) ; // RESET CAMERA
- wait_ms(200) ;
- printf("Reset\n");
- }
-
- void OV7670::InitQQVGA(void)
- {
- /*
- //WriteReg(REG_COM7,0x80) ;
- WriteReg(REG_CLKRC,0x80);
- WriteReg(REG_COM11,0x1A) ;
- WriteReg(REG_TSLB,0x04);
- WriteReg(REG_TSLB,0x04);
- WriteReg(REG_COM3,0x04) ;
- WriteReg(REG_COM7,0x07) ;
- WriteReg(REG_COM8,0x87) ;
- //WriteReg(REG_RGB444, 0x00);
- //WriteReg(REG_RGB444, 0x00); // Disable RGB 444?
- WriteReg(REG_COM15, 0xD0); // Set RGB 565?
-*/
-
- WriteReg(REG_CLKRC,0x80);
- WriteReg(REG_COM11,0x1A) ;
- // WriteReg(REG_TSLB,0x04);
- //WriteReg(REG_TSLB,0x04);
- //WriteReg(REG_COM1,0x0) ;
- WriteReg(REG_COM3,0x04) ;
- WriteReg(REG_COM7,0x04) ;
- WriteReg(REG_COM14, 0x1a);
- WriteReg(SCALING_XSC, 0x3a);
- WriteReg(SCALING_YSC, 0x35);
- WriteReg(SCALING_DCWCTR,0x22);
- WriteReg(SCALING_PCLK_DIV,0xf2);
+ if(SIZEX==320) {
+ WriteReg(REG_COM7,0x4) ;
+ WriteReg(REG_COM17,0x00) ;
+ WriteReg(REG_COM3,0x38) ;
+ WriteReg(REG_COM14, 0x19);
+ WriteReg(REG_COM2, 0x3);
+ WriteReg(SCALING_DCWCTR,0x11);
+ WriteReg(SCALING_PCLK_DIV,0xf1);
WriteReg(SCALING_PCLK_DELAY,0x02);
- WriteReg(REG_COM8,0x87) ;
- // WriteReg(REG_RGB444, 0x02);
- // 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_MVFP,0x27) ;
- // 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);
- //////////
-
-
-
WriteReg(0x7a, 0x20);
WriteReg(0x7b, 0x1c);
WriteReg(0x7c, 0x28);
WriteReg(0x7d, 0x3c);
- WriteReg(0x7e, 0x5a);
+ WriteReg(0x7e, 0x55);
WriteReg(0x7f, 0x68);
WriteReg(0x80, 0x76);
WriteReg(0x81, 0x80);
@@ -168,31 +156,30 @@
WriteReg(0x87, 0xc4);
WriteReg(0x88, 0xd7);
WriteReg(0x89, 0xe8);
-
+
WriteReg(0x13, 0xe0);
WriteReg(0x00, 0x00);
WriteReg(0x10, 0x00);
- WriteReg(0x0d, 0x40);
- WriteReg(0x14, 0x18);
+ WriteReg(0x0d, 0x00);
+ WriteReg(0x14, 0x28);
WriteReg(0xa5, 0x05);
WriteReg(0xab, 0x07);
- WriteReg(0x24, 0x95);
- WriteReg(0x25, 0x33);
- WriteReg(0x26, 0xe3);
+ WriteReg(0x24, 0x75);
+ WriteReg(0x25, 0x63);
+ WriteReg(0x26, 0xA5);
WriteReg(0x9f, 0x78);
WriteReg(0xa0, 0x68);
WriteReg(0xa1, 0x03);
- WriteReg(0xa6, 0xd8);
- WriteReg(0xa7, 0xd8);
+ WriteReg(0xa6, 0xdf);
+ WriteReg(0xa7, 0xdf);
WriteReg(0xa8, 0xf0);
WriteReg(0xa9, 0x90);
WriteReg(0xaa, 0x94);
WriteReg(0x13, 0xe5);
-
+
WriteReg(0x0e, 0x61);
WriteReg(0x0f, 0x4b);
WriteReg(0x16, 0x02);
-
WriteReg(0x21, 0x02);
WriteReg(0x22, 0x91);
WriteReg(0x29, 0x07);
@@ -205,15 +192,14 @@
WriteReg(0x4d, 0x40);
WriteReg(0x4e, 0x20);
WriteReg(0x69, 0x00);
-
- WriteReg(0x74, 0x10);
+ WriteReg(0x6b, 0x00);
+ WriteReg(0x74, 0x19);
WriteReg(0x8d, 0x4f);
WriteReg(0x8e, 0x00);
WriteReg(0x8f, 0x00);
WriteReg(0x90, 0x00);
WriteReg(0x91, 0x00);
WriteReg(0x92, 0x00);
-
WriteReg(0x96, 0x00);
WriteReg(0x9a, 0x80);
WriteReg(0xb0, 0x84);
@@ -221,8 +207,7 @@
WriteReg(0xb2, 0x0e);
WriteReg(0xb3, 0x82);
WriteReg(0xb8, 0x0a);
-
- WriteReg(0x43, 0x0a);
+ WriteReg(0x43, 0x14);
WriteReg(0x44, 0xf0);
WriteReg(0x45, 0x34);
WriteReg(0x46, 0x58);
@@ -239,7 +224,6 @@
WriteReg(0x66, 0x05);
WriteReg(0x94, 0x04);
WriteReg(0x95, 0x08);
-
WriteReg(0x6c, 0x0a);
WriteReg(0x6d, 0x55);
WriteReg(0x6e, 0x11);
@@ -249,7 +233,6 @@
WriteReg(0x02, 0x40);
WriteReg(0x13, 0xe7);
WriteReg(0x15, 0x02);
-
WriteReg(0x4f, 0x80);
WriteReg(0x50, 0x80);
WriteReg(0x51, 0x00);
@@ -257,22 +240,20 @@
WriteReg(0x53, 0x5e);
WriteReg(0x54, 0x80);
WriteReg(0x58, 0x9e);
-
WriteReg(0x41, 0x08);
WriteReg(0x3f, 0x00);
WriteReg(0x75, 0x05);
WriteReg(0x76, 0xe1);
WriteReg(0x4c, 0x00);
WriteReg(0x77, 0x01);
- WriteReg(0x3d, 0xc1);
+ WriteReg(0x3d, 0xc2);
WriteReg(0x4b, 0x09);
WriteReg(0xc9, 0x60);
WriteReg(0x41, 0x38);
WriteReg(0x56, 0x40);
-
WriteReg(0x34, 0x11);
WriteReg(0x3b, 0x02);
- WriteReg(0xa4, 0x88);
+ WriteReg(0xa4, 0x89);
WriteReg(0x96, 0x00);
WriteReg(0x97, 0x30);
WriteReg(0x98, 0x20);
@@ -283,7 +264,6 @@
WriteReg(0x9d, 0x4c);
WriteReg(0x9e, 0x3f);
WriteReg(0x78, 0x04);
-
WriteReg(0x79, 0x01);
WriteReg(0xc8, 0xf0);
WriteReg(0x79, 0x0f);
@@ -309,78 +289,359 @@
WriteReg(0x79, 0x26);
WriteReg(0x09, 0x03);
WriteReg(0x3b, 0x42);
-
- WriteReg(0xff, 0xff); /* END MARKER */
-
- printf("Init\n");
- }
+ }
+
+ if(SIZEX==160) {
+ WriteReg(REG_COM7,0x04) ;
+ WriteReg(REG_COM3,0x04) ;
+ WriteReg(REG_COM14, 0x1a);
+ WriteReg(SCALING_DCWCTR,0x22);
+ WriteReg(SCALING_PCLK_DIV,0xf2);
+ WriteReg(SCALING_PCLK_DELAY,0x02);
+ }
+
+ WriteReg(REG_COM1,0x0) ;
+ WriteReg(REG_COM8,0xc7) ;
+ WriteReg(REG_COM9,0x7a) ;
+ WriteReg(REG_COM10,0x2) ;
+ WriteReg(REG_COM11,0x10) ;//1A //0x90
+ WriteReg(REG_COM13, 0x88);
+ WriteReg(REG_COM15, 0xd0); // Set RGB 565?
+ WriteReg(REG_EDGE,0x04) ;
+ WriteReg(REG_RGB444, 0x00); // Disable RGB 444?
+ // WriteReg(REG_TSLB,0x05);//Forza YUV
+
+ /////////
+ WriteReg(REG_MVFP,0x27) ;
+
+ /*
+ WriteReg( REG_COM5, 0x61 ); WriteReg( REG_COM6, 0x4b );
+ WriteReg( 0x16, 0x02 );
+ WriteReg( 0x21, 0x02 ); WriteReg( 0x22, 0x91 );
+ WriteReg( 0x29, 0x07 ); WriteReg( 0x33, 0x0b );
+ WriteReg( 0x35, 0x0b ); WriteReg( 0x37, 0x1d );
+ WriteReg( 0x38, 0x71 ); WriteReg( 0x39, 0x2a );
+ WriteReg( REG_COM12, 0x78 ); WriteReg( 0x4d, 0x40 );
+ WriteReg( 0x4e, 0x20 ); WriteReg( REG_GFIX, 0 );
+ WriteReg( 0x6b, 0x4a ); WriteReg( 0x74, 0x10 );
+ WriteReg( 0x8d, 0x4f ); WriteReg( 0x8e, 0 );
+ WriteReg( 0x8f, 0 ); WriteReg( 0x90, 0 );
+ WriteReg( 0x91, 0 ); WriteReg( 0x96, 0 );
+ WriteReg( 0x9a, 0 ); WriteReg( 0xb0, 0x84 );
+ WriteReg( 0xb1, 0x0c ); WriteReg( 0xb2, 0x0e );
+ WriteReg( 0xb3, 0x82 ); WriteReg( 0xb8, 0x0a );
+ */
+ /*
+ // 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);
+ //////////
+ */
+
+ /*
+ WriteReg(0x7a, 0x20);
+ WriteReg(0x7b, 0x1c);
+ WriteReg(0x7c, 0x28);
+ WriteReg(0x7d, 0x3c);
+ WriteReg(0x7e, 0x5a);
+ WriteReg(0x7f, 0x68);
+ WriteReg(0x80, 0x76);
+ WriteReg(0x81, 0x80);
+ WriteReg(0x82, 0x88);
+ WriteReg(0x83, 0x8f);
+ WriteReg(0x84, 0x96);
+ WriteReg(0x85, 0xa3);
+ WriteReg(0x86, 0xaf);
+ WriteReg(0x87, 0xc4);
+ WriteReg(0x88, 0xd7);
+ WriteReg(0x89, 0xe8);
+
+ WriteReg(0x13, 0xe0);
+ WriteReg(0x00, 0x00);
+ WriteReg(0x10, 0x00);
+ WriteReg(0x0d, 0x40);
+ WriteReg(0x14, 0x18);
+ WriteReg(0xa5, 0x05);
+ WriteReg(0xab, 0x07);
+ WriteReg(0x24, 0x95);
+ WriteReg(0x25, 0x33);
+ WriteReg(0x26, 0xe3);
+ WriteReg(0x9f, 0x78);
+ WriteReg(0xa0, 0x68);
+ WriteReg(0xa1, 0x03);
+ WriteReg(0xa6, 0xd8);
+ WriteReg(0xa7, 0xd8);
+ WriteReg(0xa8, 0xf0);
+ WriteReg(0xa9, 0x90);
+ WriteReg(0xaa, 0x94);
+ WriteReg(0x13, 0xe5);
+
+ WriteReg(0x0e, 0x61);
+ WriteReg(0x0f, 0x4b);
+ WriteReg(0x16, 0x02);
+
+ WriteReg(0x21, 0x02);
+ WriteReg(0x22, 0x91);
+ WriteReg(0x29, 0x07);
+ WriteReg(0x33, 0x0b);
+ WriteReg(0x35, 0x0b);
+ WriteReg(0x37, 0x1d);
+ WriteReg(0x38, 0x71);
+ WriteReg(0x39, 0x2a);
+ WriteReg(0x3c, 0x78);
+ WriteReg(0x4d, 0x40);
+ WriteReg(0x4e, 0x20);
+ WriteReg(0x69, 0x00);
+
+ WriteReg(0x74, 0x10);
+ WriteReg(0x8d, 0x4f);
+ WriteReg(0x8e, 0x00);
+ WriteReg(0x8f, 0x00);
+ WriteReg(0x90, 0x00);
+ WriteReg(0x91, 0x00);
+ WriteReg(0x92, 0x00);
+ WriteReg(0x93, 0x00);
+
+
+ WriteReg(0x96, 0x00);
+ WriteReg(0x9a, 0x80);
+ WriteReg(0xb0, 0x84);
+ WriteReg(0xb1, 0x0c);
+ WriteReg(0xb2, 0x0e);
+ WriteReg(0xb3, 0x82);
+ WriteReg(0xb8, 0x0a);
+
+ WriteReg(0x43, 0x0a);
+ WriteReg(0x44, 0xf0);
+ WriteReg(0x45, 0x34);
+ WriteReg(0x46, 0x58);
+ WriteReg(0x47, 0x28);
+ WriteReg(0x48, 0x3a);
+ WriteReg(0x59, 0x88);
+ WriteReg(0x5a, 0x88);
+ WriteReg(0x5b, 0x44);
+ WriteReg(0x5c, 0x67);
+ WriteReg(0x5d, 0x49);
+ WriteReg(0x5e, 0x0e);
+ WriteReg(0x64, 0x04);
+ WriteReg(0x65, 0x20);
+ WriteReg(0x66, 0x05);
+ WriteReg(0x94, 0x04);
+ WriteReg(0x95, 0x08);
+
+ WriteReg(0x6c, 0x0a);
+ WriteReg(0x6d, 0x55);
+ WriteReg(0x6e, 0x11);
+ WriteReg(0x6f, 0x9f);
+ WriteReg(0x6a, 0x40);
+ WriteReg(0x01, 0x40);
+ WriteReg(0x02, 0x40);
+ WriteReg(0x13, 0xe7);
+ // WriteReg(0x15, 0x02);
+
+ WriteReg(0x4f, 0xb3);
+ WriteReg(0x50, 0xb3);
+ WriteReg(0x51, 0x00);
+ WriteReg(0x52, 0x3d);
+ WriteReg(0x53, 0xa7);
+ WriteReg(0x54, 0xe4);
+ WriteReg(0x58, 0x9e);
+
+ WriteReg(0x41, 0x08);
+ WriteReg(0x3f, 0x00);
+ WriteReg(0x75, 0x05);
+ WriteReg(0x76, 0xe1);
+ WriteReg(0x4c, 0x00);
+ WriteReg(0x77, 0x01);
+ // WriteReg(0x3d, 0xc1);
+ WriteReg(0x4b, 0x09);
+ WriteReg(0xc9, 0x60);
+ WriteReg(0x41, 0x38);
+ WriteReg(0x56, 0x40);
+
+ WriteReg(0x34, 0x11);
+ WriteReg(0x3b, 0x02);
+ WriteReg(0xa4, 0x88);
+ WriteReg(0x96, 0x00);
+ WriteReg(0x97, 0x30);
+ WriteReg(0x98, 0x20);
+ WriteReg(0x99, 0x30);
+ WriteReg(0x9a, 0x84);
+ WriteReg(0x9b, 0x29);
+ WriteReg(0x9c, 0x03);
+ WriteReg(0x9d, 0x4c);
+ WriteReg(0x9e, 0x3f);
+ WriteReg(0x78, 0x04);
+
+ WriteReg(0x79, 0x01);
+ WriteReg(0xc8, 0xf0);
+ WriteReg(0x79, 0x0f);
+ WriteReg(0xc8, 0x00);
+ WriteReg(0x79, 0x10);
+ WriteReg(0xc8, 0x7e);
+ WriteReg(0x79, 0x0a);
+ WriteReg(0xc8, 0x80);
+ WriteReg(0x79, 0x0b);
+ WriteReg(0xc8, 0x01);
+ WriteReg(0x79, 0x0c);
+ WriteReg(0xc8, 0x0f);
+ WriteReg(0x79, 0x0d);
+ WriteReg(0xc8, 0x20);
+ WriteReg(0x79, 0x09);
+ WriteReg(0xc8, 0x80);
+ WriteReg(0x79, 0x02);
+ WriteReg(0xc8, 0xc0);
+ WriteReg(0x79, 0x03);
+ WriteReg(0xc8, 0x40);
+ WriteReg(0x79, 0x05);
+ WriteReg(0xc8, 0x30);
+ WriteReg(0x79, 0x26);
+ WriteReg(0x09, 0x03);
+ WriteReg(0x3b, 0x42);
+ /////////////
+ */
+
+ /*
+ WriteReg(0x4f, 0x80);
+ WriteReg(0x50, 0x80);
+ WriteReg(0x51, 0x00);
+ WriteReg(0x52, 0x22);
+ WriteReg(0x53, 0x5e);
+ WriteReg(0x54, 0x80);
+ */
+
+ /*
+ WriteReg( REG_COM9, 0x38 );
+ WriteReg( 0x4f, 0xb3 );
+ WriteReg( 0x50, 0xb3 );
+ WriteReg( 0x51, 0 );
+ WriteReg( 0x52, 0x3d );
+ WriteReg( 0x53, 0xa7);
+ WriteReg( 0x54, 0xe4 );
+ WriteReg( REG_COM13, COM13_GAMMA|COM13_UVSAT );
+ */
+ // WriteReg( REG_COM13, COM13_GAMMA|COM13_UVSAT );
+ //WriteReg(REG_COM8,0x8f) ;
+ // WriteReg(REG_COM7,0x04) ;
+ // WriteReg(REG_CLKRC,0x80);
+ WriteReg(0xff, 0xff); /* END MARKER */
+
+ printf("Init\n");
+}
- // vsync handler
- void OV7670::VsyncHandler(void)
- {
- // Capture Enable
- if (CaptureReq) {
- wen = 1 ;
- Done = false ;
- CaptureReq = false ;
- } else {
- wen = 0 ;
- if (Busy) {
- Busy = false ;
- Done = true ;
- }
+// vsync handler
+void OV7670::VsyncHandler(void)
+{
+ // Capture Enable
+ if (CaptureReq) {
+ wen = 1 ;
+ Done = false ;
+ CaptureReq = false ;
+ } else {
+ wen = 0 ;
+ if (Busy) {
+ Busy = false ;
+ Done = true ;
}
-
- // Hline Counter
- LastLines = LineCounter ;
- LineCounter = 0 ;
}
-
-
- // Data Read
- int OV7670::ReadOneByte(void)
- {
- int result;
- rclk = 1;
- result = dataP;
-/*
- // Shift the bits around to form the byte
- int top = result >> 19; // Isolate the top nibble
- int middle = result >> 2; // Isolate bits 2 & 3
- result = result & 0x00000003; // Isolate bits 0 & 1
- result += middle;
- result += top;
- */
-
- //int middle= ((result)& 0xf00)>>4;
- result= ((result&0x0f)|(((result)& 0xf00)>>4))&0xff;
- // int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1) | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
- int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1)
- | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
-
- rclk = 0;
- return top;
- }
-
- // Data Start
- void OV7670::ReadStart(void)
- {
- rrst = 0 ;
- oe = 0 ;
- wait_us(1) ;
+
+ // Hline Counter
+ LastLines = LineCounter ;
+ LineCounter = 0 ;
+}
+
+
+// Data Read
+int OV7670::ReadOneByte(void)
+{
+ int b1;
+ rclk = 1;
+ // result = dataP;
+
+ /* result= ((result&0x0f)|(((result)& 0xf00)>>4))&0xff;
+ // int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1) | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
+ int top=((result&0x01) << 7) | ((result&0x02) << 5) | ((result&0x04) << 3) | ((result&0x08) << 1)
+ | ((result&0x10) >>1) | ((result&0x20) <<3) | ((result&0x40) >>5) | ((result&0x80) >>7);
+ */
+
+ /*
+ int r,r1,r2;
+ rclk = 1 ;
+ r = dataP ;
rclk = 0 ;
- wait_us(1) ;
- rclk = 1 ;
- wait_us(1) ;
- rrst = 1 ;
- }
-
- // Data Stop
- void OV7670::ReadStop(void)
- {
- oe = 1 ;
- ReadOneByte() ;
- rclk = 1 ;
- }
\ No newline at end of file
+ r1 = r & 0x07800000 ;
+ r1 = r1 >> (26-7-0) ; // bit26 to bit7
+ r2 = r & 0x00078000 ;
+ r2 = r2 >> (18-3-0) ; // bit18 to bit3
+ return r1+r2;
+ */
+
+ b1=(((dataP&0x07800000)>>19)|((dataP&0x078000)>>15));
+ rclk = 0;
+ return b1;
+}
+
+int OV7670::ReadOneWord(void)
+{
+ int r,r1,r2,r3,r4 ;
+ rclk = 1 ;
+ r = dataP ;
+ rclk = 0 ;
+ r1 = r & 0x07800000 ;
+ r1 = r1 >> (26-7-0) ; // bit26 to bit7
+ r2 = r & 0x00078000 ;
+ r2 = r2 >> (18-3-0) ; // bit18 to bit3
+ rclk = 1 ;
+ r = dataP ;
+ rclk = 0 ;
+ r3 = r & 0x07800000 ;
+ r3 = r3 >> (26-7-8) ; // bit26 to bit7
+ r4 = r & 0x00078000 ;
+ r4 = r4 >> (18-3-8) ; // bit18 to bit3
+ return r4+r3+r2+r1 ;
+}
+
+
+// Data Start
+void OV7670::ReadStart(void)
+{
+ rrst = 0 ;
+ oe = 0 ;
+ wait_us(1) ;
+ rclk = 0 ;
+ wait_us(1) ;
+ rclk = 1 ;
+ wait_us(1) ;
+ rrst = 1 ;
+}
+
+// Data Stop
+void OV7670::ReadStop(void)
+{
+ oe = 1 ;
+ ReadOneByte() ;
+ rclk = 1 ;
+}
\ No newline at end of file
--- a/OV7670.h Wed Nov 16 10:37:49 2016 +0000
+++ b/OV7670.h Tue Oct 03 16:39:42 2017 +0000
@@ -1,3 +1,4 @@
+#pragma once
#include "mbed.h"
#include "ov7670reg.h"
@@ -6,7 +7,7 @@
#define OV7670_WRITEWAIT (20)
#define OV7670_NOACK (0)
#define OV7670_REGMAX (201)
-#define OV7670_I2CFREQ (50000)
+#define OV7670_I2CFREQ (100000)
//
@@ -16,25 +17,7 @@
{
public:
-volatile int LineCounter ;
- volatile int LastLines ;
- volatile bool CaptureReq ;
- volatile bool Busy ;
- volatile bool Done ;
- void CaptureNext(void);
- bool CaptureDone(void);
- void WriteReg(int addr,char data);
- void Reset(void);
- void test(void);
- void InitQQVGA(void);
- char ReadReg(int addr);
- int ReadOneByte(void);
- void ReadStart(void);
- void ReadStop(void);
- void VsyncHandler(void);
- InterruptIn vsync;
-
- OV7670(
+OV7670(
PinName sda,// Camera I2C port
PinName scl,// Camera I2C port
PinName vs, // VSYNC
@@ -45,26 +28,35 @@
PinName rt, // /RRST
PinName o, // /OE
PinName rc // RCLK
- ) : camera(sda,scl),vsync(vs),href(hr),wen(we),dataP(port,mask),rrst(rt),oe(o),rclk(rc)
- {
- //camera.stop() ;
- camera.frequency(OV7670_I2CFREQ) ;
- // camera.start() ;
+ ) ;
+
+ ~OV7670();
- CaptureReq = false ;
- Busy = false ;
- Done = false ;
- LineCounter = 0 ;
- rrst = 1 ;
- oe = 1 ;
- rclk = 1 ;
- wen = 0 ;
- vsync.rise(this,&OV7670::VsyncHandler) ;
- }
-protected:
+ void CaptureNext(void);
+ bool CaptureDone(void);
+ void WriteReg(int addr,char data);
+ void Reset(void);
+ void test(void);
+ void InitQQVGA(int SIZEX);
+ char ReadReg(int addr);
+ int ReadOneByte(void);
+ int ReadOneWord(void);
+ void ReadStart(void);
+ void ReadStop(void);
+ void VsyncHandler(void);
+
+
+private:
I2C camera ;
+ InterruptIn vsync;
DigitalIn href;
DigitalOut wen ;
PortIn dataP;
DigitalOut rrst,oe,rclk ;
+ volatile int LineCounter;
+ volatile int LastLines;
+ volatile bool CaptureReq;
+ volatile bool Busy;
+ volatile bool Done;
+ char *format_temp;
};
--- a/ov7670reg.h Wed Nov 16 10:37:49 2016 +0000 +++ b/ov7670reg.h Tue Oct 03 16:39:42 2017 +0000 @@ -120,3 +120,26 @@ #define REG_HAECC6 0xa9 /* Hist AEC/AGC control 6 */ #define REG_HAECC7 0xaa /* Hist AEC/AGC control 7 */ #define REG_BD60MAX 0xab /* 60hz banding step limit */ + + +#define MTX1 0x4f /* Matrix Coefficient 1 */ +#define MTX2 0x50 /* Matrix Coefficient 2 */ +#define MTX3 0x51 /* Matrix Coefficient 3 */ +#define MTX4 0x52 /* Matrix Coefficient 4 */ +#define MTX5 0x53 /* Matrix Coefficient 5 */ +#define MTX6 0x54 /* Matrix Coefficient 6 */ +#define REG_CONTRAS 0x56 /* Contrast control */ +#define MTXS 0x58 /* Matrix Coefficient Sign */ +#define AWBC7 0x59 /* AWB Control 7 */ +#define AWBC8 0x5a /* AWB Control 8 */ +#define AWBC9 0x5b /* AWB Control 9 */ +#define AWBC10 0x5c /* AWB Control 10 */ +#define AWBC11 0x5d /* AWB Control 11 */ +#define AWBC12 0x5e /* AWB Control 12 */ +#define REG_GFIX 0x69 /* Fix gain control */ +#define GGAIN 0x6a /* G Channel AWB Gain */ +#define DBLV 0x6b +#define AWBCTR3 0x6c /* AWB Control 3 */ +#define AWBCTR2 0x6d /* AWB Control 2 */ +#define AWBCTR1 0x6e /* AWB Control 1 */ +#define AWBCTR0 0x6f /* AWB Control 0 */ \ No newline at end of file
