admin 发表于 2015-4-12 14:18:55

ov9650 Camera调试笔记— 之一

经过4天的调试,摄像头终于可以拍照片保存到电脑上来了,ov9650的调试走了不少弯路,一些教训总结如下:
1:OV9650是OmniVision公司的COMS摄像头,号称有130万像素,但是实际效果感觉不如CCD的,特别是远处的背景更糟糕。

2:OV9650的datasheet上写的寄存器控制协议是Serial Camera Control Bus (SCCB),还给了个时序图,但是它用的是两线制的SCCB协议;根据它的时序图是可以兼容I2C的,两者在细微之处有点差别,但不影响,但实际应用中,都是后端平台的I2C接camera的SCCB。可惜我没有仔细分析,愣是用两个GPIO模拟SCCB通信协议。此乃一错

3:对于OV9650,OmniVision公司是提供了参考寄存器配置的!一定要找相关人员要!(可能是他们的datasheet写得太烂的原因吧),可以我过分相信自己,没有找技术支持沟通!此乃二错

4v9650复位后默认配置是不能收到图像的!(在我的这个模式下:YUV422,VGA),当我在用I2C配置时,有的像的轮廓但颜色偏绿,我以为是没有配置起寄存器,但是实际上是配置起寄存器了,是YUV的顺序有问题!此乃三错

5:我们用的是杰得提供的VIA模块控制API,杰得的API多、复杂、有错且没有系统的说明,又由于我没有调试摄像头的相关经验,也没有弄明白杰得的VIA模块API。所以调试的时候没有图像,到底是摄像头输出问题?还是Z228接收处理的问题?无法判断!调试完摄像头了才知道杰得的库是可以输入4:2:2,输出4:2:0的!

我觉得调试步骤应该如下:
一:先要保证硬件没有问题!
    1:首先要看RESET脚和,PDN脚.的电平是否正确,RESET:高电平复位.PDN:低电平工作正常。

    2:第一次调试I2C总线的时候,把示波器放在数据线上,抓图分析看OV9650是否应答。地址应该是60H不要搞错了!
    3:测试关键信号(这一小步要寄存器配置正确芯片正常工作了才有的):
         时钟输入信号pin13: 24M正弦波(外部晶振的输入)。
         时钟输出信号(像素频率):24M,变形了的像正弦波的方波。
         场同步信号Vsync:形如:   ----_----------_-----:两个低电平之间是20ms左右(我测试的是22ms)
         行同步信号Href: 形如:   ----_----------_-----   :两个低电平之间是64us左右(我测试的是15.9Khz)
         以上三个信号是电视信号标准,一定要对。但是,在测试的时候有时候信号不是这个值,比如Vsync=34ms,why?我还没有搞清楚,请高手指点.

二:OV寄存器配置:
1:如果没有测试硬件,千万不要妄想配置寄存器! 也是我的调试原则,可惜这次我又违背了!嘚反省!
2: 用I2C读取OV9650的ProducaitonID寄存器【0x0A】【0x0B】:读出来版本号应该是0x9652,这里也一定要对,特别是你手上有几个信号的OV芯片的时候,不同型号的oV芯片,RESET复位信号不同,(有高有低哦!有一个网友就犯了这个错误浪费了四天),datasheet上没有说的很明白Reset是高复位还是低复位,我的小窍门是reset引脚内部有上拉电阻的话应该是低电平复位,有内部下拉电阻的话应该是高电平复位。
3:证明能够通过I2C控制OV9650后,将厂家给的或者网上下的相应的配置写入到ov9650。
4:如果配置大体正确,现在摄像头的数据应该出来了。


==============
以下是厂家给的配置:共有三个VGA,CIF,SXVGA,输出都是YUV模式,如是时钟是24M,帧率是15fps,我只验证了VGA模式的,效果还可以!

;09032004
;OV9650
;VGA YUV
;15fps when 24MHz input clock
;Device Address(Hex)/Register(Hex)/Value(Hex)
;
60 12 80
60 11 81
60 6b 0a
60 6a 3e
60 3b 09
60 13 e0
60 01 80
60 02 80
60 00 00
60 10 00
60 13 e5
;
60 39 43 ;50 for 30fps
60 38 12 ;92 for 30fps
60 37 00
60 35 91 ;81 for 30fps
60 0e 20
60 1e 04
;
60 A8 80
60 12 40
60 04 00
60 0c 04
60 0d 80
60 18 c6
60 17 26
60 32 ad
60 03 00
60 1a 3d
60 19 01
60 3f a6
60 14 2e
60 15 02
60 41 02
60 42 08
;
60 1b 00
60 16 06
60 33 e2 ;c0 for internal regulator
60 34 bf
60 96 04
60 3a 00
60 8e 00
;
60 3c 77
60 8B 06
60 94 88
60 95 88
60 40 c1
60 29 3f ;2f for internal regulator
60 0f 42
;
60 3d 92
60 69 40
60 5C b9
60 5D 96
60 5E 10
60 59 c0
60 5A af
60 5B 55
60 43 f0
60 44 10
60 45 68
60 46 96
60 47 60
60 48 80
60 5F e0
60 60 8c ;0c for advanced AWB (related to lens)
60 61 20
60 a5 d9
60 a4 74
60 8d 02
60 13 e7
;
60 4f 3a
60 50 3d
60 51 03
60 52 12
60 53 26
60 54 38
60 55 40
60 56 40
60 57 40
60 58 0d
;
60 8C 23
60 3E 02
60 a9 b8
60 aa 92
60 ab 0a
;
60 8f df
60 90 00
60 91 00
60 9f 00
60 a0 00
60 3A 01
;
60 24 70
60 25 64
60 26 c3
;
60 2a 00 ;10 for 50Hz
60 2b 00 ;40 for 50Hz
;
;gamma
60 6c 40
60 6d 30
60 6e 4b
60 6f 60
60 70 70
60 71 70
60 72 70
60 73 70
60 74 60
60 75 60
60 76 50
60 77 48
60 78 3a
60 79 2e
60 7a 28
60 7b 22
60 7c 04
60 7d 07
60 7e 10
60 7f 28
60 80 36
60 81 44
60 82 52
60 83 60
60 84 6c
60 85 78
60 86 8c
60 87 9e
60 88 bb
60 89 d2
60 8a e6
;

==============
;09032004
;OV9650
;CIF YUV
;15fps when 24MHz input clock
;Device Address(Hex)/Register(Hex)/Value(Hex)
;
60 12 80
60 11 83
60 6b 0a
60 6a 30
60 3b 09
60 13 e0
60 01 80
60 02 80
60 00 00
60 10 00
60 13 e5
;
60 39 43
60 38 12
60 37 00
60 35 91
60 0e a0
60 1e 04
;
60 A8 80
60 12 20
60 04 00
60 0c 04
60 0d 80
60 18 7e
60 17 26
60 32 24
60 03 36
60 1a 24
60 19 00
60 14 2e
60 15 02
60 3f a6
60 41 02
60 42 08
;
60 1b 00
60 16 06
60 33 e2 ;c0 for internal regulator
60 34 bf
60 96 04
60 3a 00
60 8e 00
;
60 3c 77
60 8B 06
60 94 88
60 95 88
60 40 c1
60 29 3f ;2f for internal regulator
60 0f 42
;
60 3d 92
60 69 40
60 5C b9
60 5D 96
60 5E 10
60 59 c0
60 5A af
60 5B 55
60 43 f0
60 44 10
60 45 68
60 46 96
60 47 60
60 48 80
60 5F e0
60 60 8c ;0c for advanced AWB (related to lens)
60 61 20
60 a5 d9
60 a4 74
60 8d 02
60 13 e7
;
60 4f 3a
60 50 3d
60 51 03
60 52 12
60 53 26
60 54 38
60 55 40
60 56 40
60 57 40
60 58 0d
;
60 8C 23
60 3E 02
60 a9 b8
60 aa 92
60 ab 0a
;
60 8f df
60 90 00
60 91 00
60 9f 00
60 a0 00
60 3A 01
;
60 24 70
60 25 64
60 26 c3
;
60 2a 00 ;00 for 50Hz
60 2b 00 ;D2 for 50Hz
;
;gamma
60 6c 40
60 6d 30
60 6e 4b
60 6f 60
60 70 70
60 71 70
60 72 70
60 73 70
60 74 60
60 75 60
60 76 50
60 77 48
60 78 3a
60 79 2e
60 7a 28
60 7b 22
60 7c 04
60 7d 07
60 7e 10
60 7f 28
60 80 36
60 81 44
60 82 52
60 83 60
60 84 6c
60 85 78
60 86 8c
60 87 9e
60 88 bb
60 89 d2
60 8a e6
;

=================
;09032004
;OV9650
;SXGA YUV
;7.5fps when 24MHz input clock
;Device Address(Hex)/Register(Hex)/Value(Hex)
;
60 12 80
60 11 80
60 6b 0a
60 6a 41
60 3b 09
60 13 e0
60 01 80
60 02 80
60 00 00
60 10 00
60 13 e5
;
60 39 43 ;50 for 15fps
60 38 12 ;93 for 15fps
60 37 00
60 35 91 ;81 for 15fps
60 0e 20
60 1e 04
;
60 A8 80
60 12 00
60 04 00
60 0c 00
60 0d 00
60 18 bd
60 17 1d
60 32 ad
60 03 12
60 1a 81
60 19 01
60 14 2e
60 15 00
60 3f a6
60 41 02
60 42 08
;
60 1b 00
60 16 06
60 33 e2 ;c0 for internal regulator
60 34 bf
60 96 04
60 3a 00
60 8e 00
;
60 3c 77
60 8B 06
60 94 88
60 95 88
60 40 c1
60 29 3f ;2f for internal regulator
60 0f 42
;
60 3d 92
60 69 40
60 5C b9
60 5D 96
60 5E 10
60 59 c0
60 5A af
60 5B 55
60 43 f0
60 44 10
60 45 68
60 46 96
60 47 60
60 48 80
60 5F e0
60 60 8C ;0c for advanced AWB (Related to lens)
60 61 20
60 a5 d9
60 a4 74
60 8d 02
60 13 e7
;
60 4f 3a
60 50 3d
60 51 03
60 52 12
60 53 26
60 54 38
60 55 40
60 56 40
60 57 40
60 58 0d
;
60 8C 23
60 3E 02
60 a9 b8
60 aa 92
60 ab 0a
;
60 8f df
60 90 00
60 91 00
60 9f 00
60 a0 00
60 3A 01
;
60 24 70
60 25 64
60 26 c3
;
60 2a 00 ;10 for 50Hz
60 2b 00 ;34 for 50Hz
;
;gamma
60 6c 40
60 6d 30
60 6e 4b
60 6f 60
60 70 70
60 71 70
60 72 70
60 73 70
60 74 60
60 75 60
60 76 50
60 77 48
60 78 3a
60 79 2e
60 7a 28
60 7b 22
60 7c 04
60 7d 07
60 7e 10
60 7f 28
60 80 36
60 81 44
60 82 52
60 83 60
60 84 6c
60 85 78
60 86 8c
60 87 9e
60 88 bb
60 89 d2
60 8a e6

非常感谢网友李鹏分享他的调试经验,让我在调试中得到一些启发,OV9650的datasheet写得太模糊了,而且125个寄存器每一个都要配置!而且有个偏门的SCCB协议,ov9650明明兼容I2C协议的,可是datasheet上就是不说!
——————————————————————————
原文链接

Camera调试   
基本上调试camera都是找得平台得技术支持。呵呵,代码合进去应该就没问题了。如果有问题,主要调试一下几个方面:
1,提供给CMAERA得MCLK是否太快或者不正常
2,camera输出得PCLK是否正常,因改是有MCLK时候,就有PCLK输出。
3,查V、H信号,看是否和程序设计一致,如果一致,说明通信正常。
4,量量数据线有无波形,等等
至于发挥sensor得性能要找技术支持了。
供电,检查时钟,送初始化代码,查看输出信号,是否显示正常
下面是我在调试OV9650的一些总结:

步骤一:读取OV9650的ProducaitonID寄存器【0x0A】。
如果读回来的值为预期的0x96,则表明后端芯片跟OV9650能够IIC通信上。函数如下:
       RESULT IsiCheckSensorIss( void )
       {
             UINT8 pucValue;

             IsiReadRegister(OV9650_BASEADR,OV9650_PID , &pucValue);
             if(pucValue ==0x96)//pid value of OV9650
                  return RET_SUCCESS;
             else
                  return RET_FAILURE;
         }

步骤二:按OmniVision公司所提供的参数对OV9650进行设置,并进行回读检验。
OmniVision公司会提供每种图象尺寸下的OV9650配置参数。通过IIC口把这次参数写到相应的寄存器去。在调试时最好加段代码进行回读检验,以保证我们对OV9650的设置是正确的。在调试完成后,可去除这段代码。

步骤三:用示波器对OV9650的输出管脚PClk,HSync,VSync进行测量。
      如果能测到PClk,HSync和VSync信号,并且这些信号是和我们寄存器配置是相吻合的,则表明OV9650已经开始正确工作了。

步骤四:配置OV9650为U、V固定值输出,看能否在后端芯片正确接受到固定值的U、V输入。
置位【0x3A】寄存器的bit4,同时对【0x67】【0x68】寄存器进行设置,这样OV9650就被配置成固定U、V输出了。为验证全部8跟数据线,建议设置【0x67】为0x55,【0x68】为0xAA。如果能在后端芯片正确接收到0x55和0xAA,则表明0v9650和后端芯片数据通路完好,对控制线的极性理解一致。

至此,OV9650跟后端芯片的通信已经基本正确。清空【0x3A】寄存器的bit4,让OV9650输出实际的U、V值。
后面的工作就是如何控制后端芯片(Cx832)Marvin功能块来实现图象的Preview/Capture/Resume等功能了。
摄像头初始化时,没有将数据写入I2C,一般问题会出现在哪里?
SENSOR的各路电源是否接好,
CMCLK是否正确
RESET sensor
I2C总线上拉电阻是否匹配正确,
访问sensor时使用的 device ID是否正确,
I2C的时钟CLK速率是否太高,
两次I2C连续读写之间是否有spec规定的delay时间
CAMERA POWER UP 时序是否符合 SPEC。
camera的工作过程(从进入相机到拍下照片为止)
一般先给电源 ,然后给 MCLK SENSOR的 时钟然后复位 PWDN改变极性使SENSOR 进入工作状态,让后再过几百ms 进行 IIC 操作, 然后就进入 PREVIEW 模式了,拍照的话 是 截取完整的一帧信号而已,有时会关闭SENSOR 的AWB AE功能。
页: [1]
查看完整版本: ov9650 Camera调试笔记— 之一