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

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

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

+ w% d2 f4 }; ~( a% c* s1 O9 z4 j9 v. j9 ~7 [8 l0 T0 z+ |7 i
  上述是关于起始和停止信号时序图。
. t1 x! Z, y. R8 O$ ?) w, v7 n2 k8 e
, k) [+ j& W) b& l/ k0 f3 H

- R$ Z1 t% Q5 F/ x% b* V( k0 D& B
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。

( I5 w% y9 l* z' @/ h. \5 L
1 {  `) V' F( G$ Z) l% A

; ^- g3 P) G4 e5 E% o) y! C" b8 e. m) \9 z
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:

/ M; W+ N# I( @, V
; E' e! V; g6 `) a) |" k7 Y
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。

4 R2 l- y2 y6 T; Q
& a6 Q# N8 x1 ^, h5 D9 x3 s
  实现代码如下:
  I2C_OV7725配置模块
& R+ [0 \/ n; G9 B6 h6 s' q

* o* G# B/ q' F3 C
0 x2 t3 V' \' f' @7 S% G+ Y
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
# |# s+ a+ S; B6 @' Q% T2 k

# V& J- |: W& N% ]5 ^% X" ~& X0 ?& Q
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。

2 _3 }  N/ p* {/ }( a; U% t0 y% [
0 i: t0 v/ \: y5 I; {  k3 r$ Q1 q
* b. M! |: I" O" @" r
' B! _- A, C" M5 w
  上图是端口的声明和完成1ms的上电延迟。

+ K) ]4 [4 m7 x3 z
  

$ |7 R) ~1 Q2 A! f5 H! f
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:

# p) u' f  _- a% K9 V5 }1 {) O
  

: ?' e! P  u9 ^9 G* j0 r
状态机的各个状态。
  

# H, ^, D  h- w- a# g, |/ k0 \
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。
( z! i+ X  M" y2 f6 }2 N# h

! \- Y- [, ?! {6 f6 K; e
! @3 o; p2 ]* B* H9 c
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。
  u7 e1 Q8 e/ \: {

5 G3 F' ~8 c1 x( {! [6 p2 e9 ?& U  y0 @# H# S4 P: d

% K3 J' F2 B: N9 V9 x! P8 c7 N, P# ]3 f7 n/ _# |
$ M3 I3 @$ p0 A% l, J4 T
上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。
- \- E( y0 e$ S' h9 D  t
- ~9 s: U4 p( o* y1 a% r4 D$ U1 D- g4 r
上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。

5 ]: C* F3 ?2 _' L( f" o' d8 Z) K; W/ |, g
  

* n2 S" o& A1 J0 e3 F: A  L% H6 a, M& _, f- N2 w; y
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。

) N; ?" M& B; i$ Q7 K2 m' \
. S7 i$ A3 E+ E# Z5 v8 g9 K# D
* _( }) a4 w; E/ |1 @9 O

- h7 V  `  X) n& l7 R
高级模式
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.