【转载】I.MX25上摄像头调试总结
本文转载自以下网址:
http://www.ruixuedz.com.cn/article/1f/433.html
经过约一个月的调试,终于可以在PC上正确显示摄像头上采集的图像了,这期间,走了很多弯路,不过收获蛮多,下面就CMOS的调试,做一次总结。
首先,拿到这款摄像头时,需要做一个初步的硬件信号测试,摄像头上关键的信号有像素时钟(PCLK),行信号(HREF),场信号(VSYNC),输入的时钟信号(XCLK)和两路分别为1.8V和 3.3V的电源信号。当然,只有供上XCLK,才会检测到PCLK,默认情况下PCLK=XCLK/2。MX25上XCLK是通过CSI(Cmos Sensor Interface)提供的,需要预先配置CSI,使其能够输出XCLK;另外,还有8个数据引脚,供上XCLK时,可以检测到数据引脚上有数据输出(当然,默认情况下不能采集数据)。仅仅提供XCLK时,我们可以检测到的数据只有这些。
其次,配置CMOS内部寄存器,可以使用MX25硬件产生的标准的I2C协议配置CMOS的寄存器,这一点已经得到验证,这里,特别注意,OV9650采取的是SCCB协议,与我们标准的I2C协议有些差别,即在读取时需要在写入寄存器地址后加上停止信号,方可读取寄存器,读取过程为:1开始信号,2写入设备地址(0×61)3,写入寄存器地址(0x..)4,停止信号,5,读取数据,6,停止。所以我们采用标准的I2C协议时,只能对OV9650内的寄存器进行写入操作,不能读取。
配置好CMOS内部的寄存器后,需要再次检测PCLK,HREF,VSYNC;有网友写类似的总结,说PCLK为24MHZ时,HREF VSYNC如下图
但我在MINI2440上检测到的信号为:XCLK:24M,PCLK:24M,HRER:6.5HZ,VSYNC:162MS;在I.MX25上检测到信号如下:XCLK:22.22M,PCLK:22.22M,HREF:7.35KHZ,VSYNC:144MS,和MINI2440上信号接近,虽然和标准的视频信号相差很远,但也可以正常采集数据。
再次,配置好CMOS寄存器后,增加几个寄存器配置,配置0×3a ,0×11,使其能够输出固定的U,V值;配置 0×67 0×55,输出固定U值为55;配置0×68 0xaa,输出固定V值为aa;一般的OV系列的CMOS输出格式为YUYV或者其他变种形式,比如YVYU,UYVY等等。如果可以在内存中检测到固定的U,V值(比如Y155Y2AA,Y355Y4AA),则证明与后台连接正常了。
几个细节问题:1,选择寄存器配置文件时,起初选择MINI2440的VGA配置,但采集的图像没有经过压缩,比较大,有1M多,不方便在记事本手动中编辑,最后不得暂时搁下;后来采用网上的CIF制式配置文件(352*288),虽然方便了编辑,但图像一直无法呈现,估计是配置文件中存在问题,最终放弃。由于后来的编辑采用了程序自动编辑,然后抱着试试的态度再次选择VGA的配置文件,这次终于成功了。
2,在CSI上有一寄存器是配置图像大小的,如果我们不仔细分析,就会想当然把图像的长和宽配置成VGA制式的标准,即640*480,但读取数据的时候,就会发现,数据整整少了一半,想来想去也没想出到底哪里缺少的这块数据;后来,重新看了一下飞思卡尔对CSI的配置文件,发现默认情况下,竟然是640*960,猜想这个大小应该是我们VGA制式的大小,但HEIGHT却是960,而不是480,估计那一半数据应该出在这个问题上,后来证明果真如此。现在的结论是在CSI上图片的大小是WEIGH*HEIGHT*PIXEL_BIT,而PIXEL_BIT就是加在HEIGHT上,我们输出的格式为yuyv格式,32位,两个像素,每个像素16位,即pixel_bit=2;
CSI主要的作用就是将缓冲区中采集到的数据送到指定的内存区中,采取DMA传送方式,后来通过配置寄存器,实现了DMA传输,发现DMA控制方式如此简单,即首先允许DMA请求,然后设定RXLEVEL,当达到设定值时,就会发出DMA请求,进行数据传输。把数据传到指定内存区域后,然后通过串口打印出来。发现,当串口需要打印约1M的数据,是需要一个漫长的等待时间。
最后,就是成像问题了,这里,要感谢师兄,帮我完成成像问题,尤其是在成像编码上,花费了师兄大量的时间和经历,再次向他表示感谢。
做法是将采集到原始数据放到师兄做好的软件中,将数据的比特流转换成字符流,然后在网上下载的软件上进行成像,这里用的软件是RAW PLAYER,选择UYVY格式图片,就可以成像了。
在成像上也走了很多弯路,从一开始下载软件,到将YUYV格式转换成RGB格式,在3530板子上成像,再到最后在PC上成像,也花了近一个星期的时间。不管怎样,各种方法都试过,才能比较出优劣,CMOS的测试告一段落,当然还有些剩余的工作需要继续做,比如测试中断和复位引脚。对CMOS的测试暂时写到这里,算作小结。