22.1 USB概述
USB是英文Universal Serial BUS(通用串行總線)的縮寫,是一個外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊。是應(yīng)用在PC領(lǐng)域的接口技術(shù)。USB接口支持設(shè)備的即插即用和熱插拔功能。
是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯(lián)合提出的。發(fā)展到現(xiàn)在已經(jīng)有USB1.0/1.1/2.0/3.0/3.1等多個版本。目前用的最多的就是USB2.0和USB3.0,USB3.1目前已經(jīng)開始普及。
STM32F103自帶的USB符合USB2.0規(guī)范。標(biāo)準(zhǔn)USB共四根線組成,除VCC和GND外,另外為D+,D-,這兩根數(shù)據(jù)線采用的是差分電壓的方式進行數(shù)據(jù)傳輸?shù)?。在USB主機上,D-和D+都是接了15K的電阻到低的,所以在沒有設(shè)備接入的時候,D+、D-均是低電平。
而在USB設(shè)備中,如果是高速設(shè)備,則會在D+上接一個1.5K的電阻到VCC,而如果是低速設(shè)備,則會在D-上接一個1.5K的電阻到VCC。這樣當(dāng)設(shè)備接入主機的時候,主機就可以判斷是否有設(shè)備接入,并能判斷設(shè)備是高速設(shè)備還是低速設(shè)備。
STM32F1自帶一個USB從機控制器,符合USB規(guī)范通信,PC主機和微控制器之間的數(shù)據(jù)傳輸是通過共享一個專用的數(shù)據(jù)緩沖區(qū)來完成的,該數(shù)據(jù)緩沖區(qū)能被USB外設(shè)直接訪問,這塊專用數(shù)據(jù)緩沖區(qū)的大小由所使用的端點數(shù)目和每個端點最大的數(shù)據(jù)分組大小所決定,每個端點最大可使用512字節(jié)緩沖區(qū),最多可用于16個單向或8個雙向端點。
USB模塊同PC主機通信,根據(jù)USB規(guī)范實現(xiàn)令牌分組的檢測,數(shù)據(jù)發(fā)送/接收的處理,和握手分組的處理。整個傳輸?shù)母袷接捎布瓿桑渲邪–RC的生成和校驗。
每個端點都有一個緩沖區(qū)描述塊,描述該端點使用的緩沖區(qū)地址、大小和需要傳輸?shù)淖止?jié)數(shù)。當(dāng)USB模塊識別出一個有效的功能/端點的令牌分組時,(如果需要傳輸數(shù)據(jù)并且端點已配置)隨之發(fā)生相關(guān)的數(shù)據(jù)傳輸。
USB模塊通過一個內(nèi)部的16位寄存器實現(xiàn)端口與專用緩沖區(qū)的數(shù)據(jù)交換。在所有的數(shù)據(jù)傳輸完成后,如果需要,則根據(jù)傳輸?shù)姆较?,發(fā)送或接收適當(dāng)?shù)奈帐址纸M。在數(shù)據(jù)傳輸結(jié)束時,USB模塊將觸發(fā)與端點相關(guān)的中斷,通過讀狀態(tài)寄存器和/或者利用不同的中斷來處理。USB設(shè)備架構(gòu)如圖所示。
USB的中斷映射單元:將可能產(chǎn)生中斷的USB事件映射到三個不同的NVIC請求線上:
(1)USB低優(yōu)先級中斷(通道20):可由所有USB事件觸發(fā)(正確傳輸,USB復(fù)位等)。在處理中斷前應(yīng)首先確定中斷源。
(2)USB高優(yōu)先級中斷(通道19):僅由同步和雙緩沖批量傳輸?shù)恼_傳輸事件觸發(fā),為保證最大的傳輸速率。
(3)USB喚醒中斷(通道42):由USB掛起模式的喚醒事件觸發(fā)。
注:USB和CAN共用一個專用的512字節(jié)的SRAM存儲器用于數(shù)據(jù)的發(fā)送和接收,因此不能同時使用USB和CAN(共享的SRAM被USB和CAN模塊互斥地訪問)。USB和CAN可以同時用于一個應(yīng)用中但不能在同一個時間使用。
22.2 實驗例程
如果需要正常的使用STM32F1系列的USB模塊,就需要編寫USB驅(qū)動程序,這部分程序非常復(fù)雜,需要了解整個USB通信的詳細(xì)過程,針對這個問題,ST公司提供了一個官方的USB驅(qū)動庫,用戶可以通過直接移植官方驅(qū)動庫來實現(xiàn)USB讀寫控制。
我們現(xiàn)在直接利用官方的USB驅(qū)動源碼來通過計算機進行SD卡和Flash的讀寫,這里我們需要對官方源碼進行一些修改,用于實現(xiàn)這個效果。
22.2.1 USB源碼概述
USB Mass Storage類支持兩個傳輸協(xié)議:
(1)Bulk-Only傳輸(BOT)
(2)Control/Bulk/Interrupt傳輸(CBI)
MassStorage類規(guī)范定義了兩個類規(guī)定的請求:Get_Max_LUN和MassStorageReset,所有的MassStorage類設(shè)備都必須支持這兩個請求。
(1)Get_Max_LUN(bmRequestType=10100001 bandb Request=11111110b)用來確認(rèn)設(shè)備支持的邏輯單元數(shù)。MaxLUN的值必須是0~15。注意:LUN是從0開始的。主機不能向不存在的LUN發(fā)送CBW,本章我們定義MaxLUN的值為1,即代表2個邏輯單元。
(2)MassStorageReset(bmRequestType=00100001 bandb Request=11111111b)用來復(fù)位MassStorage設(shè)備及其相關(guān)接口。
支持BOT傳輸的MassStorage設(shè)備接口描述符要求如下:
(1)接口類代碼bInterfaceClass=08h,表示為MassStorage設(shè)備。
(2)接口類子代碼bInterfaceSubClass=06h,表示設(shè)備支持SCSIPrimaryCommand-2(SPC-2)。
(3)協(xié)議代碼bInterfaceProtocol有3種:0x00、0x01、0x50,前兩種需要使用中斷傳輸,最后一種僅使用批量傳輸(BOT)。
(4)支持BOT的設(shè)備必須支持最少3個endpoint:Control,Bulk-In和Bulk-Out。USB2.0的規(guī)范定義了控制端點0。Bulk-In端點用來從設(shè)備向主機傳送數(shù)據(jù)(本章用端點1實現(xiàn))。Bulk-Out端點用來從主機向設(shè)備傳送數(shù)據(jù)(本章用端點2實現(xiàn))。
ST官方的例程是通過USB來讀寫SD卡(SDIO方式)和Nand Falsh,支持2個邏輯單元,我們在官方例程的基礎(chǔ)上,只需要修改SD驅(qū)動部分代碼,并將對Nand Falsh的操作修改為對SPI Falsh的操作。只要這兩步完成了,剩下的就比較簡單了,對底層磁盤的讀寫,都是在mass_mal.c文件實現(xiàn)的,所以我們只需要修改該函數(shù)的MAL_Init、MAL_Write、MAL_Read和MAL_GetStatus等4個函數(shù),與我們的SD卡和SPI Falsh對應(yīng)起來即可。
22.2.2 源碼移植過程
(1)需要添加的文件如下表所示。
文件名 | 目錄 | 功能 |
---|---|---|
usb_core.c | ....\\USB\\CORE | 用于處理USB2.0協(xié)議 |
usb_init.c | 用于USB控制器的初始化 | |
usb_int.c | 負(fù)責(zé)USB的中斷處理 | |
usb_mem.c | 負(fù)責(zé)處理PMA數(shù)據(jù),即STM32內(nèi)部用于USB/CAN的專用數(shù)據(jù)緩沖區(qū) | |
usb_regs.c | 負(fù)責(zé)USB控制寄存器的底層操作 | |
usb_sil.c | 為USB端點提供特殊簡化的讀寫訪問函數(shù) | |
usb_desc.c | ...\\USB\\CONFIG | 用于虛擬通信端口描述符的處理 |
usb_endp.c | 用于非控制傳輸,處理正確傳輸中斷回調(diào)函數(shù) | |
usb_istr.c | 用于處理USB中斷 | |
usb_prop.c | 用于處理所有虛擬通信端口相關(guān)事件,包括初始化,復(fù)位等 | |
usb_pwr.c | 用于管理USB的電源狀態(tài) | |
usb_scsi.c | 與SCSI命令相關(guān)的所有處理 | |
scsi_data.c | 定義了SCSI數(shù)據(jù) | |
memory.c | 定義USB通信的存儲區(qū)讀寫函數(shù) | |
mass_mal.c | 定義了USB通信的讀寫操作底層函數(shù)接口 | |
usb_bot.c | 定義了BOT傳輸協(xié)議 |
-
usb
+關(guān)注
關(guān)注
60文章
8179瀏覽量
272754 -
PC
+關(guān)注
關(guān)注
9文章
2151瀏覽量
156502 -
總線
+關(guān)注
關(guān)注
10文章
2959瀏覽量
89729
發(fā)布評論請先 登錄
stm32的USB讀卡器實驗源碼
電腦相關(guān)的讀卡器
ALIENTEK_MINISTM32_實驗27_USB讀卡器
usb3.0和usb2.0讀卡器對比
USB讀卡器(SLAVE)應(yīng)用實驗的詳細(xì)直流概述免費下載
筆記本的讀卡器有何用處 讀卡器的類型介紹
STM32入門學(xué)習(xí)筆記之USB讀卡器實驗2

評論