魚(yú)鷹:探究 USB2.0 的真實(shí)傳輸速度是多少?
來(lái)源:公眾號(hào)【魚(yú)鷹談單片機(jī)】
作者:魚(yú)鷹Osprey
ID :emOsprey
今天魚(yú)鷹簡(jiǎn)單聊聊 STM32F103 USB 外設(shè)實(shí)際傳輸速度的問(wèn)題。
103 的外設(shè)號(hào)稱 USB 2.0,但實(shí)際上是全速的 USB 2.0,即傳輸 1 bit 數(shù)據(jù)的速度是 12Mbit/s,類(lèi)似串口波特率 115200 的概念。
但是我們知道串口協(xié)議本身也是有開(kāi)銷(xiāo)的,比如 1 bit 起始位,1 bit 停止位,這都是必須的,否則接收方就無(wú)法正確接收。
下圖是 8 位數(shù)據(jù)情況下的傳輸波形圖(來(lái)源STM32官方手冊(cè))
所以上述情況下,115200 波特率換算字節(jié)單位,實(shí)際傳輸速度為 11.52KB/s ,注意這里的 B 是大寫(xiě),代表字節(jié) Byte,小 b 代表位 bit,這里面的區(qū)別很大,別被忽悠了。
比如 10 M 網(wǎng)速寬帶,一般說(shuō)的是 bit 單位,所以實(shí)際傳輸大概在 1 MB 左右。
說(shuō)回 USB 的話題,STM32F103 搭載的 USB 外設(shè)支持 2.0 協(xié)議,但是 2.0 協(xié)議也分兩種,一種是 全速 版本,即 USB1.1 , 12 Mb/s,另外一種是 高速 版本,480 Mb/s,而 103 只支持全速模式。
F4系列在增加外部 USB PHY 芯片才可以達(dá)到高速,否則也只能以全速的方式工作。
那么 F103 的 USB 真實(shí)傳輸速度可以達(dá)到多少呢?
首先說(shuō)說(shuō)為什么想得到這個(gè)值,有些產(chǎn)品要求速率很高,必須 1 s 傳輸 1 M字節(jié)的傳輸速度(1 MB/s)才行,但為了降成本,使用了 103 的芯片,認(rèn)為全速 12 Mb/s 的速度怎么也夠了吧,殊不知,這里的速度單位是 bit,還沒(méi)考慮 USB 協(xié)議的開(kāi)銷(xiāo)。
所以當(dāng)你絞盡腦汁優(yōu)化代碼,你都無(wú)法達(dá)到這個(gè)目標(biāo),因?yàn)樗睦碚撝抵挥?12/8 = 1.5 MB/s ,可能你會(huì)說(shuō),這也夠了???
但是 USB 本身是有協(xié)議開(kāi)銷(xiāo)的,就像串口有開(kāi)始、停止位一樣,USB 也有令牌包、數(shù)據(jù)包、CRC校驗(yàn)之類(lèi)的開(kāi)銷(xiāo),還有一次傳輸事務(wù)的結(jié)束,一般會(huì)間隔一小段時(shí)間再進(jìn)行下一次傳輸,還有協(xié)議中也會(huì) 1 ms 發(fā)送一次幀號(hào)。
上圖是魚(yú)鷹弄的 USB 雙緩沖傳輸波形(一個(gè)白塊代表了一次傳輸事務(wù)),我們可以看到,每傳輸一個(gè)數(shù)據(jù)包之后都會(huì)停頓一段時(shí)間,而每一次事務(wù)里面也不全包含了用戶數(shù)據(jù),這些用戶數(shù)據(jù)被封裝在 USB 協(xié)議包里面。
所以,對(duì)于用戶來(lái)說(shuō),實(shí)際傳輸速度遠(yuǎn)遠(yuǎn)不到 1.5 MB/s,估計(jì)就 1 MB/s(最為理想情況下,即不浪費(fèi)每一次 IN OUT 令牌包的機(jī)會(huì),另外 USB 總線上只有一個(gè)設(shè)備需要傳輸數(shù)據(jù)才可能達(dá)到),而如果在數(shù)據(jù)傳輸過(guò)程中,還加入了上層協(xié)議,比如 模擬 U 盤(pán),里面會(huì)加入?yún)f(xié)議,速度就更低了。
所以,為了盡可能達(dá)到接近 1 MB/s 的用戶數(shù)據(jù)傳輸速度,可以使用如下方式:批量傳輸 + 雙緩沖 + 環(huán)形緩沖(比如 SD 卡的數(shù)據(jù)可以在 USB 傳輸時(shí)同步寫(xiě)入 FIFO 中)。盡可能的利用帶寬。
在魚(yú)鷹測(cè)試模擬 U 盤(pán)的性能時(shí),發(fā)現(xiàn)傳輸速度可以穩(wěn)定在 700 KB /s 以上(單向)。而如果沒(méi)有 U 盤(pán)協(xié)議本身開(kāi)銷(xiāo)和加大代碼優(yōu)化(即不浪費(fèi) IN 、OUT 令牌包),估計(jì)能到 900 KB/s,剛好模擬串口就沒(méi)有多少協(xié)議開(kāi)銷(xiāo),到時(shí)候可以測(cè)試一波數(shù)據(jù)。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。