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

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

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

) r: _- [7 Q0 b
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。
' |% g7 L8 X2 l$ Y
3 p* e2 Z5 W" y) {( ]
  上述是关于起始和停止信号时序图。

$ U4 z$ G" j/ U7 ?3 v! S1 w. W
/ T' v( n  O; ?5 w' }' N  \3 I
7 E+ \# S" @1 f% E+ J" s3 Q4 L
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。
5 }7 ?- H4 r9 _) n4 i2 h- @6 N

! w9 S# M2 {1 z" Q0 \
2 f' S/ b& [! q& H
' S$ r# q. Q2 m5 N; V. v) t
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:
0 V5 N- D( _: u2 C2 g$ X0 Y

8 g9 x0 i& u' i0 ~2 P6 z5 n6 y
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。

3 K: t' k5 i, X- I) j4 ]$ K7 T6 y( `- f
  实现代码如下:
  I2C_OV7725配置模块
, o% K& k; b! w# m

1 c+ W& L3 A. R8 d
* d! e  d3 s2 Y3 z$ t/ u
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
1 _  G, X; A/ `* t$ t

$ F6 t& i0 I+ \7 o1 s/ z9 M8 s
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。

3 ?* v, E6 ~2 v& n0 d! b5 z& T$ Q2 j, j+ T

+ Q9 u; i8 {0 e
* W: P) {, E, g: @
  上图是端口的声明和完成1ms的上电延迟。
/ p/ x' {. e4 }) g4 ^
  

" u& B6 t& J3 ^# Q7 q  B
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:
2 g& E$ R& A: z  L: h/ z. U7 ]
  

6 ^0 J9 X9 Q7 j$ M
状态机的各个状态。
  

3 ]: c. J$ b* b, P% A  y; ?
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。
$ s! u7 p1 E3 u9 v9 v8 d) K

9 S/ M4 T" f# F1 S' Q+ V
7 i$ A& Z; |4 q2 l
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。
3 d) t  C7 h+ d: N7 F2 Y

8 E  Z4 ~5 F: O  S' u
- ^/ `; {7 }# D1 V+ M2 L4 V$ ^4 V2 ?, G: D/ L& u

4 l# m" X' f5 h. Z$ ?
$ z( S1 n3 @' I8 G2 s# \7 C上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。

1 s+ b5 o- W5 z2 H2 z9 n5 U+ X
, s( [& _0 Y, z# A( r. F' i% ?
上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。
0 k" f' E4 Y* N  O

6 x4 ~" i' m' d- s* a  Z! L. {
  
4 z7 F4 I" X+ q0 D
6 e! u& Q1 ?7 t; X' c$ ]  P' {- _
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。
7 a: c/ e1 I. [/ G

1 p2 D( n6 F. s4 O3 ^" H7 O- X1 I3 \$ o4 W. |) V0 v9 p5 D+ J1 T4 x) O' A

" r# L: C  X# c
高级模式
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.