Created
May 3, 2012 14:14
Revisions
-
freespace created this gist
May 3, 2012 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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); }