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

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

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

( v$ u1 A: A  F0 P& ~! E. h+ W  r4 o
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。
6 y6 K2 `# H& _4 k+ k6 n, O
) u0 O' q9 R1 [4 r! o
  上述是关于起始和停止信号时序图。
+ e: m) V6 P: G% b$ M3 j
' s% t# F$ K+ _8 }$ e- ]0 t9 z9 E
  l+ S9 x" o5 F; `
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。
6 |4 N" n' O; J* n  t/ @

: [/ k* d! `- h$ e
; v, q4 Y& k, k9 b& ^& X7 t8 K) W( o( O' J% V& m: n' v  c2 ~
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:
1 k+ N) [8 i8 ?2 t1 H1 R
. b1 p0 L4 u  r/ q, r. N
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。
  h6 K1 a+ O5 h

8 F* r9 D' Z4 m9 c8 {( G/ D) i
  实现代码如下:
  I2C_OV7725配置模块

1 }: i3 y: X% _
) Q( g, Y+ x+ C" @
5 t- d3 @: B4 ?& _/ E& Y0 K( }2 @# e
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
* r/ [) Z8 h: l& f, b* K

2 f: t0 E* e8 m4 G
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。

3 n8 j: K) O9 f" s, R) p
9 O5 X. M0 h+ [/ p$ r" N9 h# ?& {5 a4 b& q% J
' Y7 L1 q; ]5 B' y6 K
  上图是端口的声明和完成1ms的上电延迟。

# U) g" D# ^) ~0 }% D/ t
  

$ A# ^* Y' S( q0 j! a, a. |% Y
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:

# k, p' [5 j* N. S
  
. |4 ]$ x/ o$ _% o* I
状态机的各个状态。
  
' s2 f; w8 y! {0 e
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。

* ~9 J  S9 N7 J8 t, `, ~9 j6 Q

5 h, H& U" Z  n4 ~! i% q% k' ?  F4 L
+ Z8 s3 J6 |& @6 r5 e4 j
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。
4 J* f  \4 c2 ~5 |; [8 Q

4 u, q% ~* s9 x. ?1 I& v* x0 ]6 x; w7 e: \. d; f
# ~$ ?3 F; \& h, v+ k
" X: K, o3 a' O# J/ c
3 `$ h, }0 R' ^6 o, I  A+ c. q$ g
上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。

% |4 L( ]1 M% x, k& P

# w1 a" F: Y1 y. M" r  n上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。

; j8 {! Q$ J6 F5 K8 c, ~9 @& r  y
5 m9 B) U4 N, }& C, x  P
  

/ ]# H' _- G; t
/ n( ^! Z! ~0 ?& V
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。

2 W/ ^8 |6 v2 W$ i% H+ y
6 Q% v2 x/ P8 P+ g6 o# x
0 i1 g. T" N8 D2 q. t; v$ p

( P# Q. a+ A6 J" D+ v8 B
高级模式
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.