Sebastian Barrera / Mbed OS Testproject
Committer:
sebbarpar
Date:
Fri Apr 03 15:12:32 2020 +0000
Revision:
1:014b5716c47f
Parent:
0:d69a19a5c0ff
First test to get an image;

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