查看: 5384|回复: 0
收起左侧

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

[复制链接]
发表于 2017-2-22 17:31:02 | 显示全部楼层 |阅读模式
       上一篇博客主要是讲解了关于需要配置的重要寄存器,那么接下来就是要通过SCCB接口实现对OV7725的配置。参考《OmniVision Serial Camera Control Bus (SCCB)Functional Specification》这篇技术手册,内部讲解了相关的SCCB时序的要求,实际上,完全可以按照I2C的时序来进行编写程序。、
$ |# @8 }" M4 g, w: w, Q8 V
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。

+ |' i  ^' ^2 E2 Z" W) a4 Z9 y3 w8 c4 B8 h0 p+ y1 S( R2 [/ U* Y
  上述是关于起始和停止信号时序图。

4 x& v4 T0 Y2 e7 k0 }! q, G! u8 B" t0 [2 k% {9 P
! A7 F4 ^8 _3 d* Q# p- I
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。

) j1 w5 Z0 ~% ^- J- Y" a4 C/ a  Y

, R. P6 j- f* a: ]! y% n9 w( @( S  d% P2 M
3 A1 p1 `+ C* x' Q2 H. A
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:
, v& @( i* l! i  ^; X
$ M# U1 G9 R' N5 I  L
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。

! x& x, m+ b2 w! i+ ~# a
& u6 M0 h& i) }4 B1 i  O9 X4 L
  实现代码如下:
  I2C_OV7725配置模块
; q/ i* S$ n9 \: c

- [" X$ [# E9 T+ A$ e9 }( o) v( t( F- z5 [' x/ T0 ?3 g# z
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
: v) b" E" [" j1 Q9 R* c/ d8 J/ _

1 k! n) j4 Z/ o# F( y
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。
6 C6 z# d  l5 {5 g9 m4 }

* ]' J6 Y+ f3 I+ ?" |* U
2 \' t6 ~# O: D- ?2 e
9 Z. i$ W) d0 {& G2 ~" p: A
  上图是端口的声明和完成1ms的上电延迟。
4 v0 |$ t# ^: P
  

1 s# t# l! r9 d# N# j4 T
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:

( M  h) O& r3 [- n' u& G
  

  |* M' J5 Q/ b; o' G
状态机的各个状态。
  
( O: Y' g4 R' v8 b4 p
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。
7 Q( s$ l- c( S+ ^7 z: t+ Y& y

* z( ~2 j- v- w+ v& M
6 h+ L7 I3 }2 j# N
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。

1 N' h/ R/ N# g! i( C

4 B" X8 t( ~% C& \6 k5 d* L7 b6 Z; d- P. g2 p+ l5 p! D- B) [

$ |. i- |6 i3 h3 Q2 `
% b. @6 E; X' F; }  T/ a  a9 \2 B
% j* Z2 J& S0 Y, f1 N上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。

( P9 V/ v# o8 H8 A) A7 a( d6 T: X

0 \1 G4 ^" G0 }9 c5 `上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。
' ~' \- I( t/ |4 w4 J3 ^& O

" A0 W, H) I5 t8 v
  

, B) K1 T7 {  r* e( F, s) I. T
. X4 d& w8 F! \, q# ~8 i
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。
( R8 j7 L! G8 W" d: r* q
' ~* ]8 m$ j5 R2 b

& W2 X+ v  l- c% A

1 T; m! q2 `4 c. g
高级模式
B Color Image Link Quote Code Smilies @朋友 |上传

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

手机APP程序:
扫码下载访问

微信公众平台:
摄像头之家公众号

微信小程序:
摄像头小程序

返回顶部

QQ|站点统计|小黑屋|手机版|Archiver|摄像头模组论坛网-摄像头方案网CCM99 ( 粤ICP备18155214号 )

Powered by Discuz! X3.4 Licensed© 2001-2013 Comsenz Inc.