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

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

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

3 ^1 [1 v+ v! F: b1 `# O7 \% U# i  A
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。
5 V+ |, m1 f; J: F" Z5 p' O
0 ~1 r6 r4 l- h8 q) J3 K, ^
  上述是关于起始和停止信号时序图。
! @5 A, ^' _/ c9 H* X

. f! ?$ q7 a7 Q/ L! k- k4 D7 c( y. D
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。
8 E. T, s9 q& m  j: o

( `, ?) B- X: A. [; U9 I
6 i) U* X  c$ b# }$ x8 ?+ u; g" c1 ~7 _2 Q" U/ l
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:
  k7 i8 o& b7 ?9 C9 Q# P' j, F
8 }0 c: ^7 S/ @' X; W9 @: T# n
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。
/ o6 Y- {" a4 s: Q
! V( `+ H6 L  Z- h& l
  实现代码如下:
  I2C_OV7725配置模块
7 Q1 p0 W' T9 ]+ t- ?9 b+ ~

) N( |6 P+ V! w9 `- ]  X( P7 n, f8 u+ O' w4 |+ H/ \6 r
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
. ?# G0 P& m' E) F5 o6 Y, O

( r- [* K  ~7 Z4 W
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。

7 g& c6 ]; x- v3 Y( R' Y* M0 L3 y: p# E% b: L& R0 B6 G
  n( B- F. g8 u! t8 D
+ j0 B% M. H/ q3 Q  a% i
  上图是端口的声明和完成1ms的上电延迟。

7 g1 _6 @1 Q# r# c* N" O/ j' ~* y
  

, s. p, G9 Z1 v: S  n( x8 s
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:
4 m' }/ _9 {+ n0 |1 M- H
  

) g6 D! ~' ?6 t. r) }% Z  F" @0 n
状态机的各个状态。
  
8 ]( `; u+ b- {% a# d
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。
& _* Q2 H. I/ O: v: u

1 n% v# G4 S% n+ ]3 {9 `. S: k
8 k# i& W; v0 a/ w: ?# s
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。
% N7 D' A) f- M

  e, Z4 V2 r( S1 y# R
. Q0 j8 L& O0 L4 p
1 k! _, S" I% o
' S1 t6 V2 X# Q- Z
: O, y6 [7 w6 _+ W$ b上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。

/ T. }' z/ F: E# H1 N

3 @! |( h" W! Y7 \' y2 k! v上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。

# @; I" j* Z2 I- }+ C% Z3 A9 G  k9 {3 u  b4 p
  

( ]4 ?; D( @( n, b! N8 ]; a9 ^1 v2 O- Z& F3 ~
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。
3 c" Z9 r4 L6 s7 P, ]
: P# H, V, a9 s  V4 q
& S+ F/ T8 @$ S0 A' \$ v! Y, M+ @
( \+ Y. b& j. {7 k' @
高级模式
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.