admin 发表于 2017-2-22 17:31:02

摄像头驱动0V7725学习笔记连载(三):0V7725 SCCB时序的实现

       上一篇博客主要是讲解了关于需要配置的重要寄存器,那么接下来就是要通过SCCB接口实现对OV7725的配置。参考《OmniVision Serial Camera Control Bus (SCCB)Functional Specification》这篇技术手册,内部讲解了相关的SCCB时序的要求,实际上,完全可以按照I2C的时序来进行编写程序。、
SCCB接口时序双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233616714-1930159165.jpghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233617495-248114625.jpghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233618385-571689338.jpg

上述是关于起始和停止信号时序图。http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233619104-1302977683.jpg


上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;对于读出寄存器,手册有这么一段话的描述。
http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233620417-2016187598.jpghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233621104-1185007875.jpg


所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233621901-408915572.png

对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233622807-1490492777.pnghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233623682-198246608.png    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。

实现代码如下:I2C_OV7725配置模块http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233624557-1805340989.jpghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233626120-1915287404.jpghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233627026-743790245.jpg


上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233627651-1365067425.jpg
手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。

http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233628573-1643753902.png

上图是端口的声明和完成1ms的上电延迟。
http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233631417-1894568323.png
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:
http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233632229-1235099809.pnghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233634807-57083246.png
状态机的各个状态。 http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233637620-1936360845.png
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。


http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233641682-1001610862.png 188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。




http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233645479-1434337092.png
上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。
http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233648198-1883298655.png http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233651792-1855383191.png
上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。

http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233655182-1570860297.pnghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233658932-434553864.pnghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233703073-587356849.pnghttp://images2015.cnblogs.com/blog/836224/201601/836224-20160102233705557-394299287.png

上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。


http://images2015.cnblogs.com/blog/836224/201601/836224-20160102233708198-68324599.png
页: [1]
查看完整版本: 摄像头驱动0V7725学习笔记连载(三):0V7725 SCCB时序的实现