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

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

[复制链接]
发表于 2017-2-22 17:31:02 | 显示全部楼层 |阅读模式
       上一篇博客主要是讲解了关于需要配置的重要寄存器,那么接下来就是要通过SCCB接口实现对OV7725的配置。参考《OmniVision Serial Camera Control Bus (SCCB)Functional Specification》这篇技术手册,内部讲解了相关的SCCB时序的要求,实际上,完全可以按照I2C的时序来进行编写程序。、
" c$ O" t2 V5 Y& }/ m$ P7 K) h
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。
: s* g, V+ U9 v. `% q1 T
2 b, l0 q, ^+ P) _
  上述是关于起始和停止信号时序图。
# {* g, M! e' D; N  X

' V+ w$ m! M/ S7 z7 R0 |; E$ Q- Y2 a) Q  x5 q% l$ m
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。
( C1 L7 C4 [+ P# d3 ^

/ L- e+ e1 P$ Z6 f4 X- H( ?7 T& W# L2 E7 M

4 @$ c5 B# d+ P# ?: \
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:

( k/ h9 r/ z( @5 e, a% F7 ]0 M
7 |# ~/ o$ w; L! V! u7 z: W
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。
( t# ^& m6 a% O4 d

" i# {( V: `- u! K3 J& j
  实现代码如下:
  I2C_OV7725配置模块

1 O9 e* p& _) P. k8 {4 U: X& B. o5 i
* y! I0 j! \9 S+ @8 M, d7 T3 a7 ]0 O$ \* M0 J* G$ p
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。
' H. O2 N6 q+ t& p' }$ o

2 L* [7 I% R+ c" t8 [7 l
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。
5 C+ Y6 {1 p0 o
; Q; H1 Z, G, v0 L% \3 ^) h

2 |! p7 p- C( N4 H4 X1 T" k, N$ n
2 u4 o# y& o. u8 d
  上图是端口的声明和完成1ms的上电延迟。

7 ]. \8 R0 e- `! g9 w/ d
  

0 P2 L9 H5 [1 B, k4 s/ C, p) r; P
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:
% [6 Y$ L7 }; k; g5 }1 g7 I
  
! [5 A* M. W; P1 v/ O
状态机的各个状态。
  
+ i9 S. \  E& k' M, L8 J
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。
2 \( H1 V! J8 M6 M7 ]4 Z! X$ [5 F- N
5 g8 @  l" N: \& b- [9 Y6 D. w" \

/ @1 s6 c  G+ D' z- n  I
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。

* W2 f' k% Z' x& b2 v3 \

4 X5 P. q8 b+ L' M6 I3 B$ C4 X3 s& B/ J7 W
8 V/ o' E8 Y1 ~  L1 Y
. Z. K% D$ R4 r& M! d8 H' q5 L
( P$ @8 e( t, [1 W/ c/ }
上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。
2 d7 ^# X. }* P5 q8 K8 r% J; \+ J

' q- H5 D6 n  G上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。

: v' T2 u0 ^) B2 L+ F) G. N+ Z5 y1 u+ g
  
8 k0 V- v; M* }9 o
3 [: z3 O! m: Y+ n
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。

8 b1 d8 k5 m4 o3 E$ z& M+ w

. H7 n0 |- k. I7 S' ?( o2 D2 l+ a7 r7 ~6 d* L3 Z1 `4 d6 d" D1 ^

6 i! U3 o4 v2 a2 T) Y, w
高级模式
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.