Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Backup of some arduino code to handle OV7670
#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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment