CrazyBingo

Chapter 02: OV7670 SCCB初始化

0
阅读(8947)

Chapter 02: OV7670 SCCB初始化

wps_clip_image-18737

wps_clip_image-6122

1. 写在前面的话

时间是2012年7月12号,22:32,接下来写I2C初始化喽……

关于摄像头I2C初始化部分,是我摄像头驱动画的时间最长的,曾经相当的崩溃。。。不仅仅由于这一部分不太适合用FPGA来做,而且电路,时序等方面,真的好头疼。因为我没打算随随便便移植某公司开发板的虾米代码,看到那代码我就心情不好。

最终,还是自己写,其实也不难嘛。

2. 最需要注意的部分

这个,摄像头的SCLK,SDAT引脚必须上啦电阻,4.7K也可以,否则死啦死啦滴。我就在这上面拜拜浪费了3天时间。。。想死的心都有了。。。如下:

wps_clip_image-9744

很多人搞不懂I2C总线为什么要上啦电阻,包括我自己。其实这关系到I2C的内部结构,如下图所示,I2C内部采取了Open Drain,本身只能输出低电平,只能通过上拉电阻,结构如下图所示:

wps_clip_image-20958

具体的相关解说请看《I2C上啦电阻到底要多大》一文,此处不再累赘了,网址如下:

http://blog.chinaaet.com/detail/28567.html

3. I2C时序 写入设计

OvmniVision很搞笑,他管这个I2C叫做Serial Camera Control Bus (SCCB),其实所谓SCCB,其实写入的时序完全一样,只是读取有一丁点儿差别(MT9M111的I2C时序差别更大一点儿)。

一般I2C的初始化都有一定的协议。以下主要以0V的IC为例,写入寄存器如下所示,先写设备地址,在写寄存器地址,最后才输入寄存器的值,即 ID-Address + SUB-Address + W-Data!OV的设备地址为0x42,最后一位是用来判断读写的,即读的时候为0x43!

wps_clip_image-15393

从时序图可见,没法送8个数据,SDAT设置为输入,接受一个从机反馈的信号。如此循环D-Address + SUB-Address + W-Data,完事儿,代码设计如下,可见三个雷同的步骤:

wps_clip_image-8965

代码中清晰可见,诶发送8个数据,设置读取ACK,不解释了。但是当时由于上拉电阻的问题,无数次查时序,这部分我做了太多的工作,最后完美的实现任意的操作,主要在此分享几个过程中的图片了,以下是Modelsim数据写入的仿真(三态部分无法仿真的,那是读取):

wps_clip_image-28995

wps_clip_image-25078

最后,还是抱上了示波器,也告诫大家,跟硬件相关的时序,最好来个示波器或者逻辑分析仪,让开发变得更容易些。实际我用Modelsim 3天没弄出来(当然是因为上拉电阻),但是用示波器以下是搞定,请看图:

wps_clip_image-4355

4. I2C时序 读取设计

读取比写入稍微复杂那么一点点儿,因为在发送从机地址,指定寄存器地址之后,还需要再次发送从机地址(末位置1),才能读取制定寄存器的地址。在Verilog设计中,主要分成第一次指定寄存器,第二次读取寄存器值两个步骤。OV的时序如下:

wps_clip_image-1563

wps_clip_image-20231

wps_clip_image-11992

如上是关于NA的手册的阐述,最后非得发送一个NA位,让从机确认主机已经接收完毕,第二部分时序的代码如下所示,这部分代码不管是某公司,还是很多人都没实现(单片机实现的不算),当时由于不读到寄存器就不甘心,就折腾着写出来了,其实挺简单的嘛,整个I2C模块也就四五百行代码。。。哪能跟SDRAM比。。

wps_clip_image-1553

Modelsim的靓照如下所示,读取不能只能看到3态的,没有写I2C输入的testbench。

wps_clip_image-26901

示波器还是王道,当时主要调试的还是读取部分的波形,因为错位了就会导致数据提前或者滞后,这个非常重要,也许这就是很多人写不出来的原因,FPGA 并行的时序,就是头疼。。示波器时序如下所示:

wps_clip_image-24559

wps_clip_image-19933

第一次发送0x42+寄存器,第二次发送0x43,读取8bit的数据,最后发送一个NACK,OK。

5. I2C调试总结

其实读取的时序不大有用,但是有完美主义的我,没写出来就各种不舒服,当然这也可以测试摄像头是否还活着。可以通过读取厂商识别,或者产片标志,如下图所示:

wps_clip_image-13840

wps_clip_image-11056

写入的时序的测试,也未必要跟后端图像采集连接在一起测试,这样工作量也太大了,大家可以通过寄存器的配置,来改变PCLK的频率,是否按照自己的设计的参数来输出,如下划线部分可以用来调试,包括PCLK,VS,HS等,这在前期很有用。

wps_clip_image-14230

我当时把摄像头设置成了640*480 输入25M,输出31fps左右,如下式HREF的信号波形,复合实际结果!

wps_clip_image-12353

官方小组:视频图像显示系统开发http://group.chinaaet.com/116


官方支持的QQ群:VIP_Board视频开发:248619895 (相关视频、照片、手册等资料请自行下载)

VIP_Board测试视频下载地址: http://www.chinaaet.com/lib/detail.aspx?id=89940
Baidu
map