ov7670 no fifo
OV6620.cpp@1:e216fd4e8d9c, 2016-11-21 (annotated)
- Committer:
- rulla
- Date:
- Mon Nov 21 10:04:38 2016 +0000
- Revision:
- 1:e216fd4e8d9c
k
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rulla | 1:e216fd4e8d9c | 1 | #include "mbed.h" |
rulla | 1:e216fd4e8d9c | 2 | #include "OV6620reg.h" |
rulla | 1:e216fd4e8d9c | 3 | #include "OV6620.h" |
rulla | 1:e216fd4e8d9c | 4 | |
rulla | 1:e216fd4e8d9c | 5 | void OV6620::CaptureNext(void) { |
rulla | 1:e216fd4e8d9c | 6 | CaptureReq = true ; |
rulla | 1:e216fd4e8d9c | 7 | Busy = true ; |
rulla | 1:e216fd4e8d9c | 8 | } |
rulla | 1:e216fd4e8d9c | 9 | |
rulla | 1:e216fd4e8d9c | 10 | bool OV6620::CaptureDone(void) { |
rulla | 1:e216fd4e8d9c | 11 | bool result ; |
rulla | 1:e216fd4e8d9c | 12 | if (Busy) { |
rulla | 1:e216fd4e8d9c | 13 | result = false ; |
rulla | 1:e216fd4e8d9c | 14 | } else { |
rulla | 1:e216fd4e8d9c | 15 | result = Done ; |
rulla | 1:e216fd4e8d9c | 16 | Done = false ; |
rulla | 1:e216fd4e8d9c | 17 | } |
rulla | 1:e216fd4e8d9c | 18 | return result ; |
rulla | 1:e216fd4e8d9c | 19 | } |
rulla | 1:e216fd4e8d9c | 20 | |
rulla | 1:e216fd4e8d9c | 21 | void OV6620::WriteReg(int addr,int data) { |
rulla | 1:e216fd4e8d9c | 22 | camera.start(); |
rulla | 1:e216fd4e8d9c | 23 | //camera.write(CAMERA_I2C_WRITE_ADDR); |
rulla | 1:e216fd4e8d9c | 24 | camera.write(addr); |
rulla | 1:e216fd4e8d9c | 25 | camera.write(data); |
rulla | 1:e216fd4e8d9c | 26 | camera.stop(); |
rulla | 1:e216fd4e8d9c | 27 | wait_us(50); |
rulla | 1:e216fd4e8d9c | 28 | } |
rulla | 1:e216fd4e8d9c | 29 | |
rulla | 1:e216fd4e8d9c | 30 | int OV6620::ReadReg(int addr) { |
rulla | 1:e216fd4e8d9c | 31 | int data ; |
rulla | 1:e216fd4e8d9c | 32 | camera.start() ; |
rulla | 1:e216fd4e8d9c | 33 | camera.write(OV6620_WRITE) ; |
rulla | 1:e216fd4e8d9c | 34 | wait_us(OV6620_WRITEWAIT); |
rulla | 1:e216fd4e8d9c | 35 | camera.write(addr) ; |
rulla | 1:e216fd4e8d9c | 36 | camera.stop() ; |
rulla | 1:e216fd4e8d9c | 37 | wait_us(OV6620_WRITEWAIT); |
rulla | 1:e216fd4e8d9c | 38 | camera.start() ; |
rulla | 1:e216fd4e8d9c | 39 | camera.write(OV6620_READ) ; |
rulla | 1:e216fd4e8d9c | 40 | wait_us(OV6620_WRITEWAIT); |
rulla | 1:e216fd4e8d9c | 41 | data = camera.read(OV6620_NOACK) ; |
rulla | 1:e216fd4e8d9c | 42 | camera.stop() ; |
rulla | 1:e216fd4e8d9c | 43 | return data ; |
rulla | 1:e216fd4e8d9c | 44 | } |
rulla | 1:e216fd4e8d9c | 45 | |
rulla | 1:e216fd4e8d9c | 46 | int OV6620::Rreg(int addr) { |
rulla | 1:e216fd4e8d9c | 47 | int data ; |
rulla | 1:e216fd4e8d9c | 48 | camera.start() ; |
rulla | 1:e216fd4e8d9c | 49 | camera.write(OV6620_WRITE) ; |
rulla | 1:e216fd4e8d9c | 50 | wait_us(OV6620_WRITEWAIT); |
rulla | 1:e216fd4e8d9c | 51 | camera.write(addr) ; |
rulla | 1:e216fd4e8d9c | 52 | camera.stop() ; |
rulla | 1:e216fd4e8d9c | 53 | wait_us(OV6620_WRITEWAIT); |
rulla | 1:e216fd4e8d9c | 54 | camera.start() ; |
rulla | 1:e216fd4e8d9c | 55 | camera.write(OV6620_READ) ; |
rulla | 1:e216fd4e8d9c | 56 | wait_us(OV6620_WRITEWAIT); |
rulla | 1:e216fd4e8d9c | 57 | data = camera.read(OV6620_NOACK) ; |
rulla | 1:e216fd4e8d9c | 58 | camera.stop() ; |
rulla | 1:e216fd4e8d9c | 59 | return data ; |
rulla | 1:e216fd4e8d9c | 60 | } |
rulla | 1:e216fd4e8d9c | 61 | |
rulla | 1:e216fd4e8d9c | 62 | void OV6620::Reset(void) { |
rulla | 1:e216fd4e8d9c | 63 | WriteReg(0x12,0xa4) ; // RESET CAMERA |
rulla | 1:e216fd4e8d9c | 64 | wait_ms(200) ; |
rulla | 1:e216fd4e8d9c | 65 | } |
rulla | 1:e216fd4e8d9c | 66 | |
rulla | 1:e216fd4e8d9c | 67 | void OV6620::Wreg (int addr,int data) { |
rulla | 1:e216fd4e8d9c | 68 | camera.start(); |
rulla | 1:e216fd4e8d9c | 69 | camera.write(CAMERA_I2C_WRITE_ADDR); |
rulla | 1:e216fd4e8d9c | 70 | camera.write(addr); |
rulla | 1:e216fd4e8d9c | 71 | camera.write(data); |
rulla | 1:e216fd4e8d9c | 72 | camera.stop(); |
rulla | 1:e216fd4e8d9c | 73 | wait_us(50); |
rulla | 1:e216fd4e8d9c | 74 | } |
rulla | 1:e216fd4e8d9c | 75 | |
rulla | 1:e216fd4e8d9c | 76 | void OV6620::InitQQVGA(void) { |
rulla | 1:e216fd4e8d9c | 77 | |
rulla | 1:e216fd4e8d9c | 78 | xclk..period(1/24000000.0); |
rulla | 1:e216fd4e8d9c | 79 | xclk.write(.5); |
rulla | 1:e216fd4e8d9c | 80 | |
rulla | 1:e216fd4e8d9c | 81 | Reset(); |
rulla | 1:e216fd4e8d9c | 82 | Reset(); |
rulla | 1:e216fd4e8d9c | 83 | WriteReg(CLKRC,0x00); |
rulla | 1:e216fd4e8d9c | 84 | WriteReg(COM_A,0x24); |
rulla | 1:e216fd4e8d9c | 85 | WriteReg(COM_C,0x20); |
rulla | 1:e216fd4e8d9c | 86 | |
rulla | 1:e216fd4e8d9c | 87 | wait(0.1); |
rulla | 1:e216fd4e8d9c | 88 | } |
rulla | 1:e216fd4e8d9c | 89 | |
rulla | 1:e216fd4e8d9c | 90 | // vsync handler |
rulla | 1:e216fd4e8d9c | 91 | void OV6620::VsyncHandler(void) { |
rulla | 1:e216fd4e8d9c | 92 | FrameCounter++; |
rulla | 1:e216fd4e8d9c | 93 | } |
rulla | 1:e216fd4e8d9c | 94 | |
rulla | 1:e216fd4e8d9c | 95 | // href handler |
rulla | 1:e216fd4e8d9c | 96 | void OV6620::HrefHandler(void) { |
rulla | 1:e216fd4e8d9c | 97 | LineCounter++ ; |
rulla | 1:e216fd4e8d9c | 98 | } |
rulla | 1:e216fd4e8d9c | 99 | |
rulla | 1:e216fd4e8d9c | 100 | // pclk handler |
rulla | 1:e216fd4e8d9c | 101 | void OV6620::PclkHandler(void) { |
rulla | 1:e216fd4e8d9c | 102 | PixCounter++ ; |
rulla | 1:e216fd4e8d9c | 103 | } |
rulla | 1:e216fd4e8d9c | 104 | |
rulla | 1:e216fd4e8d9c | 105 | void OV6620::wait_posedge(InterruptIn pin) { |
rulla | 1:e216fd4e8d9c | 106 | while(pin); |
rulla | 1:e216fd4e8d9c | 107 | while(!pin); |
rulla | 1:e216fd4e8d9c | 108 | } |
rulla | 1:e216fd4e8d9c | 109 | |
rulla | 1:e216fd4e8d9c | 110 | void OV6620::wait_negedge(InterruptIn pin) { |
rulla | 1:e216fd4e8d9c | 111 | while(!pin); |
rulla | 1:e216fd4e8d9c | 112 | while(pin) ; |
rulla | 1:e216fd4e8d9c | 113 | } |
rulla | 1:e216fd4e8d9c | 114 | |
rulla | 1:e216fd4e8d9c | 115 | // Data Read |
rulla | 1:e216fd4e8d9c | 116 | int OV6620::ReadOneByte(void) { |
rulla | 1:e216fd4e8d9c | 117 | int result = (((dataP&0x07800000)>>19)|((dataP&0x078000)>>15)); |
rulla | 1:e216fd4e8d9c | 118 | return result ; |
rulla | 1:e216fd4e8d9c | 119 | } |
rulla | 1:e216fd4e8d9c | 120 | |
rulla | 1:e216fd4e8d9c | 121 | |
rulla | 1:e216fd4e8d9c | 122 | void OV6620::shot(void) { |
rulla | 1:e216fd4e8d9c | 123 | uint8_t b1,b2; |
rulla | 1:e216fd4e8d9c | 124 | int x = 0,pix=0; // col |
rulla | 1:e216fd4e8d9c | 125 | int y = 0,line=0; // row |
rulla | 1:e216fd4e8d9c | 126 | int n = 0; // px number |
rulla | 1:e216fd4e8d9c | 127 | int r,g,b; |
rulla | 1:e216fd4e8d9c | 128 | |
rulla | 1:e216fd4e8d9c | 129 | while(vsync); |
rulla | 1:e216fd4e8d9c | 130 | while(!vsync); // pc.printf("!vsync 1 %d %d %d\r\n", vsync& 0x1,href& 0x1,pclk& 0x1); |
rulla | 1:e216fd4e8d9c | 131 | while(vsync); |
rulla | 1:e216fd4e8d9c | 132 | while(!vsync); |
rulla | 1:e216fd4e8d9c | 133 | while(vsync); |
rulla | 1:e216fd4e8d9c | 134 | |
rulla | 1:e216fd4e8d9c | 135 | for ( y=0; y<SIZEY; y++){ |
rulla | 1:e216fd4e8d9c | 136 | while (!href); |
rulla | 1:e216fd4e8d9c | 137 | for ( x=0; x<SIZEX; x++){ |
rulla | 1:e216fd4e8d9c | 138 | |
rulla | 1:e216fd4e8d9c | 139 | while(!pclk); |
rulla | 1:e216fd4e8d9c | 140 | if (line>0){ |
rulla | 1:e216fd4e8d9c | 141 | b1=dataP; |
rulla | 1:e216fd4e8d9c | 142 | result=dataP.read(); |
rulla | 1:e216fd4e8d9c | 143 | } |
rulla | 1:e216fd4e8d9c | 144 | while (pclk); |
rulla | 1:e216fd4e8d9c | 145 | |
rulla | 1:e216fd4e8d9c | 146 | while(!pclk); |
rulla | 1:e216fd4e8d9c | 147 | if (line>0){ |
rulla | 1:e216fd4e8d9c | 148 | b2=dataP; |
rulla | 1:e216fd4e8d9c | 149 | result=dataP.read(); |
rulla | 1:e216fd4e8d9c | 150 | } |
rulla | 1:e216fd4e8d9c | 151 | while (pclk); |
rulla | 1:e216fd4e8d9c | 152 | |
rulla | 1:e216fd4e8d9c | 153 | r=((bank1 & 0x1f)) ; |
rulla | 1:e216fd4e8d9c | 154 | g= ((bank1&0xe0)>>5 ) | ((bank0&0x7)<<3); |
rulla | 1:e216fd4e8d9c | 155 | b=((bank0 & 0xf8)>>3 ); |
rulla | 1:e216fd4e8d9c | 156 | colour = (((r<<11)&0xF800)|((g<<5)&0x7E0)| (b&0x1f)); |
rulla | 1:e216fd4e8d9c | 157 | TFT.pixel(x,y,colour); |
rulla | 1:e216fd4e8d9c | 158 | } |
rulla | 1:e216fd4e8d9c | 159 | while(href); |
rulla | 1:e216fd4e8d9c | 160 | } |
rulla | 1:e216fd4e8d9c | 161 | |
rulla | 1:e216fd4e8d9c | 162 | printf("x , y = %d , %d n= %d\r\n", x,y,FrameCounter); |
rulla | 1:e216fd4e8d9c | 163 | printf("frame\n"); |
rulla | 1:e216fd4e8d9c | 164 | n=0; |
rulla | 1:e216fd4e8d9c | 165 | y=0; |
rulla | 1:e216fd4e8d9c | 166 | x=0; |
rulla | 1:e216fd4e8d9c | 167 | /* |
rulla | 1:e216fd4e8d9c | 168 | for(y=0; y<SIZEY; y++) { |
rulla | 1:e216fd4e8d9c | 169 | for(x=0; x<SIZEX; x++) { |
rulla | 1:e216fd4e8d9c | 170 | // pc.printf("%d %d\n",n,byt[n]); |
rulla | 1:e216fd4e8d9c | 171 | // pc.printf("%u\n",b1[n]); |
rulla | 1:e216fd4e8d9c | 172 | //TFT.pixel(x,y,b1[n]); |
rulla | 1:e216fd4e8d9c | 173 | n++; |
rulla | 1:e216fd4e8d9c | 174 | } |
rulla | 1:e216fd4e8d9c | 175 | } |
rulla | 1:e216fd4e8d9c | 176 | */ |
rulla | 1:e216fd4e8d9c | 177 | printf("enddddddddd frame\n"); |
rulla | 1:e216fd4e8d9c | 178 | }// SHOT |
rulla | 1:e216fd4e8d9c | 179 | } |