ov7670 no fifo
OV7670.cpp@2:90b79650f69d, 2020-04-20 (annotated)
- Committer:
- rulla
- Date:
- Mon Apr 20 15:04:18 2020 +0000
- Revision:
- 2:90b79650f69d
new
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rulla | 2:90b79650f69d | 1 | #include "mbed.h" |
rulla | 2:90b79650f69d | 2 | #include "OV7670reg.h" |
rulla | 2:90b79650f69d | 3 | #include "OV7670.h" |
rulla | 2:90b79650f69d | 4 | |
rulla | 2:90b79650f69d | 5 | void OV7670::CaptureNext(void) { |
rulla | 2:90b79650f69d | 6 | CaptureReq = true ; |
rulla | 2:90b79650f69d | 7 | Busy = true ; |
rulla | 2:90b79650f69d | 8 | } |
rulla | 2:90b79650f69d | 9 | |
rulla | 2:90b79650f69d | 10 | bool OV7670::CaptureDone(void) { |
rulla | 2:90b79650f69d | 11 | bool result ; |
rulla | 2:90b79650f69d | 12 | if (Busy) { |
rulla | 2:90b79650f69d | 13 | result = false ; |
rulla | 2:90b79650f69d | 14 | } else { |
rulla | 2:90b79650f69d | 15 | result = Done ; |
rulla | 2:90b79650f69d | 16 | Done = false ; |
rulla | 2:90b79650f69d | 17 | } |
rulla | 2:90b79650f69d | 18 | return result ; |
rulla | 2:90b79650f69d | 19 | } |
rulla | 2:90b79650f69d | 20 | |
rulla | 2:90b79650f69d | 21 | void OV7670::WriteReg(int addr,char data) { |
rulla | 2:90b79650f69d | 22 | camera.frequency(OV7670_I2CFREQ); |
rulla | 2:90b79650f69d | 23 | camera.start() ; |
rulla | 2:90b79650f69d | 24 | camera.write(OV7670_WRITE) ; |
rulla | 2:90b79650f69d | 25 | wait_us(OV7670_WRITEWAIT); |
rulla | 2:90b79650f69d | 26 | camera.write(addr) ; |
rulla | 2:90b79650f69d | 27 | wait_us(OV7670_WRITEWAIT); |
rulla | 2:90b79650f69d | 28 | camera.write(data) ; |
rulla | 2:90b79650f69d | 29 | camera.stop() ; |
rulla | 2:90b79650f69d | 30 | wait_us(10); |
rulla | 2:90b79650f69d | 31 | } |
rulla | 2:90b79650f69d | 32 | |
rulla | 2:90b79650f69d | 33 | char OV7670::ReadReg(int addr) { |
rulla | 2:90b79650f69d | 34 | int data ; |
rulla | 2:90b79650f69d | 35 | camera.frequency(OV7670_I2CFREQ); |
rulla | 2:90b79650f69d | 36 | camera.start() ; |
rulla | 2:90b79650f69d | 37 | camera.write(OV7670_WRITE) ; |
rulla | 2:90b79650f69d | 38 | wait_us(OV7670_WRITEWAIT); |
rulla | 2:90b79650f69d | 39 | camera.write(addr) ; |
rulla | 2:90b79650f69d | 40 | camera.stop() ; |
rulla | 2:90b79650f69d | 41 | wait_us(OV7670_WRITEWAIT); |
rulla | 2:90b79650f69d | 42 | camera.start() ; |
rulla | 2:90b79650f69d | 43 | camera.write(OV7670_READ) ; |
rulla | 2:90b79650f69d | 44 | wait_us(OV7670_WRITEWAIT); |
rulla | 2:90b79650f69d | 45 | data = camera.read(OV7670_NOACK) ; |
rulla | 2:90b79650f69d | 46 | camera.stop() ; |
rulla | 2:90b79650f69d | 47 | wait_us(10); |
rulla | 2:90b79650f69d | 48 | return data ; |
rulla | 2:90b79650f69d | 49 | } |
rulla | 2:90b79650f69d | 50 | |
rulla | 2:90b79650f69d | 51 | void OV7670::Reset(float frequ) { |
rulla | 2:90b79650f69d | 52 | |
rulla | 2:90b79650f69d | 53 | wait_ms(200) ; |
rulla | 2:90b79650f69d | 54 | WriteReg(0x12,0xa4) ; // RESET CAMERA |
rulla | 2:90b79650f69d | 55 | wait_ms(200) ; |
rulla | 2:90b79650f69d | 56 | } |
rulla | 2:90b79650f69d | 57 | |
rulla | 2:90b79650f69d | 58 | void OV7670::Init2(void){ |
rulla | 2:90b79650f69d | 59 | |
rulla | 2:90b79650f69d | 60 | int hstart = 456, hstop = 24, vstart = 14, vstop = 494; |
rulla | 2:90b79650f69d | 61 | unsigned char v; |
rulla | 2:90b79650f69d | 62 | |
rulla | 2:90b79650f69d | 63 | WriteReg(REG_COM7, COM7_RESET); /* reset to default values */ |
rulla | 2:90b79650f69d | 64 | WriteReg(REG_CLKRC, 0x01); |
rulla | 2:90b79650f69d | 65 | WriteReg(REG_COM7, 0x10); /* output format: YUCV */ |
rulla | 2:90b79650f69d | 66 | |
rulla | 2:90b79650f69d | 67 | WriteReg(REG_HSTART, (hstart >> 3) & 0xff); |
rulla | 2:90b79650f69d | 68 | WriteReg(REG_HSTOP, (hstop >> 3) & 0xff); |
rulla | 2:90b79650f69d | 69 | v = ReadReg(REG_HREF); |
rulla | 2:90b79650f69d | 70 | v = (v & 0xc0) | ((hstop & 0x7) << 3) | (hstart & 0x7); |
rulla | 2:90b79650f69d | 71 | WriteReg(REG_HREF, v); |
rulla | 2:90b79650f69d | 72 | |
rulla | 2:90b79650f69d | 73 | WriteReg(REG_VSTART, (vstart >> 2) & 0xff); |
rulla | 2:90b79650f69d | 74 | WriteReg(REG_VSTOP, (vstop >> 2) & 0xff); |
rulla | 2:90b79650f69d | 75 | v = ReadReg(REG_VREF); |
rulla | 2:90b79650f69d | 76 | v = (v & 0xf0) | ((vstop & 0x3) << 2) | (vstart & 0x3); |
rulla | 2:90b79650f69d | 77 | WriteReg(REG_VREF, v); |
rulla | 2:90b79650f69d | 78 | |
rulla | 2:90b79650f69d | 79 | WriteReg(REG_COM3, COM3_SCALEEN | COM3_DCWEN); |
rulla | 2:90b79650f69d | 80 | WriteReg(REG_COM14, COM14_DCWEN | 0x01); |
rulla | 2:90b79650f69d | 81 | WriteReg(0x73, 0xf1); |
rulla | 2:90b79650f69d | 82 | WriteReg(0xa2, 0x52); |
rulla | 2:90b79650f69d | 83 | WriteReg(0x7b, 0x1c); |
rulla | 2:90b79650f69d | 84 | WriteReg(0x7c, 0x28); |
rulla | 2:90b79650f69d | 85 | WriteReg(0x7d, 0x3c); |
rulla | 2:90b79650f69d | 86 | WriteReg(0x7f, 0x69); |
rulla | 2:90b79650f69d | 87 | WriteReg(REG_COM9, 0x38); |
rulla | 2:90b79650f69d | 88 | WriteReg(0xa1, 0x0b); |
rulla | 2:90b79650f69d | 89 | WriteReg(0x74, 0x19); |
rulla | 2:90b79650f69d | 90 | WriteReg(0x9a, 0x80); |
rulla | 2:90b79650f69d | 91 | WriteReg(0x43, 0x14); |
rulla | 2:90b79650f69d | 92 | WriteReg(REG_COM13, 0xc0); |
rulla | 2:90b79650f69d | 93 | WriteReg(0x70, 0x3A); |
rulla | 2:90b79650f69d | 94 | WriteReg(0x71, 0x35); |
rulla | 2:90b79650f69d | 95 | WriteReg(0x72, 0x11); |
rulla | 2:90b79650f69d | 96 | |
rulla | 2:90b79650f69d | 97 | /* Gamma curve values */ |
rulla | 2:90b79650f69d | 98 | WriteReg(0x7a, 0x20); |
rulla | 2:90b79650f69d | 99 | WriteReg(0x7b, 0x10); |
rulla | 2:90b79650f69d | 100 | WriteReg(0x7c, 0x1e); |
rulla | 2:90b79650f69d | 101 | WriteReg(0x7d, 0x35); |
rulla | 2:90b79650f69d | 102 | WriteReg(0x7e, 0x5a); |
rulla | 2:90b79650f69d | 103 | WriteReg(0x7f, 0x69); |
rulla | 2:90b79650f69d | 104 | WriteReg(0x80, 0x76); |
rulla | 2:90b79650f69d | 105 | WriteReg(0x81, 0x80); |
rulla | 2:90b79650f69d | 106 | WriteReg(0x82, 0x88); |
rulla | 2:90b79650f69d | 107 | WriteReg(0x83, 0x8f); |
rulla | 2:90b79650f69d | 108 | WriteReg(0x84, 0x96); |
rulla | 2:90b79650f69d | 109 | WriteReg(0x85, 0xa3); |
rulla | 2:90b79650f69d | 110 | WriteReg(0x86, 0xaf); |
rulla | 2:90b79650f69d | 111 | WriteReg(0x87, 0xc4); |
rulla | 2:90b79650f69d | 112 | WriteReg(0x88, 0xd7); |
rulla | 2:90b79650f69d | 113 | WriteReg(0x89, 0xe8); |
rulla | 2:90b79650f69d | 114 | |
rulla | 2:90b79650f69d | 115 | /* AGC and AEC parameters. Note we start by disabling those features, |
rulla | 2:90b79650f69d | 116 | then turn them only after tweaking the values. */ |
rulla | 2:90b79650f69d | 117 | WriteReg(REG_COM8, COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT); |
rulla | 2:90b79650f69d | 118 | WriteReg(REG_GAIN, 0); |
rulla | 2:90b79650f69d | 119 | WriteReg(REG_AECH, 0); |
rulla | 2:90b79650f69d | 120 | WriteReg(REG_COM4, 0x40); /* magic reserved bit */ |
rulla | 2:90b79650f69d | 121 | WriteReg(REG_COM9, 0x18); /* 4x gain + magic rsvd bit */ |
rulla | 2:90b79650f69d | 122 | WriteReg(REG_BD50MAX, 0x05); |
rulla | 2:90b79650f69d | 123 | WriteReg(REG_BD60MAX, 0x07); |
rulla | 2:90b79650f69d | 124 | WriteReg(REG_AEW, 0x95); |
rulla | 2:90b79650f69d | 125 | WriteReg(REG_AEB, 0x33); |
rulla | 2:90b79650f69d | 126 | WriteReg(REG_VPT, 0xe3); |
rulla | 2:90b79650f69d | 127 | WriteReg(REG_HAECC1, 0x78); |
rulla | 2:90b79650f69d | 128 | WriteReg(REG_HAECC2, 0x68); |
rulla | 2:90b79650f69d | 129 | WriteReg(0xa1, 0x03); /* magic */ |
rulla | 2:90b79650f69d | 130 | WriteReg(REG_HAECC3, 0xd8); |
rulla | 2:90b79650f69d | 131 | WriteReg(REG_HAECC4, 0xd8); |
rulla | 2:90b79650f69d | 132 | WriteReg(REG_HAECC5, 0xf0); |
rulla | 2:90b79650f69d | 133 | WriteReg(REG_HAECC6, 0x90); |
rulla | 2:90b79650f69d | 134 | WriteReg(REG_HAECC7, 0x94); |
rulla | 2:90b79650f69d | 135 | WriteReg(REG_COM8, |
rulla | 2:90b79650f69d | 136 | COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT | COM8_AGC | COM8_AEC); |
rulla | 2:90b79650f69d | 137 | |
rulla | 2:90b79650f69d | 138 | /* Almost all of these are magic "reserved" values. */ |
rulla | 2:90b79650f69d | 139 | WriteReg(REG_COM5, 0x61); |
rulla | 2:90b79650f69d | 140 | WriteReg(REG_COM6, 0x4b); |
rulla | 2:90b79650f69d | 141 | WriteReg(0x16, 0x02); |
rulla | 2:90b79650f69d | 142 | WriteReg(REG_MVFP, 0x07); |
rulla | 2:90b79650f69d | 143 | WriteReg(0x21, 0x02); |
rulla | 2:90b79650f69d | 144 | WriteReg(0x22, 0x91); |
rulla | 2:90b79650f69d | 145 | WriteReg(0x29, 0x07); |
rulla | 2:90b79650f69d | 146 | WriteReg(0x33, 0x0b); |
rulla | 2:90b79650f69d | 147 | WriteReg(0x35, 0x0b); |
rulla | 2:90b79650f69d | 148 | WriteReg(0x37, 0x1d); |
rulla | 2:90b79650f69d | 149 | WriteReg(0x38, 0x71); |
rulla | 2:90b79650f69d | 150 | WriteReg(0x39, 0x2a); |
rulla | 2:90b79650f69d | 151 | WriteReg(REG_COM12, 0x78); |
rulla | 2:90b79650f69d | 152 | WriteReg(0x4d, 0x40); |
rulla | 2:90b79650f69d | 153 | WriteReg(0x4e, 0x20); |
rulla | 2:90b79650f69d | 154 | WriteReg(REG_GFIX, 0); |
rulla | 2:90b79650f69d | 155 | WriteReg(0x6b, 0x4a); |
rulla | 2:90b79650f69d | 156 | WriteReg(0x74, 0x10); |
rulla | 2:90b79650f69d | 157 | WriteReg(0x8d, 0x4f); |
rulla | 2:90b79650f69d | 158 | WriteReg(0x8e, 0); |
rulla | 2:90b79650f69d | 159 | WriteReg(0x8f, 0); |
rulla | 2:90b79650f69d | 160 | WriteReg(0x90, 0); |
rulla | 2:90b79650f69d | 161 | WriteReg(0x91, 0); |
rulla | 2:90b79650f69d | 162 | WriteReg(0x96, 0); |
rulla | 2:90b79650f69d | 163 | WriteReg(0x9a, 0); |
rulla | 2:90b79650f69d | 164 | WriteReg(0xb0, 0x84); |
rulla | 2:90b79650f69d | 165 | WriteReg(0xb1, 0x0c); |
rulla | 2:90b79650f69d | 166 | WriteReg(0xb2, 0x0e); |
rulla | 2:90b79650f69d | 167 | WriteReg(0xb3, 0x82); |
rulla | 2:90b79650f69d | 168 | WriteReg(0xb8, 0x0a); |
rulla | 2:90b79650f69d | 169 | |
rulla | 2:90b79650f69d | 170 | /* Matrix coefficients */ |
rulla | 2:90b79650f69d | 171 | WriteReg(0x4f, 0x80); |
rulla | 2:90b79650f69d | 172 | WriteReg(0x50, 0x80); |
rulla | 2:90b79650f69d | 173 | WriteReg(0x51, 0); |
rulla | 2:90b79650f69d | 174 | WriteReg(0x52, 0x22); |
rulla | 2:90b79650f69d | 175 | WriteReg(0x53, 0x5e); |
rulla | 2:90b79650f69d | 176 | WriteReg(0x54, 0x80); |
rulla | 2:90b79650f69d | 177 | WriteReg(0x58, 0x9e); |
rulla | 2:90b79650f69d | 178 | |
rulla | 2:90b79650f69d | 179 | /* More reserved magic, some of which tweaks white balance */ |
rulla | 2:90b79650f69d | 180 | WriteReg(0x43, 0x0a); |
rulla | 2:90b79650f69d | 181 | WriteReg(0x44, 0xf0); |
rulla | 2:90b79650f69d | 182 | WriteReg(0x45, 0x34); |
rulla | 2:90b79650f69d | 183 | WriteReg(0x46, 0x58); |
rulla | 2:90b79650f69d | 184 | WriteReg(0x47, 0x28); |
rulla | 2:90b79650f69d | 185 | WriteReg(0x48, 0x3a); |
rulla | 2:90b79650f69d | 186 | WriteReg(0x59, 0x88); |
rulla | 2:90b79650f69d | 187 | WriteReg(0x5a, 0x88); |
rulla | 2:90b79650f69d | 188 | WriteReg(0x5b, 0x44); |
rulla | 2:90b79650f69d | 189 | WriteReg(0x5c, 0x67); |
rulla | 2:90b79650f69d | 190 | WriteReg(0x5d, 0x49); |
rulla | 2:90b79650f69d | 191 | WriteReg(0x5e, 0x0e); |
rulla | 2:90b79650f69d | 192 | WriteReg(0x6c, 0x0a); |
rulla | 2:90b79650f69d | 193 | WriteReg(0x6d, 0x55); |
rulla | 2:90b79650f69d | 194 | WriteReg(0x6e, 0x11); |
rulla | 2:90b79650f69d | 195 | WriteReg(0x6f, 0x9f); /* "9e for advance AWB" */ |
rulla | 2:90b79650f69d | 196 | WriteReg(0x6a, 0x40); |
rulla | 2:90b79650f69d | 197 | WriteReg(REG_BLUE, 0x40); |
rulla | 2:90b79650f69d | 198 | WriteReg(REG_RED, 0x60); |
rulla | 2:90b79650f69d | 199 | WriteReg(REG_COM8, |
rulla | 2:90b79650f69d | 200 | COM8_FASTAEC | COM8_AECSTEP | COM8_BFILT | COM8_AGC | COM8_AEC |
rulla | 2:90b79650f69d | 201 | | COM8_AWB); |
rulla | 2:90b79650f69d | 202 | } |
rulla | 2:90b79650f69d | 203 | |
rulla | 2:90b79650f69d | 204 | void OV7670::Init(float frequ,int sizeX) { |
rulla | 2:90b79650f69d | 205 | sync.mode(OpenDrain); |
rulla | 2:90b79650f69d | 206 | dataP.mode(PullDown); |
rulla | 2:90b79650f69d | 207 | // printf("point 3\n"); |
rulla | 2:90b79650f69d | 208 | Reset(0.0); |
rulla | 2:90b79650f69d | 209 | Reset(0.0); |
rulla | 2:90b79650f69d | 210 | //if(sizeX==320) { |
rulla | 2:90b79650f69d | 211 | // WriteReg(DBLV, 0xaa); // bypass PLL |
rulla | 2:90b79650f69d | 212 | //WriteReg(REG_CLKRC,0x0c);//0x8c |
rulla | 2:90b79650f69d | 213 | WriteReg(REG_TSLB,0x0c);//0x80 |
rulla | 2:90b79650f69d | 214 | |
rulla | 2:90b79650f69d | 215 | /* |
rulla | 2:90b79650f69d | 216 | WriteReg(SCALING_XSC, 0x4a); |
rulla | 2:90b79650f69d | 217 | WriteReg(SCALING_YSC, 0x35); |
rulla | 2:90b79650f69d | 218 | WriteReg(REG_HREF, 0xa4); |
rulla | 2:90b79650f69d | 219 | WriteReg(REG_HSTART, 168); |
rulla | 2:90b79650f69d | 220 | WriteReg(REG_HSTOP, 24); |
rulla | 2:90b79650f69d | 221 | WriteReg(REG_VREF, 0x0a); |
rulla | 2:90b79650f69d | 222 | WriteReg(REG_VSTART,12); |
rulla | 2:90b79650f69d | 223 | WriteReg(REG_VSTOP, 492); |
rulla | 2:90b79650f69d | 224 | */ |
rulla | 2:90b79650f69d | 225 | |
rulla | 2:90b79650f69d | 226 | //WriteReg(REG_HREF, 0xc0); |
rulla | 2:90b79650f69d | 227 | WriteReg(REG_CLKRC,0x1c) ;//OCCHIO |
rulla | 2:90b79650f69d | 228 | WriteReg(REG_COM10,0x20) ; |
rulla | 2:90b79650f69d | 229 | WriteReg(REG_COM1,0x0) ; |
rulla | 2:90b79650f69d | 230 | WriteReg(REG_COM6,0xc3) ; |
rulla | 2:90b79650f69d | 231 | WriteReg(REG_COM7,0x14) ; |
rulla | 2:90b79650f69d | 232 | WriteReg(REG_COM9,0x48) ; |
rulla | 2:90b79650f69d | 233 | WriteReg(REG_RGB444,0x0) ; |
rulla | 2:90b79650f69d | 234 | |
rulla | 2:90b79650f69d | 235 | WriteReg(REG_COM17,0x00) ; |
rulla | 2:90b79650f69d | 236 | WriteReg(REG_COM3,0x04) ; |
rulla | 2:90b79650f69d | 237 | // WriteReg(REG_COM14, 0x19);//OCCHIO |
rulla | 2:90b79650f69d | 238 | WriteReg(REG_COM15, 0xc0); |
rulla | 2:90b79650f69d | 239 | WriteReg(REG_COM2, 0x03); |
rulla | 2:90b79650f69d | 240 | // WriteReg(SCALING_DCWCTR,0x11); |
rulla | 2:90b79650f69d | 241 | // WriteReg(SCALING_PCLK_DIV,0xf2);//OCCHIO |
rulla | 2:90b79650f69d | 242 | // WriteReg(SCALING_PCLK_DELAY,0x02); |
rulla | 2:90b79650f69d | 243 | WriteReg(REG_COM8,0xc7) ; |
rulla | 2:90b79650f69d | 244 | WriteReg(REG_COM11,0x0a) ;//1A //0x90 |
rulla | 2:90b79650f69d | 245 | WriteReg(REG_COM13, 0xc1);//0x88 |
rulla | 2:90b79650f69d | 246 | WriteReg(REG_EDGE,0x04) ; |
rulla | 2:90b79650f69d | 247 | WriteReg(REG_PSHFT,0x0) ; |
rulla | 2:90b79650f69d | 248 | |
rulla | 2:90b79650f69d | 249 | |
rulla | 2:90b79650f69d | 250 | WriteReg(0x7a, 0x20); |
rulla | 2:90b79650f69d | 251 | WriteReg(0x7b, 0x1c); |
rulla | 2:90b79650f69d | 252 | WriteReg(0x7c, 0x28); |
rulla | 2:90b79650f69d | 253 | WriteReg(0x7d, 0x3c); |
rulla | 2:90b79650f69d | 254 | WriteReg(0x7e, 0x55); |
rulla | 2:90b79650f69d | 255 | WriteReg(0x7f, 0x68); |
rulla | 2:90b79650f69d | 256 | WriteReg(0x80, 0x76); |
rulla | 2:90b79650f69d | 257 | WriteReg(0x81, 0x80); |
rulla | 2:90b79650f69d | 258 | WriteReg(0x82, 0x88); |
rulla | 2:90b79650f69d | 259 | WriteReg(0x83, 0x8f); |
rulla | 2:90b79650f69d | 260 | WriteReg(0x84, 0x96); |
rulla | 2:90b79650f69d | 261 | WriteReg(0x85, 0xa3); |
rulla | 2:90b79650f69d | 262 | WriteReg(0x86, 0xaf); |
rulla | 2:90b79650f69d | 263 | WriteReg(0x87, 0xc4); |
rulla | 2:90b79650f69d | 264 | WriteReg(0x88, 0xd7); |
rulla | 2:90b79650f69d | 265 | WriteReg(0x89, 0xe8); |
rulla | 2:90b79650f69d | 266 | |
rulla | 2:90b79650f69d | 267 | WriteReg(0x13, 0xe0); |
rulla | 2:90b79650f69d | 268 | WriteReg(0x00, 0x00); |
rulla | 2:90b79650f69d | 269 | WriteReg(0x10, 0x00); |
rulla | 2:90b79650f69d | 270 | WriteReg(0x0d, 0x00); |
rulla | 2:90b79650f69d | 271 | WriteReg(0x14, 0x28); |
rulla | 2:90b79650f69d | 272 | WriteReg(0xa5, 0x05); |
rulla | 2:90b79650f69d | 273 | WriteReg(0xab, 0x07); |
rulla | 2:90b79650f69d | 274 | WriteReg(0x24, 0x75); |
rulla | 2:90b79650f69d | 275 | WriteReg(0x25, 0x63); |
rulla | 2:90b79650f69d | 276 | WriteReg(0x26, 0xA5); |
rulla | 2:90b79650f69d | 277 | WriteReg(0x9f, 0x78); |
rulla | 2:90b79650f69d | 278 | WriteReg(0xa0, 0x68); |
rulla | 2:90b79650f69d | 279 | WriteReg(0xa1, 0x03); |
rulla | 2:90b79650f69d | 280 | WriteReg(0xa6, 0xdf); |
rulla | 2:90b79650f69d | 281 | WriteReg(0xa7, 0xdf); |
rulla | 2:90b79650f69d | 282 | WriteReg(0xa8, 0xf0); |
rulla | 2:90b79650f69d | 283 | WriteReg(0xa9, 0x90); |
rulla | 2:90b79650f69d | 284 | WriteReg(0xaa, 0x94); |
rulla | 2:90b79650f69d | 285 | WriteReg(0x13, 0xe5); |
rulla | 2:90b79650f69d | 286 | |
rulla | 2:90b79650f69d | 287 | WriteReg(0x0e, 0x61); |
rulla | 2:90b79650f69d | 288 | WriteReg(0x0f, 0x4b); |
rulla | 2:90b79650f69d | 289 | WriteReg(0x16, 0x02); |
rulla | 2:90b79650f69d | 290 | WriteReg(0x21, 0x02); |
rulla | 2:90b79650f69d | 291 | WriteReg(0x22, 0x91); |
rulla | 2:90b79650f69d | 292 | WriteReg(0x29, 0x07); |
rulla | 2:90b79650f69d | 293 | WriteReg(0x33, 0x0b); |
rulla | 2:90b79650f69d | 294 | WriteReg(0x35, 0x0b); |
rulla | 2:90b79650f69d | 295 | WriteReg(0x37, 0x1d); |
rulla | 2:90b79650f69d | 296 | WriteReg(0x38, 0x71); |
rulla | 2:90b79650f69d | 297 | WriteReg(0x39, 0x2a); |
rulla | 2:90b79650f69d | 298 | WriteReg(0x3c, 0x78); |
rulla | 2:90b79650f69d | 299 | WriteReg(0x4d, 0x40); |
rulla | 2:90b79650f69d | 300 | WriteReg(0x4e, 0x20); |
rulla | 2:90b79650f69d | 301 | WriteReg(0x69, 0x00); |
rulla | 2:90b79650f69d | 302 | WriteReg(0x6b, 0x00); |
rulla | 2:90b79650f69d | 303 | WriteReg(0x74, 0x19); |
rulla | 2:90b79650f69d | 304 | WriteReg(0x8d, 0x4f); |
rulla | 2:90b79650f69d | 305 | WriteReg(0x8e, 0x00); |
rulla | 2:90b79650f69d | 306 | WriteReg(0x8f, 0x00); |
rulla | 2:90b79650f69d | 307 | WriteReg(0x90, 0x00); |
rulla | 2:90b79650f69d | 308 | WriteReg(0x91, 0x00); |
rulla | 2:90b79650f69d | 309 | WriteReg(0x92, 0x00); |
rulla | 2:90b79650f69d | 310 | WriteReg(0x96, 0x00); |
rulla | 2:90b79650f69d | 311 | WriteReg(0x9a, 0x80); |
rulla | 2:90b79650f69d | 312 | WriteReg(0xb0, 0x84); |
rulla | 2:90b79650f69d | 313 | WriteReg(0xb1, 0x0c); |
rulla | 2:90b79650f69d | 314 | WriteReg(0xb2, 0x0e); |
rulla | 2:90b79650f69d | 315 | WriteReg(0xb3, 0x82); |
rulla | 2:90b79650f69d | 316 | WriteReg(0xb8, 0x0a); |
rulla | 2:90b79650f69d | 317 | WriteReg(0x43, 0x14); |
rulla | 2:90b79650f69d | 318 | WriteReg(0x44, 0xf0); |
rulla | 2:90b79650f69d | 319 | WriteReg(0x45, 0x34); |
rulla | 2:90b79650f69d | 320 | WriteReg(0x46, 0x58); |
rulla | 2:90b79650f69d | 321 | WriteReg(0x47, 0x28); |
rulla | 2:90b79650f69d | 322 | WriteReg(0x48, 0x3a); |
rulla | 2:90b79650f69d | 323 | WriteReg(0x59, 0x88); |
rulla | 2:90b79650f69d | 324 | WriteReg(0x5a, 0x88); |
rulla | 2:90b79650f69d | 325 | WriteReg(0x5b, 0x44); |
rulla | 2:90b79650f69d | 326 | WriteReg(0x5c, 0x67); |
rulla | 2:90b79650f69d | 327 | WriteReg(0x5d, 0x49); |
rulla | 2:90b79650f69d | 328 | WriteReg(0x5e, 0x0e); |
rulla | 2:90b79650f69d | 329 | WriteReg(0x64, 0x04); |
rulla | 2:90b79650f69d | 330 | WriteReg(0x65, 0x20); |
rulla | 2:90b79650f69d | 331 | WriteReg(0x66, 0x05); |
rulla | 2:90b79650f69d | 332 | WriteReg(0x94, 0x04); |
rulla | 2:90b79650f69d | 333 | WriteReg(0x95, 0x08); |
rulla | 2:90b79650f69d | 334 | WriteReg(0x6c, 0x0a); |
rulla | 2:90b79650f69d | 335 | WriteReg(0x6d, 0x55); |
rulla | 2:90b79650f69d | 336 | WriteReg(0x6e, 0x11); |
rulla | 2:90b79650f69d | 337 | WriteReg(0x6f, 0x9f); |
rulla | 2:90b79650f69d | 338 | WriteReg(0x6a, 0x40); |
rulla | 2:90b79650f69d | 339 | WriteReg(0x01, 0x40); |
rulla | 2:90b79650f69d | 340 | WriteReg(0x02, 0x40); |
rulla | 2:90b79650f69d | 341 | WriteReg(0x13, 0xe7); |
rulla | 2:90b79650f69d | 342 | WriteReg(0x15, 0x02); |
rulla | 2:90b79650f69d | 343 | WriteReg(0x4f, 0x80); |
rulla | 2:90b79650f69d | 344 | WriteReg(0x50, 0x80); |
rulla | 2:90b79650f69d | 345 | WriteReg(0x51, 0x00); |
rulla | 2:90b79650f69d | 346 | WriteReg(0x52, 0x22); |
rulla | 2:90b79650f69d | 347 | WriteReg(0x53, 0x5e); |
rulla | 2:90b79650f69d | 348 | WriteReg(0x54, 0x80); |
rulla | 2:90b79650f69d | 349 | WriteReg(0x58, 0x9e); |
rulla | 2:90b79650f69d | 350 | WriteReg(0x41, 0x08); |
rulla | 2:90b79650f69d | 351 | WriteReg(0x3f, 0x00); |
rulla | 2:90b79650f69d | 352 | WriteReg(0x75, 0x05); |
rulla | 2:90b79650f69d | 353 | WriteReg(0x76, 0xe1); |
rulla | 2:90b79650f69d | 354 | WriteReg(0x4c, 0x00); |
rulla | 2:90b79650f69d | 355 | WriteReg(0x77, 0x01); |
rulla | 2:90b79650f69d | 356 | WriteReg(0x3d, 0xc2); |
rulla | 2:90b79650f69d | 357 | WriteReg(0x4b, 0x09); |
rulla | 2:90b79650f69d | 358 | WriteReg(0xc9, 0x60); |
rulla | 2:90b79650f69d | 359 | WriteReg(0x41, 0x38); |
rulla | 2:90b79650f69d | 360 | WriteReg(0x56, 0x40); |
rulla | 2:90b79650f69d | 361 | WriteReg(0x34, 0x11); |
rulla | 2:90b79650f69d | 362 | WriteReg(0x3b, 0x02); |
rulla | 2:90b79650f69d | 363 | WriteReg(0xa4, 0x89); |
rulla | 2:90b79650f69d | 364 | WriteReg(0x96, 0x00); |
rulla | 2:90b79650f69d | 365 | WriteReg(0x97, 0x30); |
rulla | 2:90b79650f69d | 366 | WriteReg(0x98, 0x20); |
rulla | 2:90b79650f69d | 367 | WriteReg(0x99, 0x30); |
rulla | 2:90b79650f69d | 368 | WriteReg(0x9a, 0x84); |
rulla | 2:90b79650f69d | 369 | WriteReg(0x9b, 0x29); |
rulla | 2:90b79650f69d | 370 | WriteReg(0x9c, 0x03); |
rulla | 2:90b79650f69d | 371 | WriteReg(0x9d, 0x4c); |
rulla | 2:90b79650f69d | 372 | WriteReg(0x9e, 0x3f); |
rulla | 2:90b79650f69d | 373 | WriteReg(0x78, 0x04); |
rulla | 2:90b79650f69d | 374 | WriteReg(0x79, 0x01); |
rulla | 2:90b79650f69d | 375 | WriteReg(0xc8, 0xf0); |
rulla | 2:90b79650f69d | 376 | WriteReg(0x79, 0x0f); |
rulla | 2:90b79650f69d | 377 | WriteReg(0xc8, 0x00); |
rulla | 2:90b79650f69d | 378 | WriteReg(0x79, 0x10); |
rulla | 2:90b79650f69d | 379 | WriteReg(0xc8, 0x7e); |
rulla | 2:90b79650f69d | 380 | WriteReg(0x79, 0x0a); |
rulla | 2:90b79650f69d | 381 | WriteReg(0xc8, 0x80); |
rulla | 2:90b79650f69d | 382 | WriteReg(0x79, 0x0b); |
rulla | 2:90b79650f69d | 383 | WriteReg(0xc8, 0x01); |
rulla | 2:90b79650f69d | 384 | WriteReg(0x79, 0x0c); |
rulla | 2:90b79650f69d | 385 | WriteReg(0xc8, 0x0f); |
rulla | 2:90b79650f69d | 386 | WriteReg(0x79, 0x0d); |
rulla | 2:90b79650f69d | 387 | WriteReg(0xc8, 0x20); |
rulla | 2:90b79650f69d | 388 | WriteReg(0x79, 0x09); |
rulla | 2:90b79650f69d | 389 | WriteReg(0xc8, 0x80); |
rulla | 2:90b79650f69d | 390 | WriteReg(0x79, 0x02); |
rulla | 2:90b79650f69d | 391 | WriteReg(0xc8, 0xc0); |
rulla | 2:90b79650f69d | 392 | WriteReg(0x79, 0x03); |
rulla | 2:90b79650f69d | 393 | WriteReg(0xc8, 0x40); |
rulla | 2:90b79650f69d | 394 | WriteReg(0x79, 0x05); |
rulla | 2:90b79650f69d | 395 | WriteReg(0xc8, 0x30); |
rulla | 2:90b79650f69d | 396 | WriteReg(0x79, 0x26); |
rulla | 2:90b79650f69d | 397 | WriteReg(0x09, 0x03); |
rulla | 2:90b79650f69d | 398 | WriteReg(0x3b, 0x42); |
rulla | 2:90b79650f69d | 399 | // } |
rulla | 2:90b79650f69d | 400 | WriteReg(0xff, 0xff); /* END MARKER */ |
rulla | 2:90b79650f69d | 401 | |
rulla | 2:90b79650f69d | 402 | // printf("Init\n"); |
rulla | 2:90b79650f69d | 403 | } |
rulla | 2:90b79650f69d | 404 | |
rulla | 2:90b79650f69d | 405 | // vsync handler |
rulla | 2:90b79650f69d | 406 | void OV7670::VsyncHandler(void) { |
rulla | 2:90b79650f69d | 407 | } |
rulla | 2:90b79650f69d | 408 | |
rulla | 2:90b79650f69d | 409 | |
rulla | 2:90b79650f69d | 410 | // href handler |
rulla | 2:90b79650f69d | 411 | void OV7670::HrefHandler(void) { |
rulla | 2:90b79650f69d | 412 | LineCounter++; |
rulla | 2:90b79650f69d | 413 | } |
rulla | 2:90b79650f69d | 414 | |
rulla | 2:90b79650f69d | 415 | // pclk handler |
rulla | 2:90b79650f69d | 416 | void OV7670::PclkHandler(void) { |
rulla | 2:90b79650f69d | 417 | PixCounter++ ; |
rulla | 2:90b79650f69d | 418 | } |
rulla | 2:90b79650f69d | 419 | |
rulla | 2:90b79650f69d | 420 | void OV7670::wait_posedge(InterruptIn pin) { |
rulla | 2:90b79650f69d | 421 | while(pin); |
rulla | 2:90b79650f69d | 422 | while(!pin); |
rulla | 2:90b79650f69d | 423 | while(pin){ |
rulla | 2:90b79650f69d | 424 | } |
rulla | 2:90b79650f69d | 425 | } |
rulla | 2:90b79650f69d | 426 | |
rulla | 2:90b79650f69d | 427 | void OV7670::wait_negedge(InterruptIn pin) { |
rulla | 2:90b79650f69d | 428 | while(!pin); |
rulla | 2:90b79650f69d | 429 | while(pin) ; |
rulla | 2:90b79650f69d | 430 | } |
rulla | 2:90b79650f69d | 431 | |
rulla | 2:90b79650f69d | 432 | uint8_t OV7670::ReadOneByte(void) { |
rulla | 2:90b79650f69d | 433 | int data= dataP.read(); |
rulla | 2:90b79650f69d | 434 | uint8_t result=(uint8_t)(((data&0x3E)>>1)|((data&0xE000)>>8)); |
rulla | 2:90b79650f69d | 435 | return result ; |
rulla | 2:90b79650f69d | 436 | } |
rulla | 2:90b79650f69d | 437 | |
rulla | 2:90b79650f69d | 438 | // void OV7670::shot(int sizeX, int sizeY, uint8_t *bank0) { |
rulla | 2:90b79650f69d | 439 | void OV7670::shot(int sizeX, int sizeY,uint8_t *bank0) { |
rulla | 2:90b79650f69d | 440 | |
rulla | 2:90b79650f69d | 441 | //uint8_t bank0[76800]; |
rulla | 2:90b79650f69d | 442 | |
rulla | 2:90b79650f69d | 443 | uint8_t b1,b2; |
rulla | 2:90b79650f69d | 444 | int x = 0,pix=0; // col |
rulla | 2:90b79650f69d | 445 | int y = 0,line=0; // row |
rulla | 2:90b79650f69d | 446 | int n = 0; // px number |
rulla | 2:90b79650f69d | 447 | uint8_t r,g,b; |
rulla | 2:90b79650f69d | 448 | int colour; |
rulla | 2:90b79650f69d | 449 | int i=0,j; |
rulla | 2:90b79650f69d | 450 | int test=sync.read(); |
rulla | 2:90b79650f69d | 451 | |
rulla | 2:90b79650f69d | 452 | uint8_t vsync=(test&0x80)>>7; |
rulla | 2:90b79650f69d | 453 | uint8_t href=(test&0x40)>>6; |
rulla | 2:90b79650f69d | 454 | uint8_t pclk=(test&0x20)>>5; |
rulla | 2:90b79650f69d | 455 | //printf("sync= %d, v,h,p = %d , %d, %d sizeX= %d\n",test, vsync,href,pclk,sizeX); |
rulla | 2:90b79650f69d | 456 | |
rulla | 2:90b79650f69d | 457 | // printf("FrameStart\n"); |
rulla | 2:90b79650f69d | 458 | |
rulla | 2:90b79650f69d | 459 | while(vsync==0){ |
rulla | 2:90b79650f69d | 460 | test=sync.read(); |
rulla | 2:90b79650f69d | 461 | vsync=(test&0x80)>>7; |
rulla | 2:90b79650f69d | 462 | } |
rulla | 2:90b79650f69d | 463 | while(vsync==1){ |
rulla | 2:90b79650f69d | 464 | test=sync.read(); |
rulla | 2:90b79650f69d | 465 | vsync=(test&0x80)>>7; |
rulla | 2:90b79650f69d | 466 | } |
rulla | 2:90b79650f69d | 467 | |
rulla | 2:90b79650f69d | 468 | n=0; |
rulla | 2:90b79650f69d | 469 | |
rulla | 2:90b79650f69d | 470 | for ( y=0; y<sizeY; y++){ |
rulla | 2:90b79650f69d | 471 | x=0; |
rulla | 2:90b79650f69d | 472 | |
rulla | 2:90b79650f69d | 473 | while (href==0){ |
rulla | 2:90b79650f69d | 474 | test=sync.read(); |
rulla | 2:90b79650f69d | 475 | href=(test&0x40)>>6; |
rulla | 2:90b79650f69d | 476 | } |
rulla | 2:90b79650f69d | 477 | |
rulla | 2:90b79650f69d | 478 | for ( x=0; x<sizeX; x++){ |
rulla | 2:90b79650f69d | 479 | |
rulla | 2:90b79650f69d | 480 | while (pclk==0){ |
rulla | 2:90b79650f69d | 481 | test=sync.read(); |
rulla | 2:90b79650f69d | 482 | pclk=(test&0x20)>>5; |
rulla | 2:90b79650f69d | 483 | } |
rulla | 2:90b79650f69d | 484 | |
rulla | 2:90b79650f69d | 485 | b1=ReadOneByte(); |
rulla | 2:90b79650f69d | 486 | |
rulla | 2:90b79650f69d | 487 | while(pclk==1){ |
rulla | 2:90b79650f69d | 488 | test=sync.read(); |
rulla | 2:90b79650f69d | 489 | pclk=(test&0x20)>>5; |
rulla | 2:90b79650f69d | 490 | } |
rulla | 2:90b79650f69d | 491 | |
rulla | 2:90b79650f69d | 492 | |
rulla | 2:90b79650f69d | 493 | while(pclk==0){ |
rulla | 2:90b79650f69d | 494 | test=sync.read(); |
rulla | 2:90b79650f69d | 495 | pclk=(test&0x20)>>5; |
rulla | 2:90b79650f69d | 496 | } |
rulla | 2:90b79650f69d | 497 | |
rulla | 2:90b79650f69d | 498 | b2=ReadOneByte(); |
rulla | 2:90b79650f69d | 499 | |
rulla | 2:90b79650f69d | 500 | while (pclk==1){ |
rulla | 2:90b79650f69d | 501 | test=sync.read(); |
rulla | 2:90b79650f69d | 502 | pclk=(test&0x20)>>5; |
rulla | 2:90b79650f69d | 503 | } |
rulla | 2:90b79650f69d | 504 | |
rulla | 2:90b79650f69d | 505 | r=((b1>>3) & 0x1f) ; |
rulla | 2:90b79650f69d | 506 | g= ((((b1&0x07)<<3) &0x3f) | ((b2&0xe0) >>5))<<2; |
rulla | 2:90b79650f69d | 507 | b=(b2 & 0xf8) >>3; |
rulla | 2:90b79650f69d | 508 | //colour=(((int)b1)<<8)|((int)b2); |
rulla | 2:90b79650f69d | 509 | // printf("%u ",r); //ACTION!!! |
rulla | 2:90b79650f69d | 510 | // printf("%u_u ",b1,b2); //ACTION!!! |
rulla | 2:90b79650f69d | 511 | bank0[n] =b; |
rulla | 2:90b79650f69d | 512 | n++; |
rulla | 2:90b79650f69d | 513 | // x++; |
rulla | 2:90b79650f69d | 514 | } |
rulla | 2:90b79650f69d | 515 | |
rulla | 2:90b79650f69d | 516 | // } |
rulla | 2:90b79650f69d | 517 | // y++; |
rulla | 2:90b79650f69d | 518 | // printf("\n"); |
rulla | 2:90b79650f69d | 519 | /* |
rulla | 2:90b79650f69d | 520 | if (href==1){ |
rulla | 2:90b79650f69d | 521 | while (href==1){ |
rulla | 2:90b79650f69d | 522 | test=sync.read(); |
rulla | 2:90b79650f69d | 523 | href=(test&0x40)>>6; |
rulla | 2:90b79650f69d | 524 | } |
rulla | 2:90b79650f69d | 525 | }*/ |
rulla | 2:90b79650f69d | 526 | test=sync.read(); |
rulla | 2:90b79650f69d | 527 | href=(test&0x40)>>6; |
rulla | 2:90b79650f69d | 528 | } |
rulla | 2:90b79650f69d | 529 | |
rulla | 2:90b79650f69d | 530 | // printf("FrameEnd\n"); |
rulla | 2:90b79650f69d | 531 | //printf(" PIXELS= %d",n); |
rulla | 2:90b79650f69d | 532 | |
rulla | 2:90b79650f69d | 533 | i=0; |
rulla | 2:90b79650f69d | 534 | int c=0; |
rulla | 2:90b79650f69d | 535 | |
rulla | 2:90b79650f69d | 536 | /* for(j=0;j<sizeY;j++){ |
rulla | 2:90b79650f69d | 537 | for(i=0;i<sizeX;i++) { |
rulla | 2:90b79650f69d | 538 | printf("%u ",bank0[c]); |
rulla | 2:90b79650f69d | 539 | // wait_us(100); |
rulla | 2:90b79650f69d | 540 | c++; |
rulla | 2:90b79650f69d | 541 | } |
rulla | 2:90b79650f69d | 542 | printf("\n"); |
rulla | 2:90b79650f69d | 543 | } |
rulla | 2:90b79650f69d | 544 | printf("FrameEnd\n"); |
rulla | 2:90b79650f69d | 545 | */ |
rulla | 2:90b79650f69d | 546 | |
rulla | 2:90b79650f69d | 547 | }// SHOT |