主機(jī)環(huán)境:Windows 7 SP1 開發(fā)環(huán)境:MDK5.14 目標(biāo)板:STM32F103C8T6 開發(fā)庫:STM32F1Cube庫和STM32_USB_Device_Library 之前在STM32論壇里領(lǐng)取過一塊STM32開發(fā)板,本來以為是帶有USB模塊接口的,最后發(fā)現(xiàn)NUCLEO里是沒有把USB模塊外接出來的,所以就自個(gè)兒掏錢買了一塊單板,如下圖所示:
單板很簡(jiǎn)單,單純是為了學(xué)習(xí)一下STM32的USB模塊,之所以選擇這個(gè)是因?yàn)樗阋?,而且ST官方有提供USB模塊庫方便開發(fā)。 USB開發(fā)博大精深,比之串口,SPI,I2C來說多了很多東西,一個(gè)很簡(jiǎn)單的例子就是串口,SPI,I2C都可以使用通用IO口來模擬實(shí)現(xiàn),但USB卻很少有人這么做。學(xué)習(xí)USB模塊就要學(xué)習(xí)USB協(xié)議,USB協(xié)議從1.1到2.0再到3.0,現(xiàn)在貌似到3.1版本了都,版本更替了這么多但不影響我們學(xué)習(xí),因?yàn)閁SB協(xié)議都是向后兼容的,學(xué)習(xí)了一個(gè)就夠了。STM32F103C8T6的USB模塊實(shí)現(xiàn)了USB2.0全速總線,符合USB2.0全速設(shè)備的計(jì)數(shù)規(guī)范,支持8個(gè)雙向端點(diǎn)等。 USB總線使用兩根線實(shí)現(xiàn)差分傳輸D 、D-,這跟485總線類似。因此,在USB總線上同一時(shí)刻只能有一個(gè)方向上的傳輸。 有關(guān)USB2.0協(xié)議規(guī)范可以從USB官網(wǎng)上下載,重點(diǎn)看第9章節(jié)即可,600多頁的文檔從頭看到尾是很枯燥的。當(dāng)然如果有精力的話,整個(gè)規(guī)范都看完也是很有好處的。跟USB2.0規(guī)范相關(guān)的還有很多類規(guī)范,在開發(fā)時(shí)如果有需要再看就可以了。 一、USB器件庫概述 ST官網(wǎng)提供的USB文檔有STM32Cube USB器件庫,以及USB培訓(xùn)的一些文檔,重點(diǎn)看USB器件庫文檔就好了,因?yàn)槲覀兪前裇TM32的USB模塊當(dāng)作從設(shè)備,當(dāng)然如果STM32支持USB主機(jī)的話還有另外一個(gè)主機(jī)庫(不在這里討論)。通過查看STM32Cube USB器件庫,可以幫助我們快速理解USB模塊的架構(gòu),簡(jiǎn)化應(yīng)用開發(fā)。STM32CubeUSB設(shè)備庫在Cube中所處位置如下:
USB設(shè)備庫位于HAL驅(qū)動(dòng)層之上,在開發(fā)中我們只需關(guān)注USB設(shè)備庫即可,不必關(guān)注USB設(shè)備的HAL驅(qū)動(dòng),不然USB設(shè)備庫就沒有存在的意義了。而且USB設(shè)備庫代碼是只讀的,不需要修改。 設(shè)備庫中使用的主要結(jié)構(gòu)體為設(shè)備句柄,其類型為USBD_HandleTypeDef,我們不必刻意關(guān)注USB HAL驅(qū)動(dòng)中USB所使用的數(shù)據(jù)結(jié)構(gòu),因?yàn)樗鼈儗?duì)于我們來說是隱藏的,只需關(guān)注設(shè)備庫曝露給我們的接口即可,設(shè)備庫是和USB2.0協(xié)議密切相關(guān)的,因此需要熟悉USB2.0文檔有助于我們理解設(shè)備庫的工作流程。 USB設(shè)備庫目錄分為兩層:一層為Core(核心層);另一層為Class(類層),目錄結(jié)構(gòu)如下:
結(jié)構(gòu)比較清晰,核心層是不需要?jiǎng)拥?,類層是擴(kuò)展用的。 USB設(shè)備庫中核心層的usbd_conf文件是需要用戶自己實(shí)現(xiàn)的,用來配置USB的屬性,其各個(gè)文件的作用如下:
其中usbd_req改為了usbd_ioreq。由表7就可以看出USB2.0規(guī)范中第9章很重要。USB器件庫文檔還詳細(xì)說明了一下控制端點(diǎn)0,這在USB開發(fā)中是一個(gè)重要的端點(diǎn)。其作為默認(rèn)的控制端點(diǎn)用于接收主機(jī)發(fā)來的各種請(qǐng)求,請(qǐng)求作為Setup包發(fā)送到設(shè)備,請(qǐng)求又分為標(biāo)準(zhǔn)請(qǐng)求和非標(biāo)準(zhǔn)請(qǐng)求,標(biāo)準(zhǔn)請(qǐng)求在控制端點(diǎn)0上就可處理了,對(duì)于非標(biāo)準(zhǔn)請(qǐng)求通過回調(diào)函數(shù)傳遞給特定類進(jìn)行進(jìn)一步處理。 USB設(shè)備庫的類層中各個(gè)文件作用如下:
其中的usbd_xxx_if_template文件需要由用戶實(shí)現(xiàn),目前跟USB設(shè)備庫相關(guān)的文件有兩個(gè)需要用戶去實(shí)現(xiàn)即usbd_conf文件和usbd_xxx_if_template文件。至此USB器件庫的概述說明就完畢了,更多詳細(xì)情況查看USB器件庫文檔即可。 二、USB協(xié)議概述 USB協(xié)議中用到的一些邏輯部件: 端點(diǎn):數(shù)據(jù)傳輸?shù)淖罱K對(duì)象 管道:主機(jī)和設(shè)備端點(diǎn)之間數(shù)據(jù)傳輸?shù)哪P?/span> 接口:用于描述特定的功能(有一組端點(diǎn)組成) 設(shè)備:由一個(gè)或多個(gè)接口組成 USB傳輸分為了3層:Packet、Transaction、Transfer,三者是由小到大,關(guān)系如下圖:
一次Transfer傳輸分為幾個(gè)Transaction,一次Transaction由幾次Packer組成。 Packet包格式如下:
所有的USB傳輸都是由USB主機(jī)發(fā)起,這點(diǎn)跟I2C通信有些類似。 USB的傳輸分為4類:控制傳輸、中斷傳輸、同步傳輸、批量傳輸,由此引申出4類端點(diǎn)類型:控制端點(diǎn)、中斷端點(diǎn)、同步端點(diǎn)、批量端點(diǎn)。
控制傳輸是雙向的,須有IN和OUT兩個(gè)方向上的端點(diǎn)號(hào)。其他類型的傳輸是單向的。各類傳輸差別不是很大,只是對(duì)時(shí)間的要求不同。 有關(guān)USB協(xié)議的大概情況就介紹到這,更多詳情請(qǐng)查閱USB2.0規(guī)范以及STM32F103的參考手冊(cè)。后面將通過VCP具體示例來分析USB開發(fā)。 |
|