1. 程式人生 > >我來說說究竟什麼是“USB非同步傳輸” (Asynchronous USB)吧

我來說說究竟什麼是“USB非同步傳輸” (Asynchronous USB)吧

討論貼:

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 的資料速率資訊實現同步