USB音频声卡采用isochronous “等时传输模式”(或者同步传输、实时传输),能保证实时传输数据,允许一定误码率,出错不重传。
等时传输模式
实时传输,即 PC端发出多少速率的数据,USB接收端(USB声卡)就得接收多少速率。
比如电脑发送44.1KHZ的,声卡就固定接收44.1KHZ。
关于时钟同步
电脑内有一个晶振,可分频出一个44.1KHZ,进行音乐播放。
USB声卡自己得有一个晶振才能工作,它也可分频出一个44.1KHZ,供给I2S信号或DAC。
问题来了,晶振是有误差的,这两个44.1KHZ不可能完全一模一样,电脑可能是44.100KHZ,USB声卡可能是44.098KHZ,误差约50ppm,很正常的情况。
虽然声卡晶振分频出来是44.098KHZ,但声卡认为它就是工作在44.100KHZ下。
如果二者时钟独立运行,那么1个小时会误差0.2秒,会出现不同步! 即电脑播了1个小时的数据,USB声卡实际是无法播完的,要多0.2秒才能播完。 如果声卡也要1小时播完,那这1小时就需要丢掉0.2秒的数据。
所以二者的时钟必须要同步一致才行,因此USB音频规定了一是采用“等时传输模式”,二是设备需要指定为3种同步方式之一:同步(synchronous),适应(adaptive),异步(asynchronous)。(摘自USB2.0规范)
模式 | 说明 |
Synchronous同步方式 | 发送端Fs locked to SOF, Uses implicit feedback(SOF) 使用隐式反馈,数据速率Fs与SOF同步;接收端Fs locked to SOF, Uses implicit feedback(SOF) 使用隐式反馈,数据速率Fs与SOF同步;两种设备的时钟都需要通过PLL与USB的SOF时钟同步(1ms一个)。这样数据速率就同步了。可以工作在一个固定速率、数量有限的速率、或可编程速率。 |
Adaptive自适应方式 | 发送端Fs locked to sink, Uses explicit feedback(isochronous pipe) 使用显式反馈,数据速率Fs与接收端同步;接收端Fs locked to data flow, Uses implicitfeedforward (data stream) 使用隐式前馈,数据速率Fs与数据流同步;自适应发送端,它产生数据的速率由接收端控制,接收端提供反馈给发送端,发送端就知道目标数据速率。自适应接收端,数据速率信息是嵌入在接收到的数据流里的,即根据一段时间内接收到的样本数量来知道当前速率值。可工作在一个速率附近、在多个速率间选择、或多个速率段内。 |
Asynchronous异步方式 | 发送端Free running Fs, Provides implicitfeedforward (data stream) 提供隐式前馈,数据速率Fs自由运行;接收端Free running Fs, Provides explicit feedback(isochronous pipe) 提供显式反馈,数据速率Fs自由运行;异步发送端发送样本数据,一个帧内发送的数据量就隐性指出了数据速率。异步接收端则必须提供明确的反馈信息给驱动程序。发送端必须要从HOST接收明确的反馈信息,这样它才能准确生成HOST需要的样本数量。 |
分析
电脑播放器播放音乐时:是按一个固定的速率,比如44.1KHZ,发给USB的数据流速率固定。
如果USB声卡是Synchronous方式:那它的时钟将通过PLL直接与SOF时钟同步,即与电脑就同步了。
如果USB声卡是Adaptive方式:那么数据速率Fs是与来的数据流同步,即根据一段时间内的接收到的样本数量来知道当前速率值。因为电脑播放的数据速率是固定的,所以声卡的时钟就和电脑同步了,即与电脑的44.1KHZ实际时钟频率同步,把自己的44.098KHZ时钟通过PLL纠正成44.1KHZ时钟了。 如果电脑时钟是44.102KHZ,那就纠正成44.102KHZ,电脑发多快,它就收多快。
如果USB声卡是Asynchronous方式:那么Fs根据声卡自己的频率运行(名义上是44.1KHZ,但实际频率有误差,比如44.098KHZ),声卡必须反馈告诉电脑想接收的数据量,以进行流控。但电脑播放的数据速率是固定的,是按电脑自己的时钟的,不会改变,因此声卡要的数据总会偏多或偏少,时间久了都会造成缓冲区清空或溢出,从而影响播放,要重新同步下。所以用Asynchronous方式是不合适的。除非电脑的驱动程序单独编制,想一个办法以处理这种数据流不同步的情况。 这也许就是XMOS子卡需要单独安装驱动的原因。