![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
ov7670 FIFO data taking program
Dependencies: OV7670 with FIFO ST7735_TFT mbed
Fork of OV7670_Testing by
Revision 2:4ebec58ffaca, committed 2016-11-16
- Comitter:
- rulla
- Date:
- Wed Nov 16 10:38:37 2016 +0000
- Parent:
- 1:c98598814170
- Commit message:
- a
Changed in this revision
diff -r c98598814170 -r 4ebec58ffaca OV7670.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OV7670.lib Wed Nov 16 10:38:37 2016 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/users/rulla/code/OV7670/#101fbacf126f
diff -r c98598814170 -r 4ebec58ffaca SPI_TFT.lib --- a/SPI_TFT.lib Sat Mar 31 10:05:59 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/dreschpe/code/SPI_TFT/#3cfa9bb9b070
diff -r c98598814170 -r 4ebec58ffaca ST7735_TFT.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ST7735_TFT.lib Wed Nov 16 10:38:37 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/smultron1977/code/ST7735_TFT/#967235e6fd48
diff -r c98598814170 -r 4ebec58ffaca TFT_fonts.lib --- a/TFT_fonts.lib Sat Mar 31 10:05:59 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/dreschpe/code/TFT_fonts/#31ce4466ecdf
diff -r c98598814170 -r 4ebec58ffaca main.cpp --- a/main.cpp Sat Mar 31 10:05:59 2012 +0000 +++ b/main.cpp Wed Nov 16 10:38:37 2016 +0000 @@ -2,87 +2,110 @@ // OV7670 + FIFO AL422B camera board test // #include "mbed.h" -#include "ov7670.h" -#include "stdio.h" -#include "SPI_TFT.h" -#include "string" -#include "Arial12x12.h" -#include "Arial24x23.h" -#include "Arial28x28.h" -#include "font_big.h" +#include "OV7670.h" + #include "ST7735_TFT.h" -OV7670 camera( +OV7670 cam( p28,p27, // SDA,SCL(I2C / SCCB) - p21,p22,p20, // VSYNC,HREF,WEN(FIFO) - Port0,0x07800033, - p23,p24,p25) ; // RRST,OE,RCLK + p23,NC,p25, // VSYNC,HREF,WEN(FIFO) + Port0,0x07878000, + p26,p29,p30) ; // RRST,OE,RCLK -// the TFT is connected to SPI pin 5-7 -SPI_TFT TFT(p5, p6, p7, p8, p14,"TFT"); // mosi, miso, sclk, cs, reset - + ST7735_TFT TFT(p5, p6, p7, p8, p9, p10,"TFT"); // mosi, miso, sclk, cs, rs, reset + Serial pc(USBTX,USBRX); #define SIZEX (160) #define SIZEY (120) -#define SIZE 19200 +#define SIZE SIZEX*SIZEY -unsigned char bank0 [SIZE]; -unsigned char *bank1 = (unsigned char *)(0x2007C000); +//unsigned char bank0[SIZE]; +//unsigned char *bank1 = (unsigned char *)(0x2007C000); +unsigned char bank0,bank1,bank2,bank3; int main() { +pc.baud(115200); + // Set up the TFT + /* TFT.claim(stdout); // Send stdout to the TFT display TFT.background(Black); // Set background to black TFT.foreground(White); // Set chars to white TFT.cls(); // Clear the screen - TFT.set_font((unsigned char*) Arial12x12); // Select the font TFT.set_orientation(3); // Select orientation - - // Reset camera on power up - camera.Reset() ; +*/ + TFT.set_orientation(3); + + cam.Reset() ; + pc.printf("\r\nDefault\r\n"); + int i; + char data1[OV7670_REGMAX],data2[OV7670_REGMAX]; + for (i=0;i<OV7670_REGMAX;i++) + { + data1[i]=cam.ReadReg(i); // READ REG + //if ((i & 0x0F) == 0) pc.printf("\r\n%02X : ",i); + //pc.printf("Add %02X = %02X ,",i,data); + } + cam.InitQQVGA() ; + pc.printf("\r\nDefault\r\n"); + for (i=0;i<OV7670_REGMAX;i++) + { + data2[i]=cam.ReadReg(i); // READ REG + // if ((i & 0x0F) == 0) pc.printf("\r\n%02X : ",i); + if(data1[i]!=data2[i]) pc.printf("Add %02X = %02X/%02X ,",i,data1[i],data2[i]); + } + int j=0; + + //while(j<15){ + while(1){ + // Kick things off by capturing an image + cam.CaptureNext() ; + while (cam.CaptureDone()==0) ; - // Set up for 160*120 pixels RGB565 - camera.InitQQVGA() ; - - // Print message to screen - pc.printf("Hit Any Key to stop RGBx160x120 Capture Data.\r\n"); - - // Kick things off by capturing an image - camera.CaptureNext() ; - while (camera.CaptureDone() == false) ; - - // Now enter the main loop - while (!pc.readable()) { - + pc.printf("Done %d\n",cam.CaptureDone()); + int x=0,y=0, r=0,g=0,b=0,colour; + char rr,gg,bb; // Start reading in the image data from the camera hardware buffer - camera.ReadStart(); - - // Read in the first half of the image + cam.ReadStart(); + for (int i = 0; i < SIZE; i++) { - bank0[i] = camera.ReadOneByte(); - } +//if(i==0) cam.ReadOneByte(); - // Read in the second half of the image - for (int i = 0; i < SIZE ; i++) { - bank1[i] = camera.ReadOneByte(); - } - - // Stop reading the image - camera.ReadStop() ; + bank0 = cam.ReadOneByte(); + bank1 = cam.ReadOneByte(); + //bank1=0; +//RGB + + rr=(bank1 & 0x1f) ; + gg= ((bank0<<3) & 0x38) | ((bank1>>5)&0x07); + b=(bank0 & 0xf8)>>3 ; + //444 + /* + b = (bank0 & 0x0F) ; + g = (bank1 & 0xF0) >> 4 ; + r = (bank1 & 0x0F) ; + */ + colour = ((r<<11)+(g<<5)+b); + if(i%200==0) pc.printf("RGB %d %d %d, B0 %d, B1 %d\n",rr,gg,b,bank0,bank1); + // TFT.pixel(x,y,colour); + TFT.pixel(x,y,rr); + + x++; + if(i%SIZEX==0) x=0,y++; + } - // Immediately request the next image to be captured (takes around 45ms) - camera.CaptureNext() ; - - // Use this time to display the image on the screen - // Display the top half - TFT.Bitmap(0,0,160,60,bank1); - // Display the bottom half - TFT.Bitmap(0,60,160,60,bank0); - - /* Note: we still have around 15ms left here to do other stuff */ - - // Now wait for the image to finish being captured - while (camera.CaptureDone() == false) ; - } + cam.ReadStop() ; + //TFT.Bitmap(0,0,160,60,bank1); + //TFT.Bitmap(0,60,160,60,bank0); + x=0;y=0; + /* + for (int i = 0; i <= SIZE; i++) { + if(i==SIZEX) x=0,y++; + r=(bank0[i]&0xF8)>>3; + // TFT.pixel(x,y,bank0[i]); + } + */ +//j++; } +} \ No newline at end of file
diff -r c98598814170 -r 4ebec58ffaca ov7670.h --- a/ov7670.h Sat Mar 31 10:05:59 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,249 +0,0 @@ -#include "mbed.h" -#include "ov7670reg.h" - -#define OV7670_WRITE (0x42) -#define OV7670_READ (0x43) -#define OV7670_WRITEWAIT (20) -#define OV7670_NOACK (0) -#define OV7670_REGMAX (201) -#define OV7670_I2CFREQ (50000) - -// -// OV7670 + FIFO AL422B camera board test -// -class OV7670 : public Base -{ -public: - I2C camera ; - InterruptIn vsync,href; - DigitalOut wen ; - //BusIn data ; - PortIn data; - DigitalOut rrst,oe,rclk ; - volatile int LineCounter ; - volatile int LastLines ; - volatile bool CaptureReq ; - volatile bool Busy ; - volatile bool Done ; - - OV7670( - PinName sda,// Camera I2C port - PinName scl,// Camera I2C port - PinName vs, // VSYNC - PinName hr, // HREF - PinName we, // WEN - - /* - PinName d7, // D7 - PinName d6, // D6 - PinName d5, // D5 - PinName d4, // D4 - PinName d3, // D3 - PinName d2, // D2 - PinName d1, // D1 - PinName d0, // D0 - */ - PortName port, // 8bit bus port - int mask, // 0b0000_0M65_4000_0321_L000_0000_0000_0000 = 0x07878000 - - PinName rt, // /RRST - PinName o, // /OE - PinName rc // RCLK - //) : camera(sda,scl),vsync(vs),href(hr),wen(we),data(d0,d1,d2,d3,d4,d5,d6,d7),rrst(rt),oe(o),rclk(rc) - ) : camera(sda,scl),vsync(vs),href(hr),wen(we),data(port,mask),rrst(rt),oe(o),rclk(rc) - { - camera.stop() ; - camera.frequency(OV7670_I2CFREQ) ; - vsync.fall(this,&OV7670::VsyncHandler) ; - href.rise(this,&OV7670::HrefHandler) ; - CaptureReq = false ; - Busy = false ; - Done = false ; - LineCounter = 0 ; - rrst = 1 ; - oe = 1 ; - rclk = 1 ; - wen = 0 ; - } - - // capture request - void CaptureNext(void) - { - CaptureReq = true ; - Busy = true ; - } - - // capture done? (with clear) - bool CaptureDone(void) - { - bool result ; - if (Busy) { - result = false ; - } else { - result = Done ; - Done = false ; - } - return result ; - } - - // write to camera - void 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() ; - } - - // read from camera - int 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 Reset(void) { - WriteReg(0x12,0x80) ; // RESET CAMERA - wait_ms(200) ; - } - - void InitQQVGA() { - // QQVGA RGB444 - WriteReg(REG_CLKRC,0x80); - WriteReg(REG_COM11,0x0A) ; - WriteReg(REG_TSLB,0x04); - WriteReg(REG_COM7,0x04) ; - - //WriteReg(REG_RGB444, 0x02); - //WriteReg(REG_COM15, 0xd0); - 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); - } - - - - // vsync handler - void 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 ; - } - - // href handler - void HrefHandler(void) - { - LineCounter++ ; - } - - // Data Read - int ReadOneByte(void) - { - int result; - rclk = 1; - result = data; - - // 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; - - rclk = 0; - return result; - } - - // Data Start - void ReadStart(void) - { - rrst = 0 ; - oe = 0 ; - wait_us(1) ; - rclk = 0 ; - wait_us(1) ; - rclk = 1 ; - wait_us(1) ; - rrst = 1 ; - } - - // Data Stop - void ReadStop(void) - { - oe = 1 ; - ReadOneByte() ; - rclk = 1 ; - } -};
diff -r c98598814170 -r 4ebec58ffaca ov7670reg.h --- a/ov7670reg.h Sat Mar 31 10:05:59 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -#define REG_GAIN 0x00 /* Gain lower 8 bits (rest in vref) */ -#define REG_BLUE 0x01 /* blue gain */ -#define REG_RED 0x02 /* red gain */ -#define REG_VREF 0x03 /* Pieces of GAIN, VSTART, VSTOP */ -#define REG_COM1 0x04 /* Control 1 */ -#define COM1_CCIR656 0x40 /* CCIR656 enable */ -#define REG_BAVE 0x05 /* U/B Average level */ -#define REG_GbAVE 0x06 /* Y/Gb Average level */ -#define REG_AECHH 0x07 /* AEC MS 5 bits */ -#define REG_RAVE 0x08 /* V/R Average level */ -#define REG_COM2 0x09 /* Control 2 */ -#define COM2_SSLEEP 0x10 /* Soft sleep mode */ -#define REG_PID 0x0a /* Product ID MSB */ -#define REG_VER 0x0b /* Product ID LSB */ -#define REG_COM3 0x0c /* Control 3 */ -#define COM3_SWAP 0x40 /* Byte swap */ -#define COM3_SCALEEN 0x08 /* Enable scaling */ -#define COM3_DCWEN 0x04 /* Enable downsamp/crop/window */ -#define REG_COM4 0x0d /* Control 4 */ -#define REG_COM5 0x0e /* All "reserved" */ -#define REG_COM6 0x0f /* Control 6 */ -#define REG_AECH 0x10 /* More bits of AEC value */ -#define REG_CLKRC 0x11 /* Clocl control */ -#define CLK_EXT 0x40 /* Use external clock directly */ -#define CLK_SCALE 0x3f /* Mask for internal clock scale */ -#define REG_COM7 0x12 /* Control 7 */ -#define COM7_RESET 0x80 /* Register reset */ -#define COM7_FMT_MASK 0x38 -#define COM7_FMT_VGA 0x00 -#define COM7_FMT_CIF 0x20 /* CIF format */ -#define COM7_FMT_QVGA 0x10 /* QVGA format */ -#define COM7_FMT_QCIF 0x08 /* QCIF format */ -#define COM7_RGB 0x04 /* bits 0 and 2 - RGB format */ -#define COM7_YUV 0x00 /* YUV */ -#define COM7_BAYER 0x01 /* Bayer format */ -#define COM7_PBAYER 0x05 /* "Processed bayer" */ -#define REG_COM8 0x13 /* Control 8 */ -#define COM8_FASTAEC 0x80 /* Enable fast AGC/AEC */ -#define COM8_AECSTEP 0x40 /* Unlimited AEC step size */ -#define COM8_BFILT 0x20 /* Band filter enable */ -#define COM8_AGC 0x04 /* Auto gain enable */ -#define COM8_AWB 0x02 /* White balance enable */ -#define COM8_AEC 0x01 /* Auto exposure enable */ -#define REG_COM9 0x14 /* Control 9 - gain ceiling */ -#define REG_COM10 0x15 /* Control 10 */ -#define COM10_HSYNC 0x40 /* HSYNC instead of HREF */ -#define COM10_PCLK_HB 0x20 /* Suppress PCLK on horiz blank */ -#define COM10_HREF_REV 0x08 /* Reverse HREF */ -#define COM10_VS_LEAD 0x04 /* VSYNC on clock leading edge */ -#define COM10_VS_NEG 0x02 /* VSYNC negative */ -#define COM10_HS_NEG 0x01 /* HSYNC negative */ -#define REG_HSTART 0x17 /* Horiz start high bits */ -#define REG_HSTOP 0x18 /* Horiz stop high bits */ -#define REG_VSTART 0x19 /* Vert start high bits */ -#define REG_VSTOP 0x1a /* Vert stop high bits */ -#define REG_PSHFT 0x1b /* Pixel delay after HREF */ -#define REG_MIDH 0x1c /* Manuf. ID high */ -#define REG_MIDL 0x1d /* Manuf. ID low */ -#define REG_MVFP 0x1e /* Mirror / vflip */ -#define MVFP_MIRROR 0x20 /* Mirror image */ -#define MVFP_FLIP 0x10 /* Vertical flip */ -#define REG_AEW 0x24 /* AGC upper limit */ -#define REG_AEB 0x25 /* AGC lower limit */ -#define REG_VPT 0x26 /* AGC/AEC fast mode op region */ -#define REG_HSYST 0x30 /* HSYNC rising edge delay */ -#define REG_HSYEN 0x31 /* HSYNC falling edge delay */ -#define REG_HREF 0x32 /* HREF pieces */ -#define REG_TSLB 0x3a /* lots of stuff */ -#define TSLB_YLAST 0x04 /* UYVY or VYUY - see com13 */ -#define REG_COM11 0x3b /* Control 11 */ -#define COM11_NIGHT 0x80 /* NIght mode enable */ -#define COM11_NMFR 0x60 /* Two bit NM frame rate */ -#define COM11_HZAUTO 0x10 /* Auto detect 50/60 Hz */ -#define COM11_50HZ 0x08 /* Manual 50Hz select */ -#define COM11_EXP 0x02 -#define REG_COM12 0x3c /* Control 12 */ -#define COM12_HREF 0x80 /* HREF always */ -#define REG_COM13 0x3d /* Control 13 */ -#define COM13_GAMMA 0x80 /* Gamma enable */ -#define COM13_UVSAT 0x40 /* UV saturation auto adjustment */ -#define COM13_UVSWAP 0x01 /* V before U - w/TSLB */ -#define REG_COM14 0x3e /* Control 14 */ -#define COM14_DCWEN 0x10 /* DCW/PCLK-scale enable */ -#define REG_EDGE 0x3f /* Edge enhancement factor */ -#define REG_COM15 0x40 /* Control 15 */ -#define COM15_R10F0 0x00 /* Data range 10 to F0 */ -#define COM15_R01FE 0x80 /* 01 to FE */ -#define COM15_R00FF 0xc0 /* 00 to FF */ -#define COM15_RGB565 0x10 /* RGB565 output */ -#define COM15_RGB555 0x30 /* RGB555 output */ -#define REG_COM16 0x41 /* Control 16 */ -#define COM16_AWBGAIN 0x08 /* AWB gain enable */ -#define REG_COM17 0x42 /* Control 17 */ -#define COM17_AECWIN 0xc0 /* AEC window - must match COM4 */ -#define COM17_CBAR 0x08 /* DSP Color bar */ -#define REG_CMATRIX_BASE 0x4f -#define CMATRIX_LEN 6 -#define REG_CMATRIX_SIGN 0x58 -#define REG_BRIGHT 0x55 /* Brightness */ -#define REG_CONTRAS 0x56 /* Contrast control */ -#define REG_GFIX 0x69 /* Fix gain control */ -#define REG_REG76 0x76 /* OV's name */ -#define R76_BLKPCOR 0x80 /* Black pixel correction enable */ -#define R76_WHTPCOR 0x40 /* White pixel correction enable */ -#define REG_RGB444 0x8c /* RGB 444 control */ -#define R444_ENABLE 0x02 /* Turn on RGB444, overrides 5x5 */ -#define R444_RGBX 0x01 /* Empty nibble at end */ -#define REG_HAECC1 0x9f /* Hist AEC/AGC control 1 */ -#define REG_HAECC2 0xa0 /* Hist AEC/AGC control 2 */ -#define REG_BD50MAX 0xa5 /* 50hz banding step limit */ -#define REG_HAECC3 0xa6 /* Hist AEC/AGC control 3 */ -#define REG_HAECC4 0xa7 /* Hist AEC/AGC control 4 */ -#define REG_HAECC5 0xa8 /* Hist AEC/AGC control 5 */ -#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 */