sssssss

Dependencies:   mbed

Committer:
backman
Date:
Wed Jul 09 07:42:47 2014 +0000
Revision:
0:61a9b89ce451
wang

Who changed what in which revision?

UserRevisionLine numberNew contents of line
backman 0:61a9b89ce451 1 #include "mbed.h"
backman 0:61a9b89ce451 2 #include "ov7670reg.h"
backman 0:61a9b89ce451 3
backman 0:61a9b89ce451 4 #define OV7670_WRITE (0x42)
backman 0:61a9b89ce451 5 #define OV7670_READ (0x43)
backman 0:61a9b89ce451 6 #define OV7670_WRITEWAIT (20)
backman 0:61a9b89ce451 7 #define OV7670_NOACK (0)
backman 0:61a9b89ce451 8 #define OV7670_REGMAX (201)
backman 0:61a9b89ce451 9 #define OV7670_I2CFREQ (50000)
backman 0:61a9b89ce451 10
backman 0:61a9b89ce451 11 //
backman 0:61a9b89ce451 12 // OV7670 + FIFO AL422B camera board test
backman 0:61a9b89ce451 13 //
backman 0:61a9b89ce451 14 class OV7670
backman 0:61a9b89ce451 15 {
backman 0:61a9b89ce451 16 public:
backman 0:61a9b89ce451 17 I2C camera ;
backman 0:61a9b89ce451 18 InterruptIn vsync,href;
backman 0:61a9b89ce451 19 DigitalOut wen ;
backman 0:61a9b89ce451 20 BusIn data ;
backman 0:61a9b89ce451 21 DigitalOut rrst,oe,rclk ;
backman 0:61a9b89ce451 22 volatile int LineCounter ;
backman 0:61a9b89ce451 23 volatile int LastLines ;
backman 0:61a9b89ce451 24 volatile bool CaptureReq ;
backman 0:61a9b89ce451 25 volatile bool Busy ;
backman 0:61a9b89ce451 26 volatile bool Done ;
backman 0:61a9b89ce451 27
backman 0:61a9b89ce451 28 OV7670(
backman 0:61a9b89ce451 29 PinName sda,// Camera I2C port
backman 0:61a9b89ce451 30 PinName scl,// Camera I2C port
backman 0:61a9b89ce451 31 PinName vs, // VSYNC
backman 0:61a9b89ce451 32 PinName hr, // HREF
backman 0:61a9b89ce451 33 PinName we, // WEN
backman 0:61a9b89ce451 34 PinName d7, // D7
backman 0:61a9b89ce451 35 PinName d6, // D6
backman 0:61a9b89ce451 36 PinName d5, // D5
backman 0:61a9b89ce451 37 PinName d4, // D4
backman 0:61a9b89ce451 38 PinName d3, // D3
backman 0:61a9b89ce451 39 PinName d2, // D2
backman 0:61a9b89ce451 40 PinName d1, // D1
backman 0:61a9b89ce451 41 PinName d0, // D0
backman 0:61a9b89ce451 42 PinName rt, // /RRST
backman 0:61a9b89ce451 43 PinName o, // /OE
backman 0:61a9b89ce451 44 PinName rc // RCLK
backman 0:61a9b89ce451 45 ) : camera(sda,scl),vsync(vs),href(hr),wen(we),data(d0,d1,d2,d3,d4,d5,d6,d7),rrst(rt),oe(o),rclk(rc)
backman 0:61a9b89ce451 46 {
backman 0:61a9b89ce451 47 camera.stop() ;
backman 0:61a9b89ce451 48 camera.frequency(OV7670_I2CFREQ) ;
backman 0:61a9b89ce451 49 vsync.fall(this,&OV7670::VsyncHandler) ;
backman 0:61a9b89ce451 50 href.rise(this,&OV7670::HrefHandler) ;
backman 0:61a9b89ce451 51 CaptureReq = false ;
backman 0:61a9b89ce451 52 Busy = false ;
backman 0:61a9b89ce451 53 Done = false ;
backman 0:61a9b89ce451 54 LineCounter = 0 ;
backman 0:61a9b89ce451 55 rrst = 1 ;
backman 0:61a9b89ce451 56 oe = 1 ;
backman 0:61a9b89ce451 57 rclk = 1 ;
backman 0:61a9b89ce451 58 wen = 0 ;
backman 0:61a9b89ce451 59 }
backman 0:61a9b89ce451 60
backman 0:61a9b89ce451 61 // capture request
backman 0:61a9b89ce451 62 void CaptureNext(void)
backman 0:61a9b89ce451 63 {
backman 0:61a9b89ce451 64 CaptureReq = true ;
backman 0:61a9b89ce451 65 Busy = true ;
backman 0:61a9b89ce451 66 }
backman 0:61a9b89ce451 67
backman 0:61a9b89ce451 68 // capture done? (with clear)
backman 0:61a9b89ce451 69 bool CaptureDone(void)
backman 0:61a9b89ce451 70 {
backman 0:61a9b89ce451 71 bool result ;
backman 0:61a9b89ce451 72 if (Busy) {
backman 0:61a9b89ce451 73 result = false ;
backman 0:61a9b89ce451 74 } else {
backman 0:61a9b89ce451 75 result = Done ;
backman 0:61a9b89ce451 76 Done = false ;
backman 0:61a9b89ce451 77 }
backman 0:61a9b89ce451 78 return result ;
backman 0:61a9b89ce451 79 }
backman 0:61a9b89ce451 80
backman 0:61a9b89ce451 81 // write to camera
backman 0:61a9b89ce451 82 void WriteReg(int addr,int data)
backman 0:61a9b89ce451 83 {
backman 0:61a9b89ce451 84 // WRITE 0x42,ADDR,DATA
backman 0:61a9b89ce451 85 camera.start() ;
backman 0:61a9b89ce451 86 camera.write(OV7670_WRITE) ;
backman 0:61a9b89ce451 87 wait_us(OV7670_WRITEWAIT);
backman 0:61a9b89ce451 88 camera.write(addr) ;
backman 0:61a9b89ce451 89 wait_us(OV7670_WRITEWAIT);
backman 0:61a9b89ce451 90 camera.write(data) ;
backman 0:61a9b89ce451 91 camera.stop() ;
backman 0:61a9b89ce451 92 }
backman 0:61a9b89ce451 93
backman 0:61a9b89ce451 94 // read from camera
backman 0:61a9b89ce451 95 int ReadReg(int addr)
backman 0:61a9b89ce451 96 {
backman 0:61a9b89ce451 97 int data ;
backman 0:61a9b89ce451 98
backman 0:61a9b89ce451 99 // WRITE 0x42,ADDR
backman 0:61a9b89ce451 100 camera.start() ;
backman 0:61a9b89ce451 101 camera.write(OV7670_WRITE) ;
backman 0:61a9b89ce451 102 wait_us(OV7670_WRITEWAIT);
backman 0:61a9b89ce451 103 camera.write(addr) ;
backman 0:61a9b89ce451 104 camera.stop() ;
backman 0:61a9b89ce451 105 wait_us(OV7670_WRITEWAIT);
backman 0:61a9b89ce451 106
backman 0:61a9b89ce451 107 // WRITE 0x43,READ
backman 0:61a9b89ce451 108 camera.start() ;
backman 0:61a9b89ce451 109 camera.write(OV7670_READ) ;
backman 0:61a9b89ce451 110 wait_us(OV7670_WRITEWAIT);
backman 0:61a9b89ce451 111 data = camera.read(OV7670_NOACK) ;
backman 0:61a9b89ce451 112 camera.stop() ;
backman 0:61a9b89ce451 113
backman 0:61a9b89ce451 114 return data ;
backman 0:61a9b89ce451 115 }
backman 0:61a9b89ce451 116
backman 0:61a9b89ce451 117 void Reset(void) {
backman 0:61a9b89ce451 118 WriteReg(0x12,0x80) ; // RESET CAMERA
backman 0:61a9b89ce451 119 wait_ms(200) ;
backman 0:61a9b89ce451 120 }
backman 0:61a9b89ce451 121
backman 0:61a9b89ce451 122 void InitQQVGA() {
backman 0:61a9b89ce451 123 // QQVGA RGB444
backman 0:61a9b89ce451 124 WriteReg(REG_CLKRC,0x80);
backman 0:61a9b89ce451 125 WriteReg(REG_COM11,0x0A) ;
backman 0:61a9b89ce451 126 WriteReg(REG_TSLB,0x04);
backman 0:61a9b89ce451 127 WriteReg(REG_COM7,0x04) ;
backman 0:61a9b89ce451 128 WriteReg(REG_RGB444, 0x02);
backman 0:61a9b89ce451 129 WriteReg(REG_COM15, 0xd0);
backman 0:61a9b89ce451 130 WriteReg(REG_HSTART,0x16) ;
backman 0:61a9b89ce451 131 WriteReg(REG_HSTOP,0x04) ;
backman 0:61a9b89ce451 132 WriteReg(REG_HREF,0x24) ;
backman 0:61a9b89ce451 133 WriteReg(REG_VSTART,0x02) ;
backman 0:61a9b89ce451 134 WriteReg(REG_VSTOP,0x7a) ;
backman 0:61a9b89ce451 135 WriteReg(REG_VREF,0x0a) ;
backman 0:61a9b89ce451 136 WriteReg(REG_COM10,0x02) ;
backman 0:61a9b89ce451 137 WriteReg(REG_COM3, 0x04);
backman 0:61a9b89ce451 138 WriteReg(REG_COM14, 0x1a);
backman 0:61a9b89ce451 139 WriteReg(0x72, 0x22);
backman 0:61a9b89ce451 140 WriteReg(0x73, 0xf2);
backman 0:61a9b89ce451 141
backman 0:61a9b89ce451 142 // COLOR SETTING
backman 0:61a9b89ce451 143 WriteReg(0x4f,0x80);
backman 0:61a9b89ce451 144 WriteReg(0x50,0x80);
backman 0:61a9b89ce451 145 WriteReg(0x51,0x00);
backman 0:61a9b89ce451 146 WriteReg(0x52,0x22);
backman 0:61a9b89ce451 147 WriteReg(0x53,0x5e);
backman 0:61a9b89ce451 148 WriteReg(0x54,0x80);
backman 0:61a9b89ce451 149 WriteReg(0x56,0x40);
backman 0:61a9b89ce451 150 WriteReg(0x58,0x9e);
backman 0:61a9b89ce451 151 WriteReg(0x59,0x88);
backman 0:61a9b89ce451 152 WriteReg(0x5a,0x88);
backman 0:61a9b89ce451 153 WriteReg(0x5b,0x44);
backman 0:61a9b89ce451 154 WriteReg(0x5c,0x67);
backman 0:61a9b89ce451 155 WriteReg(0x5d,0x49);
backman 0:61a9b89ce451 156 WriteReg(0x5e,0x0e);
backman 0:61a9b89ce451 157 WriteReg(0x69,0x00);
backman 0:61a9b89ce451 158 WriteReg(0x6a,0x40);
backman 0:61a9b89ce451 159 WriteReg(0x6b,0x0a);
backman 0:61a9b89ce451 160 WriteReg(0x6c,0x0a);
backman 0:61a9b89ce451 161 WriteReg(0x6d,0x55);
backman 0:61a9b89ce451 162 WriteReg(0x6e,0x11);
backman 0:61a9b89ce451 163 WriteReg(0x6f,0x9f);
backman 0:61a9b89ce451 164
backman 0:61a9b89ce451 165 WriteReg(0xb0,0x84);
backman 0:61a9b89ce451 166
backman 0:61a9b89ce451 167 //BX
backman 0:61a9b89ce451 168 WriteReg(0x70,0x80);
backman 0:61a9b89ce451 169 WriteReg(0x71,0x00);
backman 0:61a9b89ce451 170 }
backman 0:61a9b89ce451 171
backman 0:61a9b89ce451 172
backman 0:61a9b89ce451 173
backman 0:61a9b89ce451 174 // vsync handler
backman 0:61a9b89ce451 175 void VsyncHandler(void)
backman 0:61a9b89ce451 176 {
backman 0:61a9b89ce451 177 // Capture Enable
backman 0:61a9b89ce451 178 if (CaptureReq) {
backman 0:61a9b89ce451 179 wen = 1 ;
backman 0:61a9b89ce451 180 Done = false ;
backman 0:61a9b89ce451 181 CaptureReq = false ;
backman 0:61a9b89ce451 182 } else {
backman 0:61a9b89ce451 183 wen = 0 ;
backman 0:61a9b89ce451 184 if (Busy) {
backman 0:61a9b89ce451 185 Busy = false ;
backman 0:61a9b89ce451 186 Done = true ;
backman 0:61a9b89ce451 187 }
backman 0:61a9b89ce451 188 }
backman 0:61a9b89ce451 189
backman 0:61a9b89ce451 190 // Hline Counter
backman 0:61a9b89ce451 191 LastLines = LineCounter ;
backman 0:61a9b89ce451 192 LineCounter = 0 ;
backman 0:61a9b89ce451 193 }
backman 0:61a9b89ce451 194
backman 0:61a9b89ce451 195 // href handler
backman 0:61a9b89ce451 196 void HrefHandler(void)
backman 0:61a9b89ce451 197 {
backman 0:61a9b89ce451 198 LineCounter++ ;
backman 0:61a9b89ce451 199 }
backman 0:61a9b89ce451 200
backman 0:61a9b89ce451 201 // Data Read
backman 0:61a9b89ce451 202 int ReadOneByte(void)
backman 0:61a9b89ce451 203 {
backman 0:61a9b89ce451 204 int result ;
backman 0:61a9b89ce451 205 rclk = 1 ;
backman 0:61a9b89ce451 206 // wait_us(1) ;
backman 0:61a9b89ce451 207 result = data ;
backman 0:61a9b89ce451 208 rclk = 0 ;
backman 0:61a9b89ce451 209 return result ;
backman 0:61a9b89ce451 210 }
backman 0:61a9b89ce451 211
backman 0:61a9b89ce451 212 // Data Start
backman 0:61a9b89ce451 213 void ReadStart(void)
backman 0:61a9b89ce451 214 {
backman 0:61a9b89ce451 215 rrst = 0 ;
backman 0:61a9b89ce451 216 oe = 0 ;
backman 0:61a9b89ce451 217 wait_us(1) ;
backman 0:61a9b89ce451 218 rclk = 0 ;
backman 0:61a9b89ce451 219 wait_us(1) ;
backman 0:61a9b89ce451 220 rclk = 1 ;
backman 0:61a9b89ce451 221 wait_us(1) ;
backman 0:61a9b89ce451 222 rrst = 1 ;
backman 0:61a9b89ce451 223 }
backman 0:61a9b89ce451 224
backman 0:61a9b89ce451 225 // Data Stop
backman 0:61a9b89ce451 226 void ReadStop(void)
backman 0:61a9b89ce451 227 {
backman 0:61a9b89ce451 228 oe = 1 ;
backman 0:61a9b89ce451 229 ReadOneByte() ;
backman 0:61a9b89ce451 230 rclk = 1 ;
backman 0:61a9b89ce451 231 }
backman 0:61a9b89ce451 232 };