探究 USB2.0 的真實傳輸速度是多少?
今天魚鷹簡單聊聊 STM32F103 USB 外設實際傳輸速度的問題。
103 的外設號稱 USB 2.0,但實際上是全速的 USB 2.0,即傳輸 1 bit 數據的速度是 12Mbit/s,類似串口波特率 115200 的概念。
但是我們知道串口協議本身也是有開銷的,比如 1 bit 起始位,1 bit 停止位,這都是必須的,否則接收方就無法正確接收。
下圖是 8 位數據情況下的傳輸波形圖(來源STM32官方手冊):
所以上述情況下,115200 波特率換算字節單位,實際傳輸速度為 11.52KB/s ,注意這里的 B 是大寫,代表字節 Byte,小 b 代表位 bit,這里面的區別很大,別被忽悠了。
比如 10 M 網速寬帶,一般說的是 bit 單位,所以實際傳輸大概在 1 MB 左右。
說回 USB 的話題,STM32F103 搭載的 USB 外設支持 2.0 協議,但是 2.0 協議也分兩種,一種是 全速 版本,即 USB1.1 , 12 Mb/s,另外一種是 高速 版本,480 Mb/s,而 103 只支持全速模式。
F4系列在增加外部 USB PHY 芯片才可以達到高速,否則也只能以全速的方式工作。
那么 F103 的 USB 真實傳輸速度可以達到多少呢?
首先說說為什么想得到這個值,有些產品要求速率很高,必須 1 s 傳輸 1 M字節的傳輸速度(1 MB/s)才行,但為了降成本,使用了 103 的芯片,認為全速 12 Mb/s 的速度怎么也夠了吧,殊不知,這里的速度單位是 bit,還沒考慮 USB 協議的開銷。
所以當你絞盡腦汁優化代碼,你都無法達到這個目標,因為它的理論值只有 12/8 = 1.5 MB/s ,可能你會說,這也夠了啊?
但是 USB 本身是有協議開銷的,就像串口有開始、停止位一樣,USB 也有令牌包、數據包、CRC校驗之類的開銷,還有一次傳輸事務的結束,一般會間隔一小段時間再進行下一次傳輸,還有協議中也會 1 ms 發送一次幀號。
上圖是魚鷹弄的 USB 雙緩沖傳輸波形(一個白塊代表了一次傳輸事務),我們可以看到,每傳輸一個數據包之后都會停頓一段時間,而每一次事務里面也不全包含了用戶數據,這些用戶數據被封裝在 USB 協議包里面。
所以,對于用戶來說,實際傳輸速度遠遠不到 1.5 MB/s,估計就 1 MB/s(最為理想情況下,即不浪費每一次 IN OUT 令牌包的機會,另外 USB 總線上只有一個設備需要傳輸數據才可能達到),而如果在數據傳輸過程中,還加入了上層協議,比如 模擬 U 盤,里面會加入協議,速度就更低了。
所以,為了盡可能達到接近 1 MB/s 的用戶數據傳輸速度,可以使用如下方式:批量傳輸 + 雙緩沖 + 環形緩沖(比如 SD 卡的數據可以在 USB 傳輸時同步寫入 FIFO 中)。盡可能的利用帶寬。
在魚鷹測試模擬 U 盤的性能時,發現傳輸速度可以穩定在 700 KB /s 以上(單向)。而如果沒有 U 盤協議本身開銷和加大代碼優化(即不浪費 IN 、OUT 令牌包),估計能到 900 KB/s,剛好模擬串口就沒有多少協議開銷,到時候可以測試一波數據。