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

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

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

& }" D( {" s2 C' D1 h
SCCB接口时序
双总线的起始和停止信号如下图所示。其中SCCB_E是针对多个slave device设定的一个使能信号,这里只针对一个sensor进行数据的配置。所以此信号可以不使用。

  A2 ~5 M3 {- @5 h7 V
/ J3 j  `; a& M& x7 v
  上述是关于起始和停止信号时序图。

$ V8 |/ F% g" K3 n1 Q( z1 O
- A5 W3 p4 q3 M' K2 i& R/ c8 [. T/ s
6 Y; d2 P7 Y8 [$ P; g
  上图是写入寄存器的相关设置,先设置ID地址,然后再写寄存器地址,最后写入寄存器的值。
  第一阶段:对于OV来说设备地址为0X42,写是0X42,读是0X43;
  第二阶段:写寄存器地址,这个地址是你需要设置的OV的地址值;
  第三阶段:写入寄存器的值,这个是对应第二阶段所设置的寄存器的地址值;
  对于读出寄存器,手册有这么一段话的描述。

' g2 D$ u  c3 ]& @! R- {

! T9 @% q5 j4 ]: ]+ }4 [
5 Z3 `, |2 I0 ]0 t6 ~5 W! }7 ?! I: d5 R2 `
  所以对于上图中的读出阶段,打算用四个阶段去实现,一个是利用同写入寄存器一样的前两阶段,包括ID的地址和所需设置的寄存器地址,再加入两个阶段,一个是再次读入ID地址,然后读出数据值。如下图所示:
4 d, h/ J  [  V" r* N8 `. \* ]

4 i2 p. o# X3 n+ w6 l& G
  对于OV寄存器而言,有些寄存器的值适合读,有些寄存器的值适合写,所以在设置OV寄存器时要格外注意各种数据的格式配置。下面就实现I2C接口进行,并对OV7725进行寄存器配置。
    上图是实现SCCB接口的整体框图,其中并未画出全局时钟和全局复位信号,再设计时需要进行全局时钟和全局复位控制。
; R0 x8 E, E( a9 f& E

  S" t. J( C% }! H) r5 Y* B
  实现代码如下:
  I2C_OV7725配置模块

( F; W0 G) U. [* O' D- ]
: z" k$ u+ [! u( c3 q6 H2 o1 t: Q$ ^0 ]: D2 L) H
  上图是简要列举了参数的设置,其中注意寄存器12,37行,是进行复位,64行是对输出形式的设置。其他的寄存器设置可以参考上一篇博客。

% ~) h4 A& T# z. H3 K

+ B4 y" ]3 |! ]' U6 R$ g
  手册上面规定,在所有寄存器复位之后,需进行最大不超过1ms的延时,最大限度的保证稳定。

  Z9 ~4 y7 B, N7 b0 P
) }, ?3 l2 G& p/ `  c4 [* U4 y# e% ?
8 ^, d2 ?# A( ^& ~
1 J  f) Q' V5 U4 B1 |
  上图是端口的声明和完成1ms的上电延迟。

8 h8 _1 y, @5 Q: I6 r! [% O$ j
  

  e+ F. e0 c/ l2 s( E
上述是完成 SCL的生成和在时钟的中间位置设置使能信号,仿真图如下图所示:

$ B5 {/ U. M. k/ E) b3 n+ W
  

7 q3 q/ W0 S- [+ p! n7 i
状态机的各个状态。
  
$ g5 p6 r7 v8 s% B* W! ^3 \8 d
上图是状态机的第一部分,对于手册中有提及过,没改变一个寄存器,需要最大为300ms的延时,最小和典型值没有说明,只要小于等于300ms即可。利用 i2c_transfer_end和i2c_ack来实现这一延时。其中i2c_ack是各阶段的总响应。下面会提及。

. s: |+ W' j6 q' E
0 W4 X! w+ i$ W

3 [% S3 C( _. C- N) w3 o
  188行中需要注意的是,前两个寄存器是用来产生厂商ID的,只读,所以需要判断。

' N' E* g8 g% y( t; H" {/ v  J* E
8 P2 U% q: {1 d3 ^# ~
' H- N( k' O3 M

# f  q: S  X' V; Y2 U
) o, W, z7 E* V8 n, ~
' x3 l5 ^" f9 U- B上图中i2c_stream_cnt是用来计数数据位,使得发送时从高位向低位发送。

) A; y. ~' F  P) A

8 z* K( v- M, S' a  g9 s$ ]上图中i2c_sdat_out 作为输出数据寄存器,用来接收配置寄存器模块发送过来的数据。

& n( \; u2 R" c0 ~3 x3 y
) h8 t6 Q* Q! S, ^2 ^
  
$ b2 g9 \. F! U3 [$ G
; C7 y# K) N- a4 n3 @: X9 [" z+ Q
上图是对I2C的ack信号做出的响应,420~422行做出的反应是高阻态,下面是整个SCCB实现的接口modelsim仿真图。
7 C# v, L9 G' ]4 c& B8 `& U, n( h

0 N. L" U! {9 E& J  X; n; n, R. Q( j; q/ l" `; q) R$ n; ]% Y
0 W9 _! W( a8 ?
高级模式
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.