1

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

假设板上的芯片是一个二进制计数器。如果我想让计数器递增,我会向 USB 端口写入一系列字节,以使芯片计数。

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

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

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

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

我用 o-scope 观察数据变化测量了 2mS。这也与我在代码中放入的计时器一致。

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

有没有办法控制这个间隔。让它达到 500uS 而不是 2mS 会很棒。

只是希望有人可以提出建议。

谢谢

4

2 回答 2

1

几个月前,我一直在努力解决同样的问题。

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

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

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

于 2013-12-04T11:38:11.883 回答
1

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

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

于 2013-12-05T00:06:25.037 回答