OV7670 with FIFO AL422B (TORAGI Camera TYPE B) test program

Dependencies:   mbed

Committer:
mio
Date:
Tue Feb 14 13:25:25 2012 +0000
Revision:
0:d69a19a5c0ff
First Version

Who changed what in which revision?

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