我正在使用32位AVR微控制器(AT32UC3A3256)与高速USB支持.我想定期将数据从我的个人电脑传输到设备(不确认数据),所以完全像USB音频接口,除了我想要发送的数据不是音频。这里描述了这样一个接口:http://www.edn.com/design/consumer/4376143/Fundamentals-of-USB-Audio。
我对USB 等时传输有点困惑。我明白单个传输是如何工作的,但是如何和什么时候是下一个后续传输计划?我想要一个连续的数据流,这个数据流是提前计算出来的,但是流的延迟最小,没有中断(除了偶尔丢失的一些数据)。据我理解,Windows不是实时操作系统,所以我认为传输不应该每隔x毫秒就有一个计时器,而是使用中断/事件?或者,缓冲区需要不断地填充尽可能多的可用数据?
我想我的问题仍然是关于USB的概念,而不是与代码相关的概念,但是如果有人想看我的代码,我正在测试和修改Atmel Studio的ASF框架中的"USB类“示例,其中包含AVR的固件源代码和Windows的源代码。Windows示例程序在提供的驱动程序中使用libusb。
发布于 2014-07-16 16:52:55
斯蒂芬-
你说“完全像USB音频”,但要小心!USB类非常非常复杂,因为它实现了一个闭环伺服系统来建立PC和音频设备之间的长期同步。在您的应用程序中,可能不需要所有这些。
为了更好地解释长期同步:一端的音频编解码器(例如USB耳机)可能以48 the的名义采样率运行,而另一端的音频文件(例如PC)可能设计为每秒提供48 000个样本,但PC和耳机的运行速度永远不会完全相同。迟早会出现缓冲区溢出或不足的情况。因此,USB音频类实现控制管道以及音频管道。控制管用于在一端,通常是设备端(如耳机),通过轻微的加速或减速,以避免数据丢失。这就是为什么音频设备类产品的USB描述符非常复杂的原因。
如果您的应用程序可以容忍数据从PC机传送到AVR的速度上的一个轻微错误,您可以免除闭环伺服。这使得事情变得简单多了。
当流数据使用等时管道时,您完全正确地假设需要长期缓冲。一个单一的等时传输是没有意义的-你也可以使用散装管道。同步管道的全部原因是处理数据流。所以,就像你说的,很多前瞻性缓冲必须建立起来。
我使用LibUsbK在产品特定的应用程序中进行iso传输,这些应用程序不适合任何预先设想的USB类。在libusbk有相当好的文件可用于iso传输。简而言之--您决定每个数据包的字节数和每次传输的数据包数。你决定要填充多少个缓冲区(我用了5个),并为libusbk驱动程序提供了启动程序的全部。然后,当每个缓冲区被驱动程序清空时,您会得到回调,这样就可以用新的数据填充它们。这对我来说很好,即使我有尴尬的抽样率要处理。在我的例子中,我设置了一组21个数据包,其中20个包含40个字节,而第21个包含44个字节!
希望这能帮上忙-托尼
https://stackoverflow.com/questions/24724987
复制相似问题