MCIM驱动DH9801实现CVI输出

碰到一个需求,希望将4个摄像头视频集成到一路CVI输出(我也没有办法,人家的设备上只有一个CVI输入接口,想要连接额外的摄像头,只能通过CVI信号输入),于是就上手开始调试DH9801,本来打算是三周时间连硬件带软件全部调试完成,但是中间碰到一个糟心的地方,前后花了一个半月才调通。

测试模式工作不稳定

DH9801的接口板是由合作方制作的,焊接完成后我拿到板子跟MCIM连接到一起,进行测试。DH9801的驱动程序是由原厂的工程师提供,所以不需要查看PDF,也不需要研究DH9801的工作原理,工作配置和杂七杂八的东西。同时原厂还提供了一个二十来页的的调试说明手册,这个手册很有帮助,虽然很简单,但是官方能够提供这么一个简单的文档,基本上就能把芯片的工作说清楚,让使用者很快把芯片用起来。还提供了一个调试说明,以流程图的形式指导使用者怎么对芯片进行调试,不过这个流程图基本没什么用处。因为如果开发人员没有做错什么事情的话,那一定完全不需要这个流程图,如果开发人员做了错误的事情,那么一定不会按照教科书里的样式出现错误。

上电,外围信号检查一遍,没什么问题,就修改FPGA逻辑,按照BT1120时序输出720P时序。调了一天并没有图像输出,把可能出错的地方都检查了,就回过去做芯片自检测试,芯片有一个test pattern。调到test pattern输出后,CVI接收器能够显示彩条图像,但是图像持续的抖动。心想测试输出都不稳定,那正常信号没输出是正常的,于是开始各种方法检测test pattern,包括想办法调整晶振信号质量(换好晶振,换成fpga输出时钟),结果test pattern始终要持续的抖动。

很闹心,在调了两三天没有结果的情况下。我做了一个判断:这个芯片的test pattern就是这个怂样,芯片没有问题,在正常工作(这个判断后续证明是对的)

BT1120时序驱动无输出

假设芯片是正常的,也没有问题,那就回到先前的地方,继续调BT1120时序。BT1120时序网上到处都能找到,但是关于行时序,我发现很多文档说的跟标准不一样。标准的行时序是:
` h_blank | SAV | h_active | EAV 但是很多地方说的实现方法是 EAV | h_blank | SAV | h_active 这样就会导致,在Vsync信号变化的那两行,EAV,SAV实现不一样,猜想了一下后端的工作原理,觉得其实这两种实现应该都可以工作,只不过前者是Vsync,Hsync同时有效,Vsync滞后Hsync无效,后者是Vsync提前Hsync有效,Vsync,Hsync同时无效`。但是为了保险起见,那就不按标准实现,按网上的说法实现吧,修改之后,还是没有输出。

怀疑DH9801不能容忍时序抖动

理轮上,DVP信号,是靠Hsync,Vsync来做时序同步的,因为 HBlank,VBlank 的长度有细微的变化都是不影响工作的,包括摄像头驱动,甚至图像采集了一半时序停了也能正常工作(只要不触发超时出错)。但是反复看过几遍datasheet后,开始怀疑DH9801芯片对时序极度敏感。于是给DH的工程师发了邮件,同时修改BT1120时序,把中间所有的时序抖动都去掉了。

然后CVI接收器接收到了正常的图像画面,DH工程师也回了邮件“DH9801严格按照手册中的时序工作”

做了一个测试,在Hsync中多加入1,2个pclk,发现图像抖得很厉害,再增加一些额外的时钟周期,就不能正常工作接收到图像了。

Vsync之间最多可以插入200个pclk

为了系统有最小的视频时延,不增加额外的视频时延,在MCIM中并没有采取帧缓存同步的方式,因为一使用帧缓存方式来做同步,就会额外增加40~80+ms的延时(看缓存工作方式)。MCIM中使用的是FIFO同步,MCIM会紧跟着最慢的那个摄像头的时序来做输出,保证额外的时延<40ms。那就意味着MCIM没有办法跟DH9801的时序严格同步,而是很大可能会比DH9801的时序慢一点点。计算了一下,按照市面采购晶振+-5pps的精度。720P\25fps@74.25Mhz的摄像头,每一帧的时序误差应该是+-150pclk。

必须想办法在驱动DH9801的BT1120时序中插入抖动,否则没法工作。于是测试在帧与帧之间插入抖动时间,测试的结果是,如果帧与帧之间插入不大于200pclk的时隙,则DH9801仍然正常工作,但是图像可能感觉会产生轻微的偶尔的不太能够感觉出来的抖动。但是如果帧与帧之间插入400+pclks,那么CVI接收器接收到的图像就会明显的跳动,影响观看了。

功能完善

解决时序抖动的问题之后,又增加了图像切换的功能,终于完成了MCIM驱动DH9801输出CVI信号的工作。记录一下,因为DH9801的接口时序 设计有点 出乎意料,想一想,当初做设计的那个前端工程师应该完全没有考虑过摄像头图像的时间偏差和同步的问题,就这么定版交付了。 (这句话是错的)

201804 补充

上面这段话是错的。

后来我又调试了AHD输出(NVP6021),刚开始没有仔细思考这个问题,只是觉得CVI设计有问题, 后来再调试NVP6021的时候也发现AHD信号同样对输入时序极其敏感。脑子里郁闷了两天之后想起来以前调试CVI的经验,再想想电视信号, 我就明白了。 CVI跟AHD都是模拟信号, 异步信号,必须要严格的时序敏感,才能保证接收端用一个存在偏差的时钟,能够准确的采样出在传输线上多少产生了畸变的信号波形。模拟不熟悉,一直在用数字的习惯去思考模拟信号

后续在MCIM上增加了帧滑动机制,摄像头如果时钟慢, 那么MCIM会若干秒钟自动重复一帧图像, 如果摄像头时钟快,那么MCIM会若干秒钟自动跳过一帧图像。输出时序不用再增加时序抖动来匹配前端摄像头输入的时钟偏差了,也就这解决了这个时序敏感的问题。

视频系统通过插帧丢帧来同步时钟快慢问题是基本方法,为啥最早没这么做,因为懒,当初觉得插入时序抖动是最省事的方法,于是就这样用了一年多。