c_cpp InitOV7670.cpp

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp InitOV7670.cpp相关的知识,希望对你有一定的参考价值。

#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);
}

以上是关于c_cpp InitOV7670.cpp的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 200.岛屿数量

c_cpp 127.单词阶梯

c_cpp MOFSET

c_cpp MOFSET

c_cpp 31.下一个排列

c_cpp string→char *