我来说说究竟什么是“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 的数据速率信息实现同步


MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC

错误表现: 1>------ 已启动生成: 项目: 自定义断言, 配置: Debug Win32 ------ 1>正在编译... 1>WinMain.cpp 1>正在链接... 1>MSV...
  • zztoll
  • zztoll
  • 2012年07月17日 17:33
  • 4476

C/C++ Windows API——文件读写

// FileReadWriteDemo.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include #include int main() { ...

usb audio--异步传输方式描述符说明(2)

很多人都以为usb audio 1.0不支持异步,如XMOS的驱动,都是是usb audio 2.0的版本,其实usb audio 1.0中已经支持了反馈。现有的操作系统中,win10以前都只支持US...
  • xjq163
  • xjq163
  • 2017年07月20日 15:45
  • 237

usb详解-与uart传输对比

usb作为一种串行接口,应用日益广泛。如同每个工程设计人员必须掌握I2C,RS232这些接口一样,我们也必须掌握usb. 但是usb的接口协议实在有点费解,linux uhci驱动作者之一Alan ...

android设备使用usb串口传输数据

首先介绍两个开源项目一个是Google的开源项目:https://code.google.com/archive/p/android-serialport-api/ 另一个是我们这次介绍的开源项目:...

基于libUSB的USB设备固件更新程序(数据传输部分)

本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步。 libUSB-Win32给出的example里面,有一个bu...
  • liyvhg
  • liyvhg
  • 2012年09月14日 09:49
  • 4755

STM32高级教程之USB HID双向数据传输

程序功能: 1,将STM32的USB枚举为HID设备。 2,STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。 3,端点长度为64,也就是单次最多可以传输64个字节数...

如何实现自定义 USB Bulk 批量传输设备

厂商自定义设备的开发除了要完成设备硬件以及固件程序开发外,还需要开发操作系统端的设备驱动程序,还要开发设备应用程序。        厂商自定义 USB 设备的端点可以自由地选择采用哪种传输方式(con...

USB 采用“令牌包”-“数据包”-“握手包”的传输机制

USB 采用轮询的广播机制传输数据,所有的传输都由主机发起,任何时刻整个USB 体 系内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据 包。 USB 采用“令牌包”-...

基于H264-USB摄像头的RTP实时视频的传输

基于H264-USB摄像头的RTP实时视频的传输
  • beike1
  • beike1
  • 2017年06月24日 14:35
  • 579
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我来说说究竟什么是“USB异步传输” (Asynchronous USB)吧
举报原因:
原因补充:

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