我有一个Windows TCL应用程序,通过USB端口控制电路板上的单个芯片。 我在bitbang模式下使用FTDI驱动程序。 Bitbang模式使电路板上的USB设备像PC并行端口一样工作。
假设电路板上的芯片是一个二进制计数器。 如果我想使计数器递增,我会写一连串的字节到USB端口,这将导致芯片计数。
如果我希望计数器以某种速率计数,我会以某种已知的速率发送这些字节。
由于数据是二进制数据,因此我将端口configuration为二进制模式。 我将几个控制字节(称为一个块)写入一个缓冲区,然后刷新该端口,以便将数据发送到USB端口(因此它可以在我想要的时候进行计数)。 写完之后,我等待一段时间,然后重新写入块。
我知道这不会是完美的时间, 那并不重要; 这次我只需要closures。
我的问题是,数据块之间的传输速度不到2ms。 (我不是在谈论数据块内的数据传输速率,我正在谈论块之间的最小时间。)另一种说法是,似乎是服务任何缓冲区刷新的最小时间(实用)大小约为2mS。
我用o-scope观察数据变化来测量2mS。 这与我放入代码的定时器一致。
有什么办法可以缩短这个间隔时间吗? 我不知道它是从Windows获得的实际执行时间片,还是缓冲区传输到USB的队列处理间隔。 有没有办法找出是什么造成了操作系统的延迟?
有没有办法来控制这个时间间隔。 这将是很好的得到这个500uS而不是2mS。
只是希望有人能提出一个build议。
谢谢
几个月前,我还在为这个问题苦苦挣扎。
通过检查USB流量,结果发现,当处于bitbang模式时,FTDI驱动程序不停地轮询FTDI芯片是否有新的可用数据,造成总线上的放置操作之间的延迟,并且当多于一个的时候占用大量的CPU资源FTDI板连接到同一台PC。
这种行为在Windows和Linux中都是一致的。 在Windows中,您可以使用Wireshark和USBPcap进行检查 。
在我的情况下,我在FTDI板上有一个FPGA。 将更多时间敏感的任务卸载到FPGA中,并批量发送命令。
您实际上正在进入FTDI设备的轮询间隔。 我相信基于我的经验,它默认为2毫秒,但我的快速谷歌搜索没有定论。 我确实发现,他们的驾驶员支持的轮询间隔是1,2,4,8,16或32毫秒。
这是FTDI驱动程序/ USB规格限制,而不是Tcl甚至Windows问题。 您可以将驱动程序配置为将轮询间隔降低到1毫秒,但我认为这可能是您可以做的最好的。