capstone_finish

Dependencies:   BufferedSerial motor_sn7544

ov7670.h

Committer:
kangmingyo
Date:
2019-08-13
Revision:
4:7b63cf3d205f
Parent:
3:2a3664dc6634
Child:
5:53dd2abce6b3

File content as of revision 4:7b63cf3d205f:

#include "mbed.h"
#include "ov7670reg.h"

#define OV7670_WRITE (0x42)
#define OV7670_READ  (0x43)
#define OV7670_WRITEWAIT (20)
#define OV7670_NOACK (0)
#define OV7670_REGMAX (201)
#define OV7670_I2CFREQ (40000)

//
// OV7670 + FIFO AL422B camera board test
//
class OV7670
{
public:
    I2C _i2c ;
    InterruptIn vsync,href;
    DigitalOut wen ;
    PortIn data ;
    DigitalOut rrst,oe,rclk ;
    volatile int LineCounter ;
    volatile int LastLines ;
    volatile bool CaptureReq ;
    volatile bool Busy ;
    volatile bool Done ;

    OV7670(
        PinName sda,// Camera I2C port
        PinName scl,// Camera I2C port
        PinName vs, // VSYNC
        PinName hr, // HREF
        PinName we, // WEN
        PortName port, // 8bit bus port
        int mask, // 0b0000_0M65_4000_0321_L000_0000_0000_0000 = 0x07878000
        PinName rt, // /RRST
        PinName o,  // /OE
        PinName rc  // RCLK
    ) : _i2c(sda,scl),vsync(vs),href(hr),wen(we),data(port,mask),rrst(rt),oe(o),rclk(rc)
    {
        _i2c.stop() ;
        _i2c.frequency(OV7670_I2CFREQ) ;
        vsync.fall(this,&OV7670::VsyncHandler) ;
        href.rise(this,&OV7670::HrefHandler) ;
        CaptureReq = false ;
        Busy = false ;
        Done = false ;
        LineCounter = 0 ;
        rrst = 1 ;
        oe = 1 ;
        rclk = 1 ;
        wen = 0 ;
    }

    // capture request
    void CaptureNext(void)
    {
        CaptureReq = true ;
        Busy = true ;
    }

    // capture done? (with clear)
    bool CaptureDone(void)
    {
        bool result ;
        if (Busy) {
            result = false ;
        } else {
            result = Done ;
            Done = false ;
        }
        return result ;
    }

    // write to camera
    void WriteReg(int addr,int data)
    {
     int status;
     char data_write[2];
    data_write[0]= addr;
    data_write[1]= data;
    status = _i2c.write(OV7670_WRITE,data_write,2,0);
    if(status!=0){
//        printf("I2C configuration error(adr: %x)!\r\n",addr);
        while(1){
        }
    }
    }

    // read from camera
    int ReadReg(int addr)
    {
       char data_write[2];
    char data_read[2];
    int data;
    int status;
   
    data_write[0]=addr;
    _i2c.write(OV7670_WRITE, data_write, 1, 0);
    status =_i2c.read(OV7670_READ, data_read, 1, 0);
    data = (int)data_read[0];
 //   printf("Data is %x\r\n",data);
//    printf("Status is %d\r\n",status);
        return data ;
    }

    void Reset(void)
    {
        WriteReg(0x12,0x80) ; // RESET CAMERA
        wait_ms(200) ;
    }

    void InitQQVGA565(bool flipv,bool fliph)
    {
        // QQVGA RGB565
        WriteReg(REG_CLKRC,0x80);
        WriteReg(REG_COM11,0x0A) ;          
        WriteReg(REG_TSLB,0x04);
        WriteReg(REG_COM7,0x04) ;
        WriteReg(REG_RGB444, 0x00);
        WriteReg(REG_COM15, 0xd0);
        WriteReg(REG_HSTART,0x16) ;
        WriteReg(REG_HSTOP,0x04) ;
        WriteReg(REG_HREF,0x24) ;
        WriteReg(REG_VSTART,0x02) ;
        WriteReg(REG_VSTOP,0x7a) ;
        WriteReg(REG_VREF,0x0a) ;
        WriteReg(REG_COM10,0x02) ;
        WriteReg(REG_COM3, 0x04);
        WriteReg(REG_COM14, 0x1a);
        WriteReg(REG_MVFP,0x07 | (flipv ? 0x10:0) | (fliph ? 0x20:0)) ;
        WriteReg(0x72, 0x22);
        WriteReg(0x73, 0xf2);

        // COLOR SETTING
        WriteReg(0x4f,0x80);
        WriteReg(0x50,0x80);
        WriteReg(0x51,0x00);
        WriteReg(0x52,0x22);
        WriteReg(0x53,0x5e);
        WriteReg(0x54,0x80);
        WriteReg(0x56,0x40);
        WriteReg(0x58,0x9e);
        WriteReg(0x59,0x88);
        WriteReg(0x5a,0x88);
        WriteReg(0x5b,0x44);
        WriteReg(0x5c,0x67);
        WriteReg(0x5d,0x49);
        WriteReg(0x5e,0x0e);
        WriteReg(0x69,0x00);
        WriteReg(0x6a,0x40);
        WriteReg(0x6b,0x0a);
        WriteReg(0x6c,0x0a);
        WriteReg(0x6d,0x55);
        WriteReg(0x6e,0x11);
        WriteReg(0x6f,0x9f);

        WriteReg(0xb0,0x84);
    }

    void InitQVGA565(bool flipv,bool fliph)
    {
        // QVGA RGB565
        WriteReg(REG_CLKRC,0x80);
        WriteReg(REG_COM11,0x0A) ;
        WriteReg(REG_TSLB,0x04);
        WriteReg(REG_COM7,0x04) ;
        WriteReg(REG_RGB444, 0x00);
        WriteReg(REG_COM15, 0xd0);
        WriteReg(REG_HSTART,0x16) ;
        WriteReg(REG_HSTOP,0x04) ;
        WriteReg(REG_HREF,0x80) ;
        WriteReg(REG_VSTART,0x02) ;
        WriteReg(REG_VSTOP,0x7a) ;
        WriteReg(REG_VREF,0x0a) ;
        WriteReg(REG_COM10,0x02) ;
        WriteReg(REG_COM3, 0x04);
        WriteReg(REG_COM14, 0x19);
        WriteReg(REG_MVFP,0x07 | (flipv ? 0x10:0) | (fliph ? 0x20:0)) ;
        WriteReg(0x72, 0x11);
        WriteReg(0x73, 0xf1);

        // COLOR SETTING
        WriteReg(0x4f,0x80);
        WriteReg(0x50,0x80);
        WriteReg(0x51,0x00);
        WriteReg(0x52,0x22);
        WriteReg(0x53,0x5e);
        WriteReg(0x54,0x80);
        WriteReg(0x56,0x40);
        WriteReg(0x58,0x9e);
        WriteReg(0x59,0x88);
        WriteReg(0x5a,0x88);
        WriteReg(0x5b,0x44);
        WriteReg(0x5c,0x67);
        WriteReg(0x5d,0x49);
        WriteReg(0x5e,0x0e);
        WriteReg(0x69,0x00);
        WriteReg(0x6a,0x40);
        WriteReg(0x6b,0x0a);
        WriteReg(0x6c,0x0a);
        WriteReg(0x6d,0x55);
        WriteReg(0x6e,0x11);
        WriteReg(0x6f,0x9f);

        WriteReg(0xb0,0x84);
    }
    void  InitQVGAYUV(bool flipv,bool fliph)
    { 
        if (ReadReg(REG_PID) != 0x76)           // check id camera
         {
            printf("ERROR\r\n");
        }else{

            printf("SUCCESS\r\n");
            }
        WriteReg(REG_COM7, 0x00);           // YUV
        WriteReg(REG_COM17, 0x00);          // color bar disable
        WriteReg(REG_COM3, 0x0C);
        WriteReg(0x12, 0x00);//COM7
        WriteReg(0x8C, 0x00);//RGB444
        WriteReg(0x04, 0x00);//COM1
        WriteReg(0x40, 0xC0);//COM15
        WriteReg(0x14, 0x1A);//COM9
        WriteReg(0x3D, 0x40);//COM13
        
        WriteReg(REG_COM15, 0xC0);
        WriteReg(REG_COM14, 0x1a);          // divide by 4
        WriteReg(0x72, 0x22);               // downsample by 4
        WriteReg(0x73, 0xf2);               // divide by 4
        WriteReg(REG_HREF, 0xa4);
        WriteReg(REG_HSTART, 0x16);
        WriteReg(REG_HSTOP, 0x04);
        WriteReg(REG_VREF, 0x0a);   
        WriteReg(REG_VSTART, 0x02);
        WriteReg(REG_VSTOP, 0x7a);        
             
        WriteReg(0x7a, 0x20);
        WriteReg(0x7b, 0x1c);
        WriteReg(0x7c, 0x28);
        WriteReg(0x7d, 0x3c);
        WriteReg(0x7e, 0x5a);
        WriteReg(0x7f, 0x68);
        WriteReg(0x80, 0x76);
        WriteReg(0x81, 0x80);
        WriteReg(0x82, 0x88);
        WriteReg(0x83, 0x8f);
        WriteReg(0x84, 0x96);
        WriteReg(0x85, 0xa3);
        WriteReg(0x86, 0xaf);
        WriteReg(0x87, 0xc4);
        WriteReg(0x88, 0xd7);
        WriteReg(0x89, 0xe8);
        
        WriteReg(0x13, 0xe0);
        WriteReg(0x00, 0x00);
        WriteReg(0x10, 0x00);
        WriteReg(0x0d, 0x40);
        WriteReg(0x14, 0x18);
        WriteReg(0xa5, 0x05);
        WriteReg(0xab, 0x07);
        WriteReg(0x24, 0x95);
        WriteReg(0x25, 0x33);
        WriteReg(0x26, 0xe3);
        WriteReg(0x9f, 0x78);
        WriteReg(0xa0, 0x68);
        WriteReg(0xa1, 0x03);
        WriteReg(0xa6, 0xd8);
        WriteReg(0xa7, 0xd8);
        WriteReg(0xa8, 0xf0);
        WriteReg(0xa9, 0x90);
        WriteReg(0xaa, 0x94);
        WriteReg(0x13, 0xe5);
        
        WriteReg(0x0e, 0x61);
        WriteReg(0x0f, 0x4b);
        WriteReg(0x16, 0x02);

        WriteReg(0x21, 0x02);
        WriteReg(0x22, 0x91);
        WriteReg(0x29, 0x07);
        WriteReg(0x33, 0x0b);
        WriteReg(0x35, 0x0b);
        WriteReg(0x37, 0x1d);
        WriteReg(0x38, 0x71);
        WriteReg(0x39, 0x2a);
        WriteReg(0x3c, 0x78);
        WriteReg(0x4d, 0x40);
        WriteReg(0x4e, 0x20);
        WriteReg(0x69, 0x00);

        WriteReg(0x74, 0x10);
        WriteReg(0x8d, 0x4f);
        WriteReg(0x8e, 0x00);
        WriteReg(0x8f, 0x00);
        WriteReg(0x90, 0x00);
        WriteReg(0x91, 0x00);
        WriteReg(0x92, 0x00);

        WriteReg(0x96, 0x00);
        WriteReg(0x9a, 0x80);
        WriteReg(0xb0, 0x84);
        WriteReg(0xb1, 0x0c);
        WriteReg(0xb2, 0x0e);
        WriteReg(0xb3, 0x82);
        WriteReg(0xb8, 0x0a);
        
        WriteReg(0x43, 0x0a);
        WriteReg(0x44, 0xf0);
        WriteReg(0x45, 0x34);
        WriteReg(0x46, 0x58);
        WriteReg(0x47, 0x28);
        WriteReg(0x48, 0x3a);
        WriteReg(0x59, 0x88);
        WriteReg(0x5a, 0x88);
        WriteReg(0x5b, 0x44);
        WriteReg(0x5c, 0x67);
        WriteReg(0x5d, 0x49);
        WriteReg(0x5e, 0x0e);
        WriteReg(0x64, 0x04);
        WriteReg(0x65, 0x20);
        WriteReg(0x66, 0x05);
        WriteReg(0x94, 0x04);
        WriteReg(0x95, 0x08);

        WriteReg(0x6c, 0x0a);
        WriteReg(0x6d, 0x55);
        WriteReg(0x6e, 0x11);
        WriteReg(0x6f, 0x9f);
        WriteReg(0x6a, 0x40);
        WriteReg(0x01, 0x40);
        WriteReg(0x02, 0x40);
        WriteReg(0x13, 0xe7);
        WriteReg(0x15, 0x02);

        WriteReg(0x4f, 0x80);
        WriteReg(0x50, 0x80);
        WriteReg(0x51, 0x00);
        WriteReg(0x52, 0x22);
        WriteReg(0x53, 0x5e);
        WriteReg(0x54, 0x80);
        WriteReg(0x58, 0x9e);
        
        WriteReg(0x41, 0x08);
        WriteReg(0x3f, 0x00);
        WriteReg(0x75, 0x05);
        WriteReg(0x76, 0xe1);
        WriteReg(0x4c, 0x00);
        WriteReg(0x77, 0x01);
        WriteReg(0x3d, 0xc1);
        WriteReg(0x4b, 0x09);
        WriteReg(0xc9, 0x60);
        WriteReg(0x41, 0x38);
        WriteReg(0x56, 0x40);
        
        WriteReg(0x34, 0x11);
        WriteReg(0x3b, 0x02);
        WriteReg(0xa4, 0x88);
        WriteReg(0x96, 0x00);
        WriteReg(0x97, 0x30);
        WriteReg(0x98, 0x20);
        WriteReg(0x99, 0x30);
        WriteReg(0x9a, 0x84);
        WriteReg(0x9b, 0x29);
        WriteReg(0x9c, 0x03);
        WriteReg(0x9d, 0x4c);
        WriteReg(0x9e, 0x3f);
        WriteReg(0x78, 0x04);
        
        WriteReg(0x79, 0x01);
        WriteReg(0xc8, 0xf0);
        WriteReg(0x79, 0x0f);
        WriteReg(0xc8, 0x00);
        WriteReg(0x79, 0x10);
        WriteReg(0xc8, 0x7e);
        WriteReg(0x79, 0x0a);
        WriteReg(0xc8, 0x80);
        WriteReg(0x79, 0x0b);
        WriteReg(0xc8, 0x01);
        WriteReg(0x79, 0x0c);
        WriteReg(0xc8, 0x0f);
        WriteReg(0x79, 0x0d);
        WriteReg(0xc8, 0x20);
        WriteReg(0x79, 0x09);
        WriteReg(0xc8, 0x80);
        WriteReg(0x79, 0x02);
        WriteReg(0xc8, 0xc0);
        WriteReg(0x79, 0x03);
        WriteReg(0xc8, 0x40);
        WriteReg(0x79, 0x05);
        WriteReg(0xc8, 0x30);
        WriteReg(0x79, 0x26);
        WriteReg(0x09, 0x03);
        WriteReg(0x3b, 0x42);
        
        WriteReg(0xff, 0xff);   /* END MARKER */    
    }


    // vsync handler
    void VsyncHandler(void)
    {
        // Capture Enable
        if (CaptureReq) {
            wen = 1 ;
            Done = false ;
            CaptureReq = false ;
        } else {
            wen = 0 ;
            if (Busy) {
                Busy = false ;
                Done = true ;
            }
        }

        // Hline Counter
        LastLines = LineCounter ;
        LineCounter = 0 ;
    }

    // href handler
    void HrefHandler(void)
    {
        LineCounter++ ;
    }

    // Data Read
    int ReadOneByte(void)
    {
        int result ;
        rclk = 1 ;
//        wait_us(1) ;
        result = data ;
        rclk = 0 ;
        return result ;
    }

    // Data Read (PortIn)
    int ReadOneWord(void)
    {
        //  int r,r1,r2,r3,r4 ;
//        rclk = 1 ;
//        r = data ;
//        rclk = 0 ;
//        r1 = r & 0x07800000 ;
//        r1 = r1 >> (26-7-0) ; // bit26 to bit7
//        r2 = r & 0x00078000 ;
//        r2 = r2 >> (18-3-0) ; // bit18 to bit3
//        rclk = 1 ;
//        r = data ;
//        rclk = 0 ;
//        r3 = r & 0x07800000 ;
//        r3 = r3 >> (26-7-8) ; // bit26 to bit7
//        r4 = r & 0x00078000 ;
//        r4 = r4 >> (18-3-8) ; // bit18 to bit3

        int r,r1,r2;
        rclk=1;
        r = data;
        rclk=0;
        r1 = r<<8;
        rclk=1;
        r= data;
        rclk=0;
        r2 = r;


        return r2+r1 ;
    }

    // Data Start
    void ReadStart(void)
    {
        rrst = 0 ;
        oe = 0 ;
        wait_us(1) ;
        rclk = 0 ;
        wait_us(1) ;
        rclk = 1 ;
        wait_us(1) ;
        rrst = 1 ;
    }

    // Data Stop
    void ReadStop(void)
    {
        oe = 1 ;
        ReadOneByte() ;
        rclk = 1 ;
    }
};