以已知速率向USB端口发送数据

时间:2013-11-15 01:19:52

标签: windows tcl

我有一个Windows TCL应用程序,通过USB端口控制板上的各个芯片。我在bitbang模式下使用FTDI驱动程序。 Bitbang模式使得板上的USB设备就像PC并行端口一样。

让我们说板上的芯片是一个二进制计数器。如果我想让计数器增加,我会在USB端口写一系列字节,这会导致芯片计数。

如果我希望计数器以某种速率计数,我会以某种已知速率发送这些字节。

由于数据是二进制数据,因此我将端口配置为二进制模式。我将几个控制字节(称之为块)写入缓冲区,然后刷新端口,以便数据发布到USB端口(因此它可以在我需要时进行计数)。写完之后,我等待一段时间,然后再次写入块。

我知道这不会是完美的时间;没关系;这次我只需要关闭。

我的问题是数据在块之间的传输速度不会超过2mS。 (我不是在谈论块内数据的传输速率,我说的是块之间的最小时间。)另一种说法是,似乎是服务刷新任何缓冲区的最短时间(实际)尺寸约为2mS。

我通过用o-scope观察数据变化来测量2mS。这与我在代码中添加的计时器一致。

有没有办法缩短间隔时间?我不知道它是否是我从Windows获得的实际执行时间片,或者是否是缓冲区传输到USB的队列处理间隔。有没有办法找出导致操作系统延迟的原因?

有没有办法控制这个间隔。把它变成500uS而不是2mS会很棒。

希望有人可以提出建议。

由于

2 个答案:

答案 0 :(得分:1)

几个月前,我正在为这个完全相同的问题苦苦挣扎。

通过检查USB流量,结果表明,当处于bitbang模式时,FTDI驱动程序不断轮询FTDI芯片以获取新的可用数据,从而导致总线上的put操作之间的延迟并占用大量CPU资源。不止一个FTDI板连接到同一台PC。

此行为在Windows和Linux中都是一致的。在Windows中,您可以使用WiresharkUSBPcap进行检查。

在我的情况下,我在FTDI板上有一个FPGA。将更多时间敏感的任务卸载到FPGA并批量发送命令对我有用。

答案 1 :(得分:1)

您实际上正在进入FTDI设备的轮询间隔。我相信根据我的经验,它默认为2毫秒,虽然我的快速谷歌搜索没有定论。我确实发现它提到他们的驱动程序支持的轮询间隔是1,2,4,8,16或32毫秒。

这是FTDI驱动程序/ USB规范限制,而不是Tcl甚至是Windows问题。您可以配置驱动程序将轮询间隔推迟到1毫秒,但我认为这可能是您可以做的最好的。