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

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

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

0 k4 _  {/ Z" U- o- p
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。

- w) j6 N) N; e0 _+ m' @* }2 _% P: F! f* |7 m8 i1 |( X+ q8 q1 x" i% q
  上述是关于起始和停止信号时序图。
' d) Q0 ?- T' |$ A1 H1 P5 Y: b
0 j! L7 J' h" }7 l: F

& E7 |. x/ f  T% g7 @2 R
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。

: |- H$ _1 x4 }- i8 w# }( t

' v, H! w& P3 h: i( X
, @/ l' \& x; [
* U- i2 y5 ^- u' N& A% o! k
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:

9 z& L% U2 J; C1 m* E: ~& Y; Y/ F; j% u. y
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。

" Z5 e9 _# ~7 X/ H. B+ c8 f* w0 K8 v- {% B
  实现代码如下:
  I2C_OV7725配置模块

2 O2 P4 D$ U, V5 C& E# M
( j/ l1 f6 R6 E( T7 f( c+ T, w8 }% m* ?/ ?' B7 u' Z
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。

0 f! J6 `) v/ k% g2 k* U

/ n8 T! c# r. m+ O* |
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。
0 w  [& j# m# i* i. b- o

0 U$ i6 L; P0 [9 W2 K
, U3 l9 N) p; y0 f* E4 z1 k7 P( v9 b
. [% g6 {$ d" b
  上图是端口的声明和完成1ms的上电延迟。
2 P. g3 M( j2 D
  
' Q* r. n# H! \, \: k% i
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:
8 b( a# y( p+ N$ x$ j7 p
  

; `0 V8 r  W4 C3 R1 v
状态机的各个状态。
  
8 B6 D- @8 {. L5 _9 x3 U
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。

0 f1 f2 k, q# P3 g) |# J. c* b+ a9 R

$ W0 d2 s$ z" t3 w) R7 o2 o
/ A/ e# d5 R" r7 Z0 a
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。
* E0 _5 A  i+ O( K8 ]$ z
- O! I* W) [# k
4 N+ }) k6 R4 w( S

$ S7 Y" T; ~; w: S: J/ Z6 |9 t7 ^* c4 S0 n. U! K0 z1 n. }% X" Q

4 `0 {0 \: i& ~& F6 V+ A" G* L上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。

2 I: G6 R% P9 m0 Z8 N3 ?+ O' u
% [6 E& o; E' ?1 K+ T3 G
上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。
6 k& f5 u% ]5 _0 Z% }9 D$ _

' t( q. j3 k* U8 v8 k0 V7 b
  
, C; y0 Y4 q5 e9 V5 y
" ]5 c& {2 u, S. g# Q
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。

& K) I: L" @) n* X
, @$ S  F! w7 M# M9 B
* L& j/ a1 N  r; [5 O

7 g# O: T, Z0 O
高级模式
B Color Image Link Quote Code Smilies @朋友 |上传

本版积分规则

在线客服

客服电话

欢迎来电咨询

188-9985 8350

微信关注

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

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

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

返回顶部

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

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