jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
阅读:4948回复:22

68013读取sensor图像时错帧问题产生的原因,分析及深入探讨!

楼主#
更多 发布于:2007-01-10 16:36
  一,系统组成
在我的系统中,采用68013和OV7141连接,采用SLAVE FIFO模式,信号连接如下:
PCLK接68013的IFCLK
VSYNC接PA0,使用中断INT0
HREF信号与一IO口相与接SLWR
68013的SLOE,SLCS接地
68013的PKTEND用作IO口,即PA6
FIFOADDR0与FIFOADDR1接地是用EP2

二,读写数据操作方法1:使用VSYNC中断
1,初始化时将HREF(即SLWR信号)的控制IO口置高,这样数据可进入SLAVE FIFO并且填满4x512的缓冲区
2,上位机发送读取数据的VENDOR命令,固件接收到命令后关闭HREF的控制IO,即关闭SLWR信号的输入,禁止数据写入,给应答是命令返回,同时打开INT0中断,一旦有中断触发说明帧起始信号到来,在中断中打开打开控制HREF信号的IO,使SLWR信号获得输入。
3,读取数据命令返回后立刻发送读取2x512数据的READ命令,考虑到此时端点中有4x512的无用数据,因此先读出2个包的数据腾出部分缓冲区,允许新的数据写入。
4,在3返回后发送读取(2x512+640x480)数据(图像大小640*480)的READ命令,这样去掉前面的2x512数据,后面的640x480数据即为完整的一幅图像。

三,读写数据操作方法2:查询PA0
1,发送读取数据的VENDOR查询命令,固件接收到命令后关闭HREF信号的控制IO,同时使用while循环查询帧起始信号,一旦查到立刻让查询命令返回
2,1完成后立刻发送(4x512+640x480)数据的READ命令,那么去除前面的4x512的无效数据,后面的即为完整的一幅图像。

四,方案比较:
方案1:由于ezusb的驱动在读取空端点是会死掉,所以之前先让端点中有数据,这样不至于是的READ命令死掉,基于这个考虑产生了方案1,理论上端点中只要存在1个数据包READ命令就不会死掉,所以分两次读取数据的方法能在较大程度上保证在帧头处不会丢失数据,只要帧头出不丢失数据,那么出现错帧几率(如图像分屏,花屏)就会非常的小。

方案2:由于我们利用的机制是从VSYNC开始到第一行数据产生有大约11x640个时钟周期的时间,只要在这段时间内腾出端点中的一部分空间让新的数据进入,那么接收到的一帧图像就是完整的!所以这是个最简单的数据接收方法。

五,方案1,2在实际使用中出现的问题:
方案1:
1,最致命的问题,我发现在第一次读取时并没有按预想的读到2x512个数据,而是很奇怪的768,68等等不满包数据,这样直接导致下一次读取出现错误。
2,经过进一步验证发现,这种现象最少会出现两次,最多四次,前2-4次读的数据都是不连续的数据,是由若干个不满包组成的数据,这样导致我们的最初想法根本不能实现!我在怀疑是否是PKTEND导致了这样的现象?

方案2:
1,由于11x640个时钟周期的时间很短,一旦上位机繁忙,就会来不及将端点腾空,新出现的数据就会丢失,直接导致图像的分屏错帧。
2,我想对于较快的机器错帧几率会较低,但不可能完全避免。

上述是我在实际使用68013设计Sensor图像采集系统时遇到的问题以及调试思路
不知道诸君是否有更好的思路以及方法
还望不吝赐教!

欢迎MAIL探讨:
邮箱:jinghuiren@163.com
MSN:renjinghui@163.com(较忙,可能不能时常挂着)
amygirl
驱动牛犊
驱动牛犊
  • 注册日期2006-11-07
  • 最后登录2008-03-06
  • 粉丝0
  • 关注0
  • 积分360分
  • 威望37点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-01-10 21:28
jinhuiren大侠也会有有问题。。。
我层次不够,只能帮顶。。
是不是由于驱动的原因,所以读空的fifo会死在那里?由于会死在那里,所以选择在fifo中装一定的数,再读图象的数据?
在做试验的时候,我也碰到过读数不联系的情况,不过,后来把时钟改到30mhz就好了,期待给出原因的大侠们
jinhuiren是连图象压缩算法一起做么?
驱网无线,快乐无限
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-11 13:24
谢谢回复
是的,就是因为FIFO空会导致读数据死掉,所以才在端点中装一定的无用数据
不是,我的设备纯粹读取一幅640x480大小的原始图像,中间不做任何的处理。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-01-12 17:33
唉,求人不如求己啊,看来还得靠自己
经过若干次实验后发现
是PA6导致了方案1的失败,因为PA6和PKTEND复用,当使用PA6时(作为IO口)会导致端点中的数据生效!这一点是导致出现不满包的根本原因。一旦禁用了这个管脚,不满包现象立马消失。
呵呵

谨以此文为大家提供一些参考吧。
xuyingpin
驱动牛犊
驱动牛犊
  • 注册日期2002-11-25
  • 最后登录2008-06-29
  • 粉丝0
  • 关注0
  • 积分180分
  • 威望18点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-01-12 19:21
我大概知道成功的门在哪里,但有合同我不能说。
可以提示一点:你参考的是ominivision的demo板。Int0不是直接使用,是在里面修改了intrdy这个bit。
http://xuyingpin.blogcn.com
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-01-15 09:16
谢谢提醒,intrdy用于GPIF模式,我用的Slave FIFO模式
当初由于GPIF调了一段时间调不出来改了模式,目前看来应该问题不大了。
choce
驱动牛犊
驱动牛犊
  • 注册日期2006-04-24
  • 最后登录2007-08-02
  • 粉丝0
  • 关注0
  • 积分590分
  • 威望60点
  • 贡献值0点
  • 好评度59点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-02-08 16:44
我在跟楼主作同样的事情,只是我用的是samsung的sensor,而且是130万像素的,所以我很是担心由于数据量太大而ez-usb fx2处理不过来,看楼住的水平确实高的很呢,希望有机会请教!
SEIZE THE DAYS!
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
7楼#
发布于:2007-02-08 21:57
用户被禁言,该主题自动屏蔽!
usbsolution
驱动牛犊
驱动牛犊
  • 注册日期2005-09-20
  • 最后登录2011-11-05
  • 粉丝0
  • 关注1
  • 积分155分
  • 威望17点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-02-10 01:57
请问金大侠,你的fifo状态判断是什么,按照你的说明,好像没有?如果真的是这样的话,我担心你的两种方式都会在pc带宽不够的时候丢数据。因为你并没有控制ov的何时写,而是ov一直在写。那么满了怎么办。还是你另有高招,还请指教。
来吧!www.usbsolution.com
driversources
驱动牛犊
驱动牛犊
  • 注册日期2007-02-11
  • 最后登录2007-07-27
  • 粉丝0
  • 关注0
  • 积分140分
  • 威望15点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-02-11 14:36
1. 做好预先的准确的不同带宽条件下属据传数量的计算,实时取数据,让fifo overflow不发生(基本上不可能)。如果发生,则接受的数据内容不完整,drop it.
2. 设置fifo overflow标志位.
driversources@126.com
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-02-12 09:16
drivresources:
1,您的方法可以几乎完全避免错帧情况,但问题是,如何计算不同带宽条件下的数据量计算呢?
2,你的意思是不是在TD_Poll()中不断查询FIFO的满标志,一旦满则说明会错帧,在数据传输完成后发命令读取一下这个标志判断一下,因为在传输过程中是没法判断的
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
11楼#
发布于:2007-02-13 10:11
jinghuiren大虾:
   你的帖子“68013读取sensor图像时错帧问题产生的原因,分析及深入探讨!”中:
============================================================

二,读写数据操作方法1:使用VSYNC中断
1,初始化时将HREF(即SLWR信号)的控制IO口置高,这样数据可进入SLAVE FIFO并且填满4x512的缓冲区
2,上位机发送读取数据的VENDOR命令,固件接收到命令后关闭HREF的控制IO,即关闭SLWR信号的输入,禁止数据写入,给应答是命令返回,同时打开INT0中断,一旦有中断触发说明帧起始信号到来,在中断中打开打开控制HREF信号的IO,使SLWR信号获得输入。
3,读取数据命令返回后立刻发送读取2x512数据的READ命令,考虑到此时端点中有4x512的无用数据,因此先读出2个包的数据腾出部分缓冲区,允许新的数据写入。
4,在3返回后发送读取(2x512+640x480)数据(图像大小640*480)的READ命令,这样去掉前面的2x512数据,后面的640x480数据即为完整的一幅图像。

三,读写数据操作方法2:查询PA0
1,发送读取数据的VENDOR查询命令,固件接收到命令后关闭HREF信号的控制IO,同时使用while循环查询帧起始信号,一旦查到立刻让查询命令返回
2,1完成后立刻发送(4x512+640x480)数据的READ命令,那么去除前面的4x512的无效数据,后面的即为完整的一幅图像。
=============================================================

请问在二中为什么要先读读出2个包的数据腾出部分缓冲区,允许新的数据写入?

    在三中为什么去除前面的4x512的无效数据?

我对端点的多级缓冲和提交不是很理解,为什么有时要dump 或 skip?
mcu_boy
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-02-13 15:46
因为为了避免程序死掉,之前4缓冲的端点都是满的,里面的数据是无效数据
先读出两个是为了让后续有效数据能够写入缓冲区
丢掉4x512数据是因为这些数据是没用的。
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
13楼#
发布于:2007-02-13 17:08
请问您说的读,用什么方法?

写epxbhl吗?我在多缓冲的问题上很糊涂
mcu_boy
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
14楼#
发布于:2007-02-13 17:17
请问短包的提交是不是一定要用pktend pin啊,用pf行不? 软件查询然后复位fifo
mcu_boy
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-02-14 14:35
提交短包也可以用软件控制的方法。jinghuiren大哥的这一思路还是很有新意的。我觉得在每次打开EP2端点前对EP2的buffer进行reset就可以清空buffer,然后结合VSYNC信号用好HREF同步信号作为WR允许信号就可以直接都取640*480的数据了,而省去了多发几个读2*512数据命令的执行。关键是在检测到桢同步信号之前做好所有接收数据的准备,一旦确认同步信号来了就允许EP2工作就可以准确接收数据了
bennydice
驱动牛犊
驱动牛犊
  • 注册日期2006-09-20
  • 最后登录2008-01-10
  • 粉丝0
  • 关注0
  • 积分470分
  • 威望48点
  • 贡献值0点
  • 好评度47点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-02-20 13:32
请问怎么使用INT0啊  能详细讲讲吗?
要开哪几个中断位啊?


谢谢~!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-02-24 20:33
引用第15楼reanchear2007-02-14 14:35发表的“”:
提交短包也可以用软件控制的方法。jinghuiren大哥的这一思路还是很有新意的。我觉得在每次打开EP2端点前对EP2的buffer进行reset就可以清空buffer,然后结合VSYNC信号用好HREF同步信号作为WR允许信号就可以直接都取640*480的数据了,而省去了多发几个读2*512数据命令的执行。关键是在检测到桢同步信号之前做好所有接收数据的准备,一旦确认同步信号来了就允许EP2工作就可以准确接收数据了


这是根本的解决办法,但问题是,如果端点为空,主机读就会pending而不能恢复,这个问题比较麻烦
不过可以再试试。
pi-ai
驱动牛犊
驱动牛犊
  • 注册日期2006-02-07
  • 最后登录2010-04-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望25点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-03-12 21:38
我是使用GPIF传送的,lz为什么放弃这种方式呢?小弟求教了
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-03-13 10:36
很简单,因为当时时间紧,GPIF没调出来,所以飞了线改成Slave FIFO,我习惯用SLAVE FIFO,基本没用过GPIF
汗。。
上一页
游客

返回顶部