在对两个USB数据采集电路板进行数据采集,使用一台带win7-64位系统的电脑无法同时对两个设备进行数据采集,当名为VNIR这个USB3014-FX3设备进行数据采集后,插入名为SWIR的USB3014- FX3设备,点击开始采集,VNIR就会无法继续再进行数据采集,仿佛是被SWIR占用的传输通道而被阻塞。我采用的是同步FIFO和自动DMA通道,通过不断的进行指令下发实现连续不断的数据采集,两个设备的主机程序相关代码如下:
VNIR-FX3设备
//开始数据传输
BYTE* pContext0=pBulkEpIn0->BeginDataXfer(pBulkBuf0,nBufSize0,&oRdOvLap0);//overlapped window os锁定该内存块资源,其他线程无法干扰
//等待数据传输结束
if(pBulkEpIn0->WaitForXfer(&oRdOvLap0,pBulkParam0->nTimeout0))
{
if(pBulkEpIn0->FinishDataXfer(pBulkBuf0,nBufSize0,&oRdOvLap0,pContext0))
{
pVdeioshow0->OnDataReady0(nBufSize0);//通知视频显示窗口数据准备完毕
}
}
//创建数据传输线程
m_pBulkThread0=AfxBeginThread(BulkXferRead0, &m_oBulkParam0,THREAD_PRIORITY_HIGHEST);
SWIR-FX3设备
//开始数据传输
BYTE* pContext1=pBulkEpIn1->BeginDataXfer(pBulkBuf1,nBufSize1,&oRdOvLap1);//overlapped window os锁定该内存块资源,其他线程无法干扰
//等待数据传输结束
if(pBulkEpIn1->WaitForXfer(&oRdOvLap1,pBulkParam1->nTimeout1))
{
if(pBulkEpIn1->FinishDataXfer(pBulkBuf1,nBufSize1,&oRdOvLap1,pContext1))
{
pVdeioshow1->OnDataReady1(nBufSize1);//通知视频显示窗体数据准备完毕
}
}
//创建数据传输线程
m_pBulkThread1=AfxBeginThread(BulkXferRead1, &m_oBulkParam1,THREAD_PRIORITY_HIGHEST);
特殊情况:
当我先插VNIR FX3设备建立数据采集通道并开始采集后,可在三十秒内插入SWIR FX3设备建立数据采集通道并开始数据采集时,VNIR是有可能继续进行数据采集而不会出现无法采集数据的问题。即使成功建立了两路数据采集。当加入基于UVC的相机时,相机速率在250MBps,只能持续采集200秒左右,VNIR-FX3就会无法采集;当相机速率降至一半125MBps时,VNIR-FX3和SWIR-FX3可以持续采集半小时左右,然后就自动出现无法再采集数据的问题。这种特殊情况是基于两个FX3设备使用相同的端口号如0x81。当如果使用不同端口号,则点击第二个FX3设备开始数据采集时,第一个正常进行数据采集的FX3设备就直接出现无法采集数据的问题。
打开Stearmer软件是无法同时加载两个设备的,即使USB control center软件已经将两个FX3设备都加入列表,但是在steamer软件的测试速率页面上,端口endpoint无法同时加载两路不同端点号如0x82和0x83的FX3设备,也确实是只能加载一个FX3设备,所以之前论坛官方技术支持人员建议参考steamer的源代码,该软件本身好像就无法实现。针对这些测试结果带来的问题,想寻求相关技术支持,咨询出现此类的问题的根本原因以及官方是否能提供进行对两路FX3设备进行数据采集的技术方案,谢谢。
已解决! 转到解答。
这两个设备的Bulk in endpoint 都是0x81,固件一样的:
同时bulk in两个设备, 注意两个设备的速度:
同时对一个设备bulk in,可以看到速度明显只有一半:
你好,你这个操作是bulk out,我的全是bulk in的操作,是要进行数据采集,bulk in其实连streamer测试都无法做,这个我也不清楚为什么不能实现,我自己的软件是可以做采集数据测试的。另外在插入两个USB后,每次都只能加载一个端口号FX3设备。
首先分析你提供的测试图,bulk out 是从主机分发数据到FX3设备。在系统分发数据时,比如下图我的实际只插入了一个USB-FX3,但是同样是可以打开两个steamer软件窗口做测试,也就是说你虽然打开了两个窗口软件,但肯定是只分发到一个FX3器件里去了,下面通过测试实验证明该判断。
我也做了插入两个相同端口号的FX3设备,也就是跟你一样的测试。这些都能正常跑数据,但端口号都是一样的所以根本无法证明你同时分发到两个FX3设备。因为我的设备端点号作了区分,但是无法同时加载两个不同端口号的FX3设备到steamer软件中。单独对每个USB-FX3进行测试是可以的,但是同时对两个USB-FX3测试就出问题。测试图证明无法做相应对不同FX3器件同时从主机发送数据到不同FX3设备,因为点击第一个插入的FX3设备,程序会出现错误,再点击第二个已经插入的FX3设备进行测试是可以的。一个一个测试,也会使得程序崩溃。测试采用0x00F1 01端点和02端点。
最后,我希望能得到根本的原因来解释说明两个USB-FX3进行数据收发的传输约束机制,尤其是一个主机同时对两个FX3设备进行数据采集的机制或者实际应用案例。谢谢。
书本对端点的说明
插入一个USB-FX3设备情况
插入两个USB-FX3设备情况
先后插入USB-FX3设备并立刻开始测试的情况01崩溃,02端点正常且打开只加载02端口号一个
先插入两个USB-FX3设备之后,再开始测试的情况,第一次打开的steamer软件测试本来正常的再点击开始会崩溃,第二次打开steamer软件工作正常,但列表有且只加载02端点号
这两个设备的Bulk in endpoint 都是0x81,固件一样的:
同时bulk in两个设备, 注意两个设备的速度:
同时对一个设备bulk in,可以看到速度明显只有一半:
你好
1、能否分析一下为什么我用这个streamer软件不能实现,毕竟这只是对FX3设备的自测试,用的也是同样的固件程序。
2、然后烦请提供不同端口号的测试图,请测试久一点看看,因为看到有丢包的问题。
3、如何解释cmos相机速率加快会导致无法采集FX3器件数据的问题。
谢谢
我用的软件是1.2版本的SDK中的streamer
我用的固件是USBbulksourcesink,SDK版本是1.3.4
实际就是在一个正常的PC上两个USB口设备的传输都是独立的,我也通过测试证实了这个问题。所以这里我觉得并不是我们设备的问题,而是你的PC的问题。我觉得这里是你PC的根hub的速度限制了两个设备的最大速度。你可以下载一个USB Device Tree Viewer看一下。
关于丢包的问题,这里是采用bulk transfer在测试最大传输速度,丢包是不可避免的。单独测试一个设备也会有偶尔有丢包。
你好,我用的是同步slavefifo的固件,这个会有影响吗?
我没有fpga,没有办法用slavefifo做测试,你可以试一试
我这次测试了半个小时,也没有丢包
我用的自己的板子使用bulksourcesink,SDK版本是1.3.4是可以实现你的示例结果的,但是1.2版本的sdk不行,然后别的固件不行包括SlaveFifoSync不能采集数据只能bulk out由主机分发数据到电路板上。一个是USB2.0和另一个是USB3.0
这个streamer不能直接适用于slavefifo这个固件,但是这已经证实了两路3014的数据采集是不会干扰的。
你好,我的工作证明是有影响的,这个影响不是说数据互相乱了,我的采集数据显示数据都是正常的,就是会停止采集,steamer证明针对bulksourcesink固件这种传输模式不会有问题,不过我也看了这种固件 代码纯粹是用于测试,并不能证明slavefifo和dma的组合传输方式不会影响彼此正常的工作,现在的疑惑就是为什么这个不行,尤其是加入了cmos后影响尤为明显。
slavefifo和自动DMA
您提到的hub根速率的问题,我在我那个数据采集机箱就是有四个USB3.0接口测试看,速率都是正常的,跟你那个测试结果表现一样,所以限速的问题是没有的。现在我很想从内部传输机制上去理解问题的原因。
你好,这个问题无解了吗?