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

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

[复制链接]
发表于 2017-2-22 17:31:02 | 显示全部楼层 |阅读模式
       上一篇博客主要是讲解了关于需要配置的重要寄存器,那么接下来就是要通过SCCB接口实现对OV7725的配置。参考《OmniVision Serial Camera Control Bus (SCCB)Functional Specification》这篇技术手册,内部讲解了相关的SCCB时序的要求,实际上,完全可以按照I2C的时序来进行编写程序。、

# w( \# u" P. l7 r
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。
, U' N0 r' {! E; A

$ m: c' K5 |2 j. s( _
  上述是关于起始和停止信号时序图。

; J/ w0 I' U$ P+ ]  q1 V! m0 \) ]+ E" Y/ t

" h3 d" [* N! a' t: g! ~# G; G+ }
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。

2 v" {- E$ G3 f% ^* U3 g% t  r
! p' v6 [3 C/ s6 O8 L
+ B. p9 d% g2 V" s3 M2 y% x
# f5 i. ~) j9 e# s% E8 K) P
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:

! e+ E, I8 M+ v% n  j, [  r1 g. `" v" H- T
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。
+ K; B9 O( Q  t& w# B1 H: t+ U) X8 C
& q* f* ?+ B, D' c( c1 K6 P
  实现代码如下:
  I2C_OV7725配置模块

- Q& H' e7 V2 V6 ]1 ^9 a0 g( x  o
! B0 r9 Z) e; X3 p6 r% z
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。

# [: w$ `# u& v7 D6 Y* b

9 E" M7 Y% ]: ]3 [
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。
& a/ l  z2 x8 b: O$ m1 v

4 J$ O/ x3 @4 N9 _
! }* `& E9 e4 l2 b5 b5 D& {% ?
+ y* `$ t" _  ]5 X+ R8 ]; S
  上图是端口的声明和完成1ms的上电延迟。

* x3 b4 T& d- [3 h" G- m  D
  
% {/ ?+ b1 }! _4 K* m9 A
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:
! P% i2 x9 Z- R$ j. d5 P
  

4 R$ [$ H8 `% z* G$ x# T# P
状态机的各个状态。
  
$ M1 L& D& j, V9 P$ h8 _' K3 R
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。

, P; n% s' ]+ o& {& {- x  L

5 l: ]2 d- V+ x$ t. E7 k/ R9 M" U9 F! f- f
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。
6 Q* O4 V% L4 V9 f0 q: i! {
) x2 g4 `% y8 v9 X0 L% s2 L% ^
$ Z( [5 w8 F0 j# t6 X+ {& ]

2 _7 }1 s5 P% V; @+ F0 q1 r8 n2 b) t
  O# d9 x. Q; Z. w# u: _# h* T
上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。
: ]" g. B7 h3 r+ k+ s8 v
. ~5 L% I' O3 @4 U3 s# C" x
上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。
8 P2 O9 W& t' o% i9 X
: `' `5 F  U; e2 L5 m$ z
  

# [! D) G% I" U& P2 `. e
" F6 e5 U3 Y# n
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。

/ S) u1 n4 W. B) z; P
' x4 C' V- f& ~& ~

* t0 l3 s+ B) i" [
' P4 V7 q' N7 T( l. p) M! t) @
高级模式
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.