USB---USB入門基礎介紹

分類: 打印機驅動安裝方法 发布时间:2019-01-13 09:00

所有的鄉愁都是因爲饞。

這是我的第三十二篇原創文章

已經有幾周沒寫東西了,上周本想寫點東西的,但有幾個朋友遠道而來,到成都玩耍,就帶他們耍了下。有段時間沒見他們了,姑娘還是那樣優秀,小夥依然健碩。不說了,就從這周開始咱們繼續開始呗。去年寫操作系統是還沒講完,我到時候看看啥時候繼續接著講,那麽這周我想講解下USB,可能有那麽幾篇,教你實現一個USB設備打印機類,能夠實現PC端的文檔數據打印(我用串口模擬數據打印過程)。

從去年的十二月中旬開始接觸USB,經理要求完成USB設備類打印機,這東西上上下下還是花了我快一個月時間,畢竟從0開始接觸USB,蹭我還記憶猶新,先記錄下。文章可能有點長,這篇主要介紹USB設備是什麽,和他的傳輸編碼。

USB是什么呢?当初我上大学那会儿和朋友调侃,USB不就是You SB嘛?哈哈哈,事实上,当然不是这样子的啦,USB是Universal Serial Bus的缩写,中文译为通用串行总线,也是一种通讯总线协议。实际上我们知道的BUS(总线),例如:网口,SPI,I2C,RS-485等等。所以简单的说,USB就是一种接口,一种总线。

我們知道I2C的好處是通訊要兩根線,大大的減小CPU的引腳資源,那USB有什麽特殊的地方呢?其實在USB出現之前,計算機領域中的接口太多太繁雜,可以用下面這張,關于PC機箱背後的接口的圖片來說明:

是不是發現接口特別的多,好多你都不認識是幹嘛的,所以嘛,在USB出現之前,各種接口太多,而且都不太容易使用,互相之間的兼容性也差,這時候才誕生了USB。

所以我們生活中看到的接口大部分都是USB接口,什麽硬盤,打印機,国产福利不卡在线视频接口,鍵鼠等等。總的來說,USB的出現,是希望通過此單個的USB接口,同時支持多種不同的應用,而且用戶用起來也很方便,直接插上就能用了,也方便不同的設備的之間的互聯。說白了,就相當于在之前衆多的接口之上,設計出一個USB這麽個萬能的接口,以後各種外設,都可以用這一種接口即可。

USB设备,从物理上的逻辑结构来说,包含了主机Host和设备Device。其中,主机Host端,有对应的硬件的USB的主机控制器Host Controller,而设备端,连接的是对应的USB设备。

USB控制器类型贼多,什么OHCI,UHCI,EHCI啥的,我们这次只讲USB device,不讲控制器,所以就简单了解下他们的关系就好。

OHCI(Open Host Controller Interface) 是美国国家半导体公司,微软等推出的,OHCI更多地把要做的事情,用硬件来实现,因此,实现OHCI的USB控制器的软件驱动的开发工作,相对要容易些,软件要做的事情,相对较少。对应地,OHCI更多地应用在扩展卡,尤其是嵌入式领域中,常见的很多开发板中的USB的控制器,很多都是OHCI的。

UHCI(Universal Host Controller Interface),创立者是Intel,而UHCI把更多的功能,留给了软件,相对来说,软件做的事情,即负担要重些。但是实现对应的UHCI的硬件的USB控制器,价格上,就相对便宜些。对应地,UHCI更多地应用在PC机中的主板上的USB控制器。

一般情况下哦, USB1.x/USB2.0使用的是4线制,而USB3.0使用9线,别慌,他们是通用的,他们引脚对应的含义一般如下 :

表1 USB 1.x/2.0 定义

表2 USB3.0

以上USB引腳定義,接下來介紹USB接口長什麽樣子的。關于分類USB應該可以分成:type,mini和micro。

那什麽是type類型呢?我們生活中是不是經常聽到聽到type-C接口呀,就是那個蘋果最先用的那種接口。其實還有type-A與type-B。type-A接口就是我們經常看到的那種,我們PC機器經常用到,99%的U盤用的就是type-A公頭,自然我們大部分PC機就是那種母頭接口。type-B接口可能生活中不常見,但是在嵌入式領域是肯定見過的,看下圖就知道了。

對,就是J-link調試器那種接口。這裏說上一句,關于type-C是基于USB3.1協議的.

那什么是USB mini呢?这个大家应该也见过,可能只是不知道叫啥,那种老人机的充电器,中间是正方形,外框是梯形的那种,看图。

上图那种叫做USB mini-B,自然肯定有USB mini-A,这个我没有图,就是我们用数码相机那接口,和这个好像,只是中间是梯形的,上图中的中间是长方形的。但是他们的接口(母口)都是一样的,所以通用。

最後還有一種USB接口,就是micro,這個大家肯定都見過,就是我們常看到安卓的接口,比mini更扁。我就不拍照了,大夥都懂。

看到這兒,下回看到USB知道那是屬于什麽類型的USB了,作爲技術人員,咱們專業點。

介紹完USB硬件基礎,下面介紹USB協議基礎,如果想詳細了解USB協議的動易可以去USB官網看,裏面啥都有。

我们常说的USB版本大概有USB1.1,USB2.0和USB3.0。其实这三个版本是针对有限设备的。实际上,在USB2.0到3.0阶段,还发布过一个USB2.5(USB Wireless)版本,这个版本是针对USB无线设备的,例如我们用的无线鼠标,无线wifi啥的。

其中,USB 1.1中所支持的速度是低速(Low Speed)的1.5Mbits/s,全速(Full Speed)的12Mbits/s,而USB 2.0提高了速度至高速(High Speed)的480Mbits/s,而最新的USB 3.0,支持超高速(Super Speed)的5Gbits/s。

這時候,是不是在想,同樣是USB,爲啥他們的速度差距這麽大呢?這個主要是曆史原因,當初用USB1.1時,主要做的是鍵盤,鼠標這樣的設備,那個速度完全滿足用戶要求;速度低,對電磁輻射的抗幹擾能力較強;最主要的原因是降低成本。

为了满足人民群众日益增长的对于高速速度传输方面的需求,USB2.0就出来了,据说这个和USB1.1推出时间之差不到2年的时间。举个例子:从MP3里面拷贝歌曲出来,如果是USB 1.1,那么实际效果最快也就1MB左右,而如果是USB 2.0,平均效果大概有3MB/s,5MB/s,性能好的可达10MB/s,20MB/s,所以,如果拷贝个1G的东西,相当于USB 1.1要1小时左右,而USB 2.0只要1分钟左右。因为如果没有USB 2.0的出现的话,那么现在的人们,早就放弃了USB了,因为谁也忍受不了这个太慢的速度。所以为了满足大家的需求,才有了USB 2.0的出现。

現在的USB3.0也是一個道理,爲了滿足之後廣大人們的"貪婪",例如你傳幾個G的視頻,USB2.0怎麽的都要幾min吧,現在只要幾秒或者幾十秒,哔的一下,就好了,你說刺不刺激。當然,理論上是5G,畢竟這個是和硬件和軟件挂鈎的,具體的還是看你設備咯。

其實USB發展到2.0階段,還有一個概念,就是OTG,那什麽是OTG呢?說白了就是模式的互轉,就是一種主機協商協議,允許兩個設備之間互相協商誰去當Host。不過,即使在OTG中,也只是同一時刻,只存在單個的Host,而不允許存在多個Host的。

我們生活上就有這種現象,比如我們經常用国产福利不卡在线视频連接U盤,實現文件互傳。數碼相機直接鏈接打印機,打印圖片等等,這種就是OTG技術。

USBNRZI編碼

有没有考虑过,同样是串行数据,为什么USB速度比串口,I2C快那么多?其实这个和他的协议传输编码有关,USB所传输的数据,用的数据编码方式是NRZI(Non-Return-to-Zero Inverted)。那什么是NRZI编码呢?这里有篇文章将的不错,我截取他的部分内容简单的介绍下:

博客国产福利不卡在线视频

首先,USB 的数据是串行发送的,就像 UART、I2C、SPI 等等,连续的01 信号只通过一根数据线发送给接受者。

但是因为发送者和接收者运行的频率不一样,信号的同步就是个问题,比如,接受者接收到了一个持续一段时间的低電平,无法得知这究竟是代表了5个0 还是1000个0。

为了解决这个问题,就是在传输数据信号的同时,附加一个时钟信号,用来同步两端的传输,接受者在时钟信号的辅助下对数据信号采样,就可以正确解析出发送的数据了,比如 I2C 就是这样做的,SDA 来传输数据,SCL 来传输同步时钟:

雖然這樣解決了問題,但是卻需要附加一根時鍾信號線來傳輸時鍾。有沒有不需要附加的時鍾信號,也能保持兩端的同步呢?

有的,这就是 RZ 编码(Return-to-zero Code),也叫做归零编码。在 RZ 编码中,正電平代表逻辑 1,负電平代表逻辑 0,并且,每传输完一位数据,信号返回到零電平,也就是说,信号线上会出现 3 种電平:正電平、负電平、零電平:

从图上就可以看出来,因为每位传输之后都要归零,所以接收者只要在信号归零后采样即可,这样就不在需要单独的时钟信号。实际上, RZ 编码就是相当于把时钟信号用归零编码在了数据之内。这样的信号也叫做自同步(self-clocking)信号。

这样虽然省了时钟数据线,但是还是有缺点的,因为在 RZ 编码中,大部分的数据带宽,都用来传输“归零”而浪费掉了。

那么,我们去掉这个归零步骤,NRZ 编码(Non-return-to-zero Code)就出现了,和 RZ 的区别就是 NRZ 是不需要归零的:

这样,浪费的带宽又回来了,不过又丧失宝贵的自同步特性了,貌似我们又回到了原点,其实这个问题也是可以解决的,不过待会儿再讲,先看看什么是 NRZI:

NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。USB 传输的编码就是 NRZI 格式,在 USB 中,電平翻转代表逻辑 0,電平不变代表逻辑1:

翻转的信号本身可以作为一种通知机制,而且可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB 这种通过差分线来传输的信号特别方便。

現在再回到那個同步問題:

的确,NRZ 和 NRZI 都没有自同步特性,但是可以用一些特殊的技巧解决。

比如,先发送一个同步头,内容是 的方波,让接受者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号,就可以了。在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI 编码之后,就是一串方波。

此外,因为在 USB 的 NRZI 编码下,逻辑 0 会造成電平翻转,所以接收者在接收数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。

但是,这样还是会有一个问题,就是虽然接收者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000个逻辑1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的電平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001个或者 999个了。

关于这个问题,USB中用位填充(Bit-Stuffing)来解决这个问题。就是强制插0,也就是传说中的bit-stuffing,如果要传输的数据中有7个连续的1,发送前就会在第6个1后面强制插入一个0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除6个连续 1 之后的0,就可以恢复原始的数据了。

好吧這篇文章就說到這兒了,主要介紹了USB基本概念,USB是什麽東西和USB的傳輸協議編碼。明天介紹USB協議基礎內容。明天見。