반응형

 

OV7670 카메라 모듈의 핀은 위와 같이 나타나 있다.

 

SCL과 SDA는 SCCB 통신을 위한 핀으로

SCL은 input Port, SCCB 인터페이스 제어 클럭을 입력받는 핀이고

SDA는 InOut Port로 통신을 위한 데이터를 전송하고 전송받는 핀이다.

 

 

MCLK는 시스템 클럭으로 Input Port이고 여기에 입력되는 클럭을 통해 이미지 데이터를

D0~D7로 출력하고 픽셀클럭(PCLK)를 출력하게 된다.

 

 

 

 

위 이미지는 OV7670 카메라 모듈의 Functional Block Diagram(FBD) 이다.  XCLK핀에 클럭 신호를 입력해주면

이를 기반으로 Video Timing Generator에서 VSYNC, HSYNC, PCLK 신호를 출력해준다.

 

 

그럼 우선 SBBC 통신을 통해 데이터를 받아오기 위한 설정부터 진행해보자.

일단 왜 SBBC 통신을 쓰는지, SBBC통신의 장점을 간단히 적자면

SBBC통신(I2C통신)은 시리얼통신과 다르게 동기화 통신방식을 사용하여 통신속도를 따로 정해주지 않아도 되고

클럭신호를 통해 데이터의 전송  타이밍을 맞추게 된다.

(그리고 많은 센서를 동시에 편하게 연결할 수 있다고 한다.)

 

 

위의 그림은 I2C 통신을 나타내는 그림으로 다음 두 그림을 참고하여 설명하겠다.

 

 

 

SDA신호와 SCL신호는 모두 풀업저항에 의해 초기에 HIGH상태를 유지한다.

 

그리고 SDA신호가 LOW로 떨어지게 되면 데이터 전송을 시작하게 되고 그 이후 클럭신호(SCL)에 맞춰

데이터 전송이 진행된다.

 

Device Address의 데이터 전송이 끝났으면 Read/Write 데이터를 전송하고 쓰기모드일 경우

데이터가 잘 전송되었는지는 Slave측의 ACK 신호를 통해 확인하게 된다. 

 

그리고 난 후 SCL이 LOW신호일 때 다음 데이터인 Register Address 데이터 전송을 위해 data값을 바꾸고 위의 내용들을 반복하여 진행하게 된다.

 

 

 

위의 그림에서 SDA신호가 0이 되면 통신 시작

-> 그 다음 SCL이 0이 되는 순간부터 데이터 전송

-> 8개 비트 데이터(7bit Address, 1bit R/W) 전송

-> ACK확인

-> 그 다음 데이터 전송

-> ...

 

을 진행하게 된다.

 

위는 PCF8574A 라는 장치의 Address에 A0앞에 R/W의 정보가 담기는 것을 확인할 수 있다.

 

즉 Address 안에 R/W 정보를 담고 있는 것이다.

 

 

OV7670.pdf
0.84MB

 

 

 

위 파일은 OV7670의 메뉴얼 파일이다.

 

 

메뉴얼을 보면 위와 같이 Register을 설정해주는 부분이 보이는데 이 부분에 대한 설정 값들을 SBBC 통신을 통해

진행하게 된다. 즉 위의 설정값을 통해 어떠한 데이터를 받아올 것인지 설정해주게 된다.

 

 

OV7670_config_rom.v
0.00MB

 

 

 

위 파일이 Register에 대한 값들을 설정해주기 위한 값들을 담고있다.

 

 

위의 addr값이 0 일때의 조건문을 보면

dout 값에 16'h1280 의 값을 넣어주는 것을 확인할 수 있다.

 

이는 Register의 12번 주소에 0x80 이라는 값으로 설정해주겠다는 의미이다.

 

SCCB.zip
0.01MB

 

 

위의 파일은 SCCB 통신을 위한 코드가 담긴 파일이다.

 

Camera_configure 모듈을 살펴보면 입력으로

CLK, start, RST가 존재하고 출력신호로 SIOC, SIOD, done 신호가 존재한다.

 

내부적으로는 config 모듈과 SCCB_Interface 모듈, ROM 모듈이 존재하며

이들과의 관계를 통해 결과적으로 SIOC, SIOD 출력을 내보내게 되고

이를 통해 카메라모듈과 통신을 진행하게 된다.

 

start신호는 임의로 만들어주었다.

 

ZedBoard에서 출력되는 신호는 100MHz의 클럭이 출력되므로

아래와 같이 clock_divider 이라는 모듈을 만들어 100MHz 신호를 1MHz로 바꿔주어 출력하고 이를 Configure 모듈로 입력하여 통신을 진행하도록 한다.

 

또한 start신호는

 

위와 같이 cnt가 200보다 작을때는 계속 증가시키고

200이 되는 순간 start를 1로, 201이 되면 다시 start를 0으로 하고 cnt가 증가하지 않도록 함으로서

순간적인 start신호를 만들어 주었다.

 

clock_divider.v
0.00MB

 

 

 

 

그리고 난 후 이를 minized 보드에 입히고

실행시키면 Camera Module에서 pixel clock과 함께 데이터 신호들이 나오고 있는 것을

오실로스코프를 통해 확인할 수 있다.

 

 

 

 

위의 D0신호는 카메라 모듈의 Vsync, D1은 HSync,

D2~D5는 Image Data를 의미한다.

 

확인해보면 조금 이상하긴 하지만 HSync가 멈추는 사이사이 Vsync가 1이 되면서 프레임완료 신호를 출력하는 것을

확인할 수 있다.

 

 

그리고 Href 가 High인 상태에서 각각의 데이터 신호들이 전달되는 것을 확인할 수 있다.

 

 

그럼 XCLK로 몇 Hz의 신호를 주어야 할까?

 

Hacking the OV7670 camera module (SCCB cheat sheet inside)

An in-depth look of the OV7670 camera module The OV7670 is a low cost image sensor + DSP that can operate at a maximum of 30 fps and 640...

embeddedprogrammer.blogspot.com

위의 블로그를 참고하면 30fps의 경우 24MHz의 클럭을 입력하여야 한다고 한다.

 

 

*******************************************************************

하지만 통신이 완료되면 done신호가 1이 되어 출력되어야 할 것 같은데 이는 아직 출력되지 않고 있다.

 

이를 확인해볼 필요가 있다.

 

반응형

+ Recent posts