我来说说究竟什么是“USB异步传输” (Asynchronous USB)吧

转载 2012年03月26日 11:39:42

讨论贴:

http://www.erji.net/read.php?tid=767228&fpage=0&toread=&page=1

参考资料:

http://www.usbdacs.com/Concept/Concept.html

A:

废话不多说,直奔主题吧。

对于USB音频传输,有一个规范,叫做“标准USB音频规范”。这个规范有什么用处和好处?
它的用处就在于,实现了以USB接口实时传输音频信号。(汗)
它的好处就在于,直接集成在WINDOWS系统内,也就是说,只要符合这个规范的USB音频产品,WINDOWS系统内的集成驱动就能直接支持,而不用厂商另外开发驱动程序。相反,如果某款USB音频产品有自己的驱动程序,那么它就是不支持这个规范的。(但不表示这个产品就不好,自己开发驱动本身是有研发实力的表现。)

在这个标准USB音频规范下,有三种传输模式:同步、自适应,和异步。
同步:标准的同步模式其实很少见,基本不太用到的,这里省略。
自适应:大多数的产品(比如TI PCM270X、PCM290X系列)都是用的自适应传输模式。
异步:这里的异步,才真正是AYRE QB9所大肆宣传的异步USB传输模式。
所以严格来说,所谓“异步USB传输”,有个大前提,就是在标准USB音频规范下而言。

那么自适应传输模式和异步传输模式到底有何区别呢?
这里先要了解一下USB音频处理的大致流程。电脑通过USB接口将音频数据流传递给DAC上的USB接收芯片,USB接收芯片一边接收数据,一边合成时钟信号,然后转化为标准的I2S或者SPDIF信号,再传递给后面的数据接收芯片,再之后的流程与一般的DAC就没有分别了。
而在这个过程中,影响USB音频音质的关键,就是USB接收芯片所合成的时钟信号。

在自适应模式下,USB接收芯片,在合成时钟信号的过程中,会根据USB传输速率的变化,对时钟信号进行实时的调整。也就是说,在这种情况下,USB传输速率的变化,会直接影响到合成的时钟信号。
举个夸张点的例子:比如现在播放一段44.1K的音频,当然就要求USB接收芯片合成一个44.1K的时钟。而这个44.1K的时钟,对应于USB传输的速率,比如,胡乱说一个,是200个数据包每秒。
也就是说,如果要让USB接收芯片稳定的合成44.1K 的时钟,USB传输速率,也必须稳定在200个数据包每秒。
但现在的问题是,USB传输的速度不可能这么稳定,也许这一秒传递了200个数据包,而下一秒,突然增加到了400个。而这个时候,USB接收芯片会怎么做?它会把实际合成的时钟,提高到88.2K。如果再下一秒的USB速率又变为100个数据包每秒,那么相应的合成时钟就变成了22.05K。当然,这是一个极端夸张的例子。
可是为什么USB接收芯片要这么做?很简单。因为如果USB接收芯片只是单纯的合成44.1K的时钟,每秒处理200个数据包,那么一旦真的收到了400个或者100个数据包,缓存就会溢出,或者断流。
所以,在自适应模式下,USB接收芯片所合成的时钟信号,是随USB口的传输速率实时变化的,传输速率是主,时钟信号为从,USB传输速率的变化直接影响到合成的时钟信号。那么可想而知,这个时钟信号的JITTER有多大。从而你也可以理解,为什么有人会说,换质量好的USB线能提高音质。

那么异步传输是怎么工作的呢?说起来更简单,USB接收芯片现在只需要稳定的合成44.1K的时钟,也就是说,现在这个时钟与USB传输速率无关了。
可是如果这样的话,缓存的问题怎么解决?答案是,软件控制。通过一套软件,根据缓存的负载情况,实时的控制USB口的传输速率,从而保证缓存不会溢出或者断流。在这种情况下,时钟信号为主,传输速率为从,时钟信号不受传输速率变化的影响,理论上这时的JITTER源,就只有工作晶振本身的误差了。

这个方案,就是AYRE QB9所大肆宣传的“异步USB传输”模式。它的实现方式,就是通过TAS1020B这块芯片,配合本地的6M晶振,还有关键的控制传输速率的固件,来完成。
而TAS1020B这块芯片,是一块可编程的芯片,并不是说用了这块芯片就一定是异步USB传输。DAC1 USB,DA11用的也是这块芯片,但都只用到了它 的自适应模式,关键还是看固件怎么写。所以从某种程度上来说,现在的DAC设计,比拼的已经不是硬件,而是软件了。



B:

USB声卡的播放流程是这样的

在主机应用程序中播放音乐前,USB声卡就会从主机端收到如下的两个包:Setup包 和 控制数据包

  根据USB音频类协议分解Setup包,可以得知,本次控制传输的作用是设置USB声卡的采样频率,那么在播放音乐前,必须把I2S控制器的采样频率做相应的设置。才能和主机端保持同步。

这是在主机开始播放音乐时做的事。

然后在播放过程中

USB音频类规定的USB同步传输周期为1ms,每隔1ms,USB设备就会收到一次主机传来的数据。而USB设备会在接收缓存中暂时性的存储这些数据。(TAS1020B的接受缓存刚好能存储24BIT/96K的数据)然后再进行处理,然后送到I2S控制器。在这个过程中,USB1.1因为带宽和优先度的原因,系统其他操作比较繁忙的时候容易出现丢包的状况,在丢包的状况下,USB芯片会把生成一个空数据包(就是全部都是0000000)。因此USB1.1的USB声卡经常出现小爆音。

异步模式的USB DAC中,I2S控制器自己生成时钟,然后向USB芯片发出反馈,USB芯片再对音频数据流进行采样的转换(SRC),转换成I2S控制器所需要的采样,再发给I2S控制器。这时I2S控制器的时钟是自己生成的。没有和USB总线时钟同步,所以很在接收USB处理后的数据时,容易受时钟误差和抖动等影响。在《USB协议及规范》中这样的处理是十分不推荐的。
“Such slips/stuffs will cause audible degradation in audio applications. ”


自适应模式的USB DAC中,USB芯片会对数据包进行处理,根据播放开始前主机端发来的采样信息,加进数据包中,而I2S信号控制器在读取数据包后,会根据采样信息建立相应的时钟,并解包,装载音频数据。

就从USB本身的协议来看,作为“目的”端来说,自适应模式无疑比异步模式更加适合音频。


从电路上来看,QB9是通过FPGA读取播放前主机发来的采样格式信号,然后选择相应频率的时钟,在FPGA上对TAS1020B输出的信号进行时钟重整。而TAS1020B异步模式时所采用的时钟依然是内置的时钟。









参考资料:

《USB协议及规范》
《USB Audio Class协议规范》

同步类型

          ——异步:不同步、但目的(sink)能提供数据速率反馈

          ——同步:同步到USB的SOF时钟

          ——可调:用反馈或feed forward 的数据速率信息实现同步


usb audio -- 异步方式介绍(1)

Usb audio目前已经有三个版本: 1.0,2.0,3.0 。1.0版本虽然出现的最早,但任然在大多数产品上使用,如TI 的 PCM系列usb audio芯片,基本上都是1.0的版本。 这里有一点...
  • xjq163
  • xjq163
  • 2017年07月20日 15:34
  • 477

cyusb3014上位机同步传输与异步传输的实现

同步传输: public void TransfersThread2() //专门用来传输线程0的 { int ...
  • qq1003442507
  • qq1003442507
  • 2015年10月10日 22:28
  • 1579

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作...
  • zqixiao_09
  • zqixiao_09
  • 2016年04月04日 17:00
  • 7846

Linux设备驱动中的异步操作

首先,打开目标设备。第二,设置好目标设备的SIGIO信号处理程序。第三,需要通过fcntl系统调用,使当前进程变成文件的主人。(这样才能使文件中的信号发到当前进程)第四,通过ioctl系统调用,将目标...
  • walkingman321
  • walkingman321
  • 2008年03月09日 23:31
  • 1420

USB 数据传输 块传输、中断传输、同步传输和控制传输

  • 2009年12月21日 10:49
  • 366KB
  • 下载

HID-USB设备读写开发测试

http://bbs.csdn.net/topics/390691197 看过一个文章“Windows主机端与自定义USB HID设备通信详解",有这样一段文字。 1 、 ReadFile 的...
  • ghevinn
  • ghevinn
  • 2015年08月27日 13:58
  • 9821

linux设备驱动之USB数据传输分析

http://linux.chinaunix.net/techdoc/install/2008/09/18/1033112.shtml ---------------------------...
  • hushup
  • hushup
  • 2015年09月10日 17:23
  • 2075

我来说说究竟什么是“USB异步传输” (Asynchronous USB)吧

讨论贴: http://www.erji.net/read.php?tid=767228&fpage=0&toread=&page=1 参考资料: http://www.usbdacs.com/...
  • chinaunixj
  • chinaunixj
  • 2012年03月26日 11:39
  • 3501

libusb异步中断传输使用说明

基于libusbx-1.0.18-rc1,libusbx现已重新merage到libusb。 1. 初始化 使用libusb_init初始化libusb,如果是单设备通信,ctx参数可以传NULL...
  • coroutines
  • coroutines
  • 2014年08月08日 11:27
  • 12535

《Linux那些事儿之我是USB》前言

1992年,那是一个春天。不过其实1991年又何尝不是一个春天呢,因为正是在那一年,Linux诞生了。又因为开放源代码的缘故,十几年来Linux是越来越火,熊熊火焰也烧到了华夏大地。诸多高校开始开设L...
  • fudan_abc
  • fudan_abc
  • 2010年07月29日 12:34
  • 17622
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我来说说究竟什么是“USB异步传输” (Asynchronous USB)吧
举报原因:
原因补充:

(最多只允许输入30个字)