-
-
Save Near32/225cdca19ad55c6d8306 to your computer and use it in GitHub Desktop.
| #define SIO_C 2 | |
| #define SIO_D 4 | |
| #define SIO_CLKDELAY 100 | |
| void setup (void) | |
| { | |
| Serial.begin(9600); | |
| if(InitOV7670()) | |
| Serial.println("Init OV7670 : OK"); | |
| else | |
| Serial.println("Init OV7670 : NG...."); | |
| } | |
| void loop( void) | |
| { | |
| Serial.println("Writing test :"); | |
| byte data = 0x84; | |
| Serial.println(data); | |
| if(WriteOV7670(0x12, data)) | |
| Serial.println("Writing : OK"); | |
| else | |
| Serial.println("Writing : NG..."); | |
| /*--------------------------*/ | |
| Serial.println("\n Reading test :"); | |
| char rdata = 0x20; | |
| char ip = 0x43; | |
| if(ReadOV7670(0x0A, &rdata, ip)) | |
| { | |
| Serial.println("Reading : OK "); | |
| } | |
| else | |
| Serial.println("Reading : NG..."); | |
| Serial.println(rdata, HEX); | |
| if(rdata == 0x76) | |
| Serial.println("youpi"); | |
| /*-----------------------------*/ | |
| int temp = 3600; | |
| delay(temp*1000); | |
| } | |
| void InitSCCB(void) | |
| { | |
| pinMode(SIO_C, OUTPUT); | |
| pinMode(SIO_D, OUTPUT); | |
| digitalWrite(SIO_C, HIGH); | |
| digitalWrite(SIO_D, HIGH); | |
| Serial.println("InitSCCB - Port Direction and set high."); | |
| } | |
| void StartSCCB(void) | |
| { | |
| Serial.println("Starting SCCB..."); | |
| /*put HIGH in order to avoid propagating unknown bus state.*/ | |
| digitalWrite(SIO_D, HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_D, LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, LOW); | |
| Serial.println("Starting SCCB : done."); | |
| } | |
| void StopSCCB(void) | |
| { | |
| Serial.println("Stoping SCCB..."); | |
| digitalWrite(SIO_D,LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C,HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_D,HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| Serial.println("Stoping SCCB : done."); | |
| } | |
| char WriteSCCB( byte m_data) | |
| { | |
| unsigned char j, tem; | |
| for(j=0;j<8;j++) | |
| { | |
| /*write the MSB not written yet :*/ | |
| if((m_data<<j)&0x80) | |
| { | |
| digitalWrite(SIO_D, HIGH); | |
| } | |
| else | |
| { | |
| digitalWrite(SIO_D, LOW); | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| } | |
| /*eight bits have been send, let's deal with the ninth Don't-care one*/ | |
| /*we put the SIO_D pin at low in order to avoid propagating any unknown state.*/ | |
| /*why input ? because it enables a high impedance, I suppose...?*/ | |
| pinMode(SIO_D, INPUT); | |
| digitalWrite(SIO_D, LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*there is something to read to check the transmission :*/ | |
| if(digitalRead(SIO_D)==HIGH) | |
| { | |
| Serial.println("SCCB Write NG"); | |
| tem = 0; | |
| } | |
| else | |
| { | |
| tem = 1; | |
| Serial.println("SCCB Write : OK."); | |
| } | |
| digitalWrite(SIO_C, LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*let's clean that up :*/ | |
| pinMode(SIO_D, OUTPUT); | |
| return tem; | |
| } | |
| char ReadSCCB( char* m_data) | |
| { | |
| unsigned char j, tem = 1; | |
| /*we have to return tem but there is no way to assert that something/nothing happend apparently ?...*/ | |
| /*Let's make things readable :*/ | |
| //pinMode(SIO_D, INPUT); | |
| digitalWrite(SIO_D, LOW); | |
| /*Hi-Z*//*TEST*/ | |
| for(j=0;j<8;j++) | |
| { | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, HIGH); | |
| /*let's read in the middle of the SIO_C cycle :*/ | |
| /*read the MSB not read yet :*/ | |
| if(digitalRead(SIO_D) != LOW) | |
| { | |
| *m_data = 0x01 | (*m_data << 1); | |
| } | |
| else | |
| { | |
| *m_data = 0xFE & (*m_data << 1) ; | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| } | |
| /*eight bits have been read, let's deal with the ninth Don't-care one*/ | |
| /*the master is responsible for driver SIO_D at logical 1 during the NA bit.*/ | |
| pinMode(SIO_D, OUTPUT); | |
| digitalWrite(SIO_D, HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| digitalWrite(SIO_C, HIGH); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*there is something/nothing to read to check the transmission ???*/ | |
| digitalWrite(SIO_C, LOW); | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*let's clean that up : reset as usual as if we had written...*/ | |
| pinMode(SIO_D, OUTPUT); | |
| digitalWrite(SIO_D, LOW); | |
| return tem; | |
| } | |
| int WriteOV7670(char regID, char regData) | |
| { | |
| StartSCCB(); | |
| /*let's indicate that we want to write :*/ | |
| if(WriteSCCB(0x42) == 0) | |
| { | |
| Serial.println("Problem : 3phase Write Error 0x42 phase 1."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*phase 2 : sub address*/ | |
| if(WriteSCCB(regID) == 0) | |
| { | |
| Serial.println("Problem : 3phase Write Error phase 2."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*phase 3 : data writing*/ | |
| if(WriteSCCB(regData) == 0) | |
| { | |
| Serial.println("Problem : 3phase Write Error phase 3."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| /*exiting*/ | |
| StopSCCB(); | |
| return(1); | |
| } | |
| int ReadOV7670(char regID, char* regData, char ip) | |
| { | |
| StartSCCB(); | |
| /*2-phase write transmission cycle */ | |
| /*---------------------------------*/ | |
| /*let's indicate that we want to write :*/ | |
| if(WriteSCCB(0x42) == 0) | |
| { | |
| Serial.println("Problem : 2phase Write Error 0x42 phase 1-1."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*phase 2 : sub-address*/ | |
| if(WriteSCCB(regID) == 0) | |
| { | |
| Serial.println("Problem : 2phase Write Error phase 1-2."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*---------------------------------*/ | |
| /*2-phase read transmission cycle*/ | |
| /*phase 1 : ID address*/ | |
| if(WriteSCCB(ip) == 0)/*test 0x21 instead of 0x43*/ | |
| { | |
| Serial.println("Problem : 2phase Read Error phase 2-1."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| delayMicroseconds(SIO_CLKDELAY); | |
| /*phase 2 : data reading*/ | |
| if(ReadSCCB(regData) == 0) | |
| { | |
| Serial.println("Problem : 2phase Read Error phase 2-2."); | |
| StopSCCB(); | |
| return(0); | |
| } | |
| /*exiting*/ | |
| StopSCCB(); | |
| return(1); | |
| } | |
| int InitOV7670(void) | |
| { | |
| char temp; | |
| int i = 0; | |
| InitSCCB(); | |
| temp = 0x80; | |
| /*let's reset the SCCB ! */ | |
| if( WriteOV7670( 0x12, temp) == 0) | |
| { | |
| Serial.println("Problem : Resetting SCCB NG."); | |
| return(0); | |
| } | |
| /*-------------*/ | |
| /*settings : */ | |
| /*-------------*/ | |
| return(0x01); | |
| } |
I ov7670 used without a library?
Can you please share Uno-Ov7670 circuit diagram?
I tried, based on another post and it throws me following output
InitSCCB - Port Direction and set high.
Starting SCCB...
Starting SCCB : done.
SCCB Write : OK.
SCCB Write : OK.
SCCB Write : OK.
Stoping SCCB...
Stoping SCCB : done.
Init OV7670 : OK
Writing test :
132
Starting SCCB...
Starting SCCB : done.
SCCB Write : OK.
SCCB Write : OK.
SCCB Write : OK.
Stoping SCCB...
Stoping SCCB : done.
Writing : OK
Reading test :
Starting SCCB...
Starting SCCB : done.
SCCB Write : OK.
SCCB Write : OK.
SCCB Write NG
Problem : 2phase Read Error phase 2-1.
Stoping SCCB...
Stoping SCCB : done.
Reading : NG...
20
What does it mean by 2phase Read Error phase 2-1?
Also, in this code you are testing camera setup. Have you tried reading image from camera and streaming bytes to user over serial?
I need scematic master !
In order to solve the "Problem: 2phase Read Error phase 2-1" you need to drive a clock signal to the XCLK of the camera module. I did it by fusing the CKOUT of my AVR.
hello
don't forget to uncomment line 181 to get good results
good luck
Hi I'm having a lot of difficulty getting the ov7670 working I've got to Problem : 2phase Read Error phase 2-1. How do I set the xclck fuse and how do I output the image please help
hello all, can you help me on OV7670 camera interface with Arduino?
can anyone provide connection diagram??

hello,
I would use your code because i find it good, but i have a electronical problem..
Please can you give me a diagram of the electrical system required
thank.
Ne0ratek