capstone_finish
Dependencies: BufferedSerial motor_sn7544
Diff: ov7670.h
- Revision:
- 7:152fba230106
- Parent:
- 6:fe8b32cb9357
--- a/ov7670.h Tue Aug 13 07:51:37 2019 +0000 +++ b/ov7670.h Thu Sep 05 13:04:01 2019 +0000 @@ -6,11 +6,11 @@ #define OV7670_WRITEWAIT (20) #define OV7670_NOACK (0) #define OV7670_REGMAX (201) -#define OV7670_I2CFREQ (40000) +#define OV7670_I2CFREQ (10000) // // OV7670 + FIFO AL422B camera board test -// +//wen =1일 때 read시작 wen = 0일때 안읽음 class OV7670 { public: @@ -18,7 +18,7 @@ InterruptIn vsync,href; DigitalOut wen ; PortIn data ; - DigitalOut rrst,oe,rclk ; + DigitalOut rrst,oe,rclk,wrst ; volatile int LineCounter ; volatile int LastLines ; volatile bool CaptureReq ; @@ -35,18 +35,20 @@ int mask, // 0b0000_0M65_4000_0321_L000_0000_0000_0000 = 0x07878000 PinName rt, // /RRST PinName o, // /OE - PinName rc // RCLK - ) : _i2c(sda,scl),vsync(vs),href(hr),wen(we),data(port,mask),rrst(rt),oe(o),rclk(rc) + PinName rc, + PinName wt // RCLK + ) : _i2c(sda,scl),vsync(vs),href(hr),wen(we),data(port,mask),rrst(rt),oe(o),rclk(rc),wrst(wt) { _i2c.stop() ; _i2c.frequency(OV7670_I2CFREQ) ; vsync.fall(this,&OV7670::VsyncHandler) ; - href.rise(this,&OV7670::HrefHandler) ; +// vsync.rise(this,&OV7670::VsyncHandler) ; CaptureReq = false ; Busy = false ; Done = false ; LineCounter = 0 ; rrst = 1 ; + oe = 1 ; rclk = 1 ; wen = 0 ; @@ -75,30 +77,31 @@ // write to camera void WriteReg(int addr,int data) { - int status; - char data_write[2]; - data_write[0]= addr; - data_write[1]= data; - status = _i2c.write(OV7670_WRITE,data_write,2,0); - if(status!=0){ -// printf("I2C configuration error(adr: %x)!\r\n",addr); - while(1){ + wait_us(10); + int status; + char data_write[2]; + data_write[0]= addr; + data_write[1]= data; + status = _i2c.write(OV7670_WRITE,data_write,2,0); + if(status!=0) { + printf("I2C configuration error(adr: %x)!\r\n",addr); + while(1) { + } } } - } // read from camera int ReadReg(int addr) { - char data_write[2]; - char data_read[2]; - int data; - int status; - - data_write[0]=addr; - _i2c.write(OV7670_WRITE, data_write, 1, 0); - status =_i2c.read(OV7670_READ, data_read, 1, 0); - data = (int)data_read[0]; + char data_write[2]; + char data_read[2]; + int data; + int status; + + data_write[0]=addr; + _i2c.write(OV7670_WRITE, data_write, 1, 0); + status =_i2c.read(OV7670_READ, data_read, 1, 0); + data = (int)data_read[0]; // printf("Data is %x\r\n",data); // printf("Status is %d\r\n",status); return data ; @@ -106,15 +109,18 @@ void Reset(void) { + WriteReg(0x12,0x80) ; // RESET CAMERA wait_ms(200) ; + wait_us(1) ; + } void InitQQVGA565(bool flipv,bool fliph) { // QQVGA RGB565 WriteReg(REG_CLKRC,0x80); - WriteReg(REG_COM11,0x0A) ; + WriteReg(REG_COM11,0x0A) ; WriteReg(REG_TSLB,0x04); WriteReg(REG_COM7,0x04) ; WriteReg(REG_RGB444, 0x00); @@ -206,37 +212,35 @@ WriteReg(0xb0,0x84); } void InitQQVGAYUV(bool flipv,bool fliph) - { - WriteReg(0x11,0x01); + { + WriteReg(REG_COM10,0x02) ; +// WriteReg(0x11,0x81); + 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_COM14, 0x1a); + WriteReg(0x72, 0x22); + WriteReg(0x73, 0xf2); + WriteReg(0x70,0x3A); + WriteReg(0x71,0x35); + WriteReg(REG_TSLB,0x0C); + WriteReg(0xA2,0x02); + + WriteReg(REG_COM7, 0x00); // YUV WriteReg(REG_COM17, 0x00); // color bar disable WriteReg(REG_COM3, 0x04); - WriteReg(0x12, 0x00);//COM7 - + WriteReg(0x8C, 0x00);//RGB444 + WriteReg(0x04, 0x00);//COM1 + WriteReg(0x40, 0xC0);//COM15 WriteReg(0x14, 0x1A);//COM9 WriteReg(0x3D, 0x40);//COM13 - WriteReg(REG_COM15, 0xC0); - WriteReg(REG_TSLB,0x0C); - WriteReg(REG_COM14, 0x1a); // divide by 4 - WriteReg(0x72, 0x22); // downsample by 4 - WriteReg(0x73, 0xf2); // divide by 4 -// WriteReg(REG_HREF, 0xa4); -// WriteReg(REG_HSTART, 0x16); -// WriteReg(REG_HSTOP, 0x04); -// WriteReg(REG_VREF, 0x0a); -// WriteReg(REG_VSTART, 0x02); -// WriteReg(REG_VSTOP, 0x7a); - WriteReg(0x70,0x3A); - WriteReg(0x71,0x35); + - WriteReg(0xA2,0x02); - - - - - - - /* END MARKER */ + /* END MARKER */ } @@ -245,12 +249,15 @@ { // Capture Enable if (CaptureReq) { + wrst=0; + wait_us(1); wen = 1 ; + wrst=1; Done = false ; CaptureReq = false ; } else { wen = 0 ; - if (Busy) { + if (Busy) { //next exit Busy = false ; Done = true ; } @@ -272,8 +279,8 @@ { int result ; rclk = 1 ; -// wait_us(1) ; - result = data ; + wait_us(1); + result = data.read() ; rclk = 0 ; return result ; } @@ -299,29 +306,36 @@ int r,r1,r2; rclk=1; - r = data; + wait_us(1); + r = data.read(); rclk=0; - r1 = r<<8; +// wait_us(50); + r1 = r; + wait_us(1); rclk=1; - r= data; + wait_us(1); + r= data.read(); rclk=0; r2 = r; - - return r2+r1 ; +// wait_us(50); + return r2 ; } // Data Start void ReadStart(void) { - rrst = 0 ; + rrst=0; oe = 0 ; - wait_us(1) ; rclk = 0 ; + wait_us(1); + rclk = 1 ; wait_us(1) ; - rclk = 1 ; - wait_us(1) ; - rrst = 1 ; + rclk = 0 ; + rrst=1; + +// wait_us(1); + } // Data Stop @@ -332,3 +346,4 @@ rclk = 1 ; } }; + \ No newline at end of file