Skip to content

Instantly share code, notes, and snippets.

@freespace
Created May 3, 2012 14:14

Revisions

  1. freespace created this gist May 3, 2012.
    187 changes: 187 additions & 0 deletions gistfile1.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,187 @@
    #define SIO_C 2
    #define SIO_D 4
    #define SIO_CLOCK_DELAY 100

    void setup()
    {
    pinMode(8,OUTPUT);

    // while(1)
    // {
    // digitalWrite(8,HIGH);
    // delayMicroseconds(SIO_CLOCK_DELAY);
    // digitalWrite(8,LOW);
    // delayMicroseconds(SIO_CLOCK_DELAY);
    // }

    Serial.begin(9600);
    Serial.println("Start InitOV7670 test program");
    digitalWrite(8,HIGH);delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(8,LOW);delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(8,HIGH);delayMicroseconds(SIO_CLOCK_DELAY);

    if(InitOV7670())
    Serial.println("InitOV7670 OK");
    else
    Serial.println("InitOV7670 NG");


    }

    void loop()
    {
    }


    void InitSCCB(void) //SCCB初期化
    {
    pinMode(SIO_C,OUTPUT);
    pinMode(SIO_D,OUTPUT);
    digitalWrite(SIO_C,HIGH);
    digitalWrite(SIO_D,HIGH);
    Serial.println("InitSCCB - PortDirectionSet & Set High OK");
    }

    void StartSCCB(void) //SCCBスタート
    {
    Serial.println("StartSCCB");

    digitalWrite(SIO_D,HIGH);
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_C,HIGH);
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_D,LOW);
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_C,LOW);
    delayMicroseconds(SIO_CLOCK_DELAY);
    }

    void StopSCCB(void) //SCCBストップ
    {
    //Serial.println("StopSCCB");

    digitalWrite(SIO_D,LOW);
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_C,HIGH);
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_D,HIGH);
    delayMicroseconds(SIO_CLOCK_DELAY);
    }

    char SCCBWrite(byte m_data)
    {
    unsigned char j,tem;

    //Serial.print("SCCBWrite 0x");
    //Serial.println(m_data,HEX);

    //Serial.print("SCCBWrite");
    for(j=0;j<8;j++) //循环8次发送数据
    {
    if((m_data<<j)&0x80)
    {
    digitalWrite(SIO_D,HIGH);
    }
    else
    {
    digitalWrite(SIO_D,LOW);
    }
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_C,HIGH);
    delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(SIO_C,LOW);
    delayMicroseconds(SIO_CLOCK_DELAY);
    }

    //Serial.println("");
    //delayMicroseconds(SIO_CLOCK_DELAY);
    digitalWrite(8,LOW); //debug
    pinMode(SIO_D,INPUT); //SIO_Dのバスをスレーブ(OV7670)に渡す
    digitalWrite(SIO_D,LOW); //プルアップ防止
    delayMicroseconds(SIO_CLOCK_DELAY);

    digitalWrite(8,HIGH); //debug
    digitalWrite(SIO_C,HIGH);
    delayMicroseconds(SIO_CLOCK_DELAY);

    //Serial.println(" Write done");
    digitalWrite(8,LOW); //debug
    if(digitalRead(SIO_D)==HIGH)
    {
    //SIO_D=Hなら失敗
    tem=0;
    Serial.println("SCCBWrite NG");
    }
    else
    {
    //SIO_D=Lなら成功
    tem=1;
    //Serial.println("SCCBWrite OK");
    }
    digitalWrite(SIO_C,LOW);
    delayMicroseconds(SIO_CLOCK_DELAY);
    pinMode(SIO_D,OUTPUT); //SIO_Dのバスをマスター(Arduino)に戻す
    //delayMicroseconds(SIO_CLOCK_DELAY);
    //digitalWrite(SIO_D,LOW);
    //delayMicroseconds(SIO_CLOCK_DELAY);

    //pinMode(SIO_C,OUTPUT); //SIO_Cのバスをマスター(Arduino)に戻す

    return tem;
    }

    int InitOV7670(void)
    {
    char temp;
    int i=0;

    InitSCCB();

    temp=0x80;
    if(WriteOV7670(0x12, temp)==0) //Reset SCCB
    {
    Serial.println("Resetting SCCB NG");
    return 0 ;
    }
    //Serial.println("Resetting SCCB OK");
    //delayMicroseconds(10);

    // for(i=0;i<CHANGE_REG_NUM;i++)
    // {
    // if( 0==wrOV7670Reg(pgm_read_byte( &change_reg[i][0]),pgm_read_byte( &change_reg[i][1]) ))
    // {
    // return 0;
    // }
    // }

    return 0x01; //ok
    }

    ////////////////////////////
    //機能:OV7660レジスタに書き込む
    //返値:成功=1 失敗=0
    int WriteOV7670(char regID, char regDat)
    {
    StartSCCB();
    if(SCCBWrite(0x42)==0)
    {
    Serial.println(" Write Error 0x42");
    StopSCCB();
    return(0);
    }
    delayMicroseconds(SIO_CLOCK_DELAY);
    if(SCCBWrite(regID)==0)
    {
    StopSCCB();
    return(0);
    }
    delayMicroseconds(SIO_CLOCK_DELAY);
    if(SCCBWrite(regDat)==0)
    {
    StopSCCB();
    return(0);
    }
    StopSCCB();

    return(1);
    }