0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32入門學(xué)習(xí)筆記之USB讀卡器實(shí)驗(yàn)1

jf_78858299 ? 來(lái)源:滑小稽筆記 ? 作者:電子技術(shù)園地 ? 2023-02-16 15:59 ? 次閱讀

22.1 USB概述

USB是英文Universal Serial BUS(通用串行總線)的縮寫,是一個(gè)外部總線標(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等多個(gè)版本。目前用的最多的就是USB2.0和USB3.0,USB3.1目前已經(jīng)開始普及。

STM32F103自帶的USB符合USB2.0規(guī)范。標(biāo)準(zhǔn)USB共四根線組成,除VCC和GND外,另外為D+,D-,這兩根數(shù)據(jù)線采用的是差分電壓的方式進(jìn)行數(shù)據(jù)傳輸?shù)摹T赨SB主機(jī)上,D-和D+都是接了15K的電阻到低的,所以在沒有設(shè)備接入的時(shí)候,D+、D-均是低電平。

而在USB設(shè)備中,如果是高速設(shè)備,則會(huì)在D+上接一個(gè)1.5K的電阻到VCC,而如果是低速設(shè)備,則會(huì)在D-上接一個(gè)1.5K的電阻到VCC。這樣當(dāng)設(shè)備接入主機(jī)的時(shí)候,主機(jī)就可以判斷是否有設(shè)備接入,并能判斷設(shè)備是高速設(shè)備還是低速設(shè)備。

STM32F1自帶一個(gè)USB從機(jī)控制器,符合USB規(guī)范通信,PC主機(jī)和微控制器之間的數(shù)據(jù)傳輸是通過(guò)共享一個(gè)專用的數(shù)據(jù)緩沖區(qū)來(lái)完成的,該數(shù)據(jù)緩沖區(qū)能被USB外設(shè)直接訪問,這塊專用數(shù)據(jù)緩沖區(qū)的大小由所使用的端點(diǎn)數(shù)目和每個(gè)端點(diǎn)最大的數(shù)據(jù)分組大小所決定,每個(gè)端點(diǎn)最大可使用512字節(jié)緩沖區(qū),最多可用于16個(gè)單向或8個(gè)雙向端點(diǎn)。

USB模塊同PC主機(jī)通信,根據(jù)USB規(guī)范實(shí)現(xiàn)令牌分組的檢測(cè),數(shù)據(jù)發(fā)送/接收的處理,和握手分組的處理。整個(gè)傳輸?shù)母袷接捎布瓿桑渲邪–RC的生成和校驗(yàn)。

每個(gè)端點(diǎn)都有一個(gè)緩沖區(qū)描述塊,描述該端點(diǎn)使用的緩沖區(qū)地址、大小和需要傳輸?shù)淖止?jié)數(shù)。當(dāng)USB模塊識(shí)別出一個(gè)有效的功能/端點(diǎn)的令牌分組時(shí),(如果需要傳輸數(shù)據(jù)并且端點(diǎn)已配置)隨之發(fā)生相關(guān)的數(shù)據(jù)傳輸。

USB模塊通過(guò)一個(gè)內(nèi)部的16位寄存器實(shí)現(xiàn)端口與專用緩沖區(qū)的數(shù)據(jù)交換。在所有的數(shù)據(jù)傳輸完成后,如果需要,則根據(jù)傳輸?shù)姆较?,發(fā)送或接收適當(dāng)?shù)奈帐址纸M。在數(shù)據(jù)傳輸結(jié)束時(shí),USB模塊將觸發(fā)與端點(diǎn)相關(guān)的中斷,通過(guò)讀狀態(tài)寄存器和/或者利用不同的中斷來(lái)處理。USB設(shè)備架構(gòu)如圖所示。

圖片

USB的中斷映射單元:將可能產(chǎn)生中斷的USB事件映射到三個(gè)不同的NVIC請(qǐng)求線上:

(1)USB低優(yōu)先級(jí)中斷(通道20):可由所有USB事件觸發(fā)(正確傳輸,USB復(fù)位等)。在處理中斷前應(yīng)首先確定中斷源。

(2)USB高優(yōu)先級(jí)中斷(通道19):僅由同步和雙緩沖批量傳輸?shù)恼_傳輸事件觸發(fā),為保證最大的傳輸速率。

(3)USB喚醒中斷(通道42):由USB掛起模式的喚醒事件觸發(fā)。

注:USB和CAN共用一個(gè)專用的512字節(jié)的SRAM存儲(chǔ)器用于數(shù)據(jù)的發(fā)送和接收,因此不能同時(shí)使用USB和CAN(共享的SRAM被USB和CAN模塊互斥地訪問)。USB和CAN可以同時(shí)用于一個(gè)應(yīng)用中但不能在同一個(gè)時(shí)間使用。

22.2 實(shí)驗(yàn)例程

如果需要正常的使用STM32F1系列的USB模塊,就需要編寫USB驅(qū)動(dòng)程序,這部分程序非常復(fù)雜,需要了解整個(gè)USB通信的詳細(xì)過(guò)程,針對(duì)這個(gè)問題,ST公司提供了一個(gè)官方的USB驅(qū)動(dòng)庫(kù),用戶可以通過(guò)直接移植官方驅(qū)動(dòng)庫(kù)來(lái)實(shí)現(xiàn)USB讀寫控制。

我們現(xiàn)在直接利用官方的USB驅(qū)動(dòng)源碼來(lái)通過(guò)計(jì)算機(jī)進(jìn)行SD卡和Flash的讀寫,這里我們需要對(duì)官方源碼進(jìn)行一些修改,用于實(shí)現(xiàn)這個(gè)效果。

22.2.1 USB源碼概述

USB Mass Storage類支持兩個(gè)傳輸協(xié)議:

(1)Bulk-Only傳輸(BOT)

(2)Control/Bulk/Interrupt傳輸(CBI)

MassStorage類規(guī)范定義了兩個(gè)類規(guī)定的請(qǐng)求:Get_Max_LUN和MassStorageReset,所有的MassStorage類設(shè)備都必須支持這兩個(gè)請(qǐng)求。

(1)Get_Max_LUN(bmRequestType=10100001 bandb Request=11111110b)用來(lái)確認(rèn)設(shè)備支持的邏輯單元數(shù)。MaxLUN的值必須是0~15。注意:LUN是從0開始的。主機(jī)不能向不存在的LUN發(fā)送CBW,本章我們定義MaxLUN的值為1,即代表2個(gè)邏輯單元。

(2)MassStorageReset(bmRequestType=00100001 bandb Request=11111111b)用來(lái)復(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個(gè)endpoint:Control,Bulk-In和Bulk-Out。USB2.0的規(guī)范定義了控制端點(diǎn)0。Bulk-In端點(diǎn)用來(lái)從設(shè)備向主機(jī)傳送數(shù)據(jù)(本章用端點(diǎn)1實(shí)現(xiàn))。Bulk-Out端點(diǎn)用來(lái)從主機(jī)向設(shè)備傳送數(shù)據(jù)(本章用端點(diǎn)2實(shí)現(xiàn))。

ST官方的例程是通過(guò)USB來(lái)讀寫SD卡(SDIO方式)和Nand Falsh,支持2個(gè)邏輯單元,我們?cè)诠俜嚼痰幕A(chǔ)上,只需要修改SD驅(qū)動(dòng)部分代碼,并將對(duì)Nand Falsh的操作修改為對(duì)SPI Falsh的操作。只要這兩步完成了,剩下的就比較簡(jiǎn)單了,對(duì)底層磁盤的讀寫,都是在mass_mal.c文件實(shí)現(xiàn)的,所以我們只需要修改該函數(shù)的MAL_Init、MAL_Write、MAL_Read和MAL_GetStatus等4個(gè)函數(shù),與我們的SD卡和SPI Falsh對(duì)應(yīng)起來(lái)即可。

22.2.2 源碼移植過(guò)程

(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端點(diǎn)提供特殊簡(jiǎn)化的讀寫訪問函數(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通信的存儲(chǔ)區(qū)讀寫函數(shù)
mass_mal.c 定義了USB通信的讀寫操作底層函數(shù)接口
usb_bot.c 定義了BOT傳輸協(xié)議
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7967

    瀏覽量

    265308
  • PC
    PC
    +關(guān)注

    關(guān)注

    9

    文章

    2098

    瀏覽量

    154419
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2898

    瀏覽量

    88228
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32 SD-USB讀卡器實(shí)驗(yàn)(神舟I號(hào))

    STM32 SD-USB讀卡器實(shí)驗(yàn)(神舟I號(hào)
    發(fā)表于 03-21 15:20

    stm32USB讀卡器實(shí)驗(yàn)源碼

    ***_bot.h"http://ALIENTEK戰(zhàn)艦STM32開發(fā)板實(shí)驗(yàn)50//USB讀卡器 實(shí)驗(yàn)//設(shè)置USB
    發(fā)表于 07-04 02:29

    電腦相關(guān)的讀卡器

    ,SM卡讀卡器,PCMICA讀卡器和記憶棒讀卡器。此外,還有一個(gè)雙插槽讀卡器,可同時(shí)支持兩個(gè)或更多卡。此外,根據(jù)端口類型,讀卡器可分為三類:
    發(fā)表于 09-16 16:51

    usb讀卡器萬(wàn)能驅(qū)動(dòng)下載

    usb讀卡器萬(wàn)能驅(qū)動(dòng)下載
    發(fā)表于 01-12 10:15 ?451次下載

    讀卡器的接口類型

    讀卡器的接口類型              接口類型是指讀卡器與電腦主機(jī)之間的連接方式和類型。目前讀卡器都是采用
    發(fā)表于 01-09 15:06 ?4439次閱讀

    ALIENTEK_MINISTM32_實(shí)驗(yàn)27_USB讀卡器

    ALIENTEK MINISTM32 實(shí)驗(yàn)27 USB讀卡器,很好的學(xué)習(xí)資料,快來(lái)下載吧
    發(fā)表于 02-19 11:41 ?12次下載

    基于STM32RFID的讀卡器資料(全套完整)

    基于STM32RFID的讀卡器資料(全套完整),吧友提供,我只是打包后上傳,謝謝下載
    發(fā)表于 07-01 17:35 ?718次下載

    基于STM32USB讀卡器的設(shè)計(jì)

    基于STM32USB讀卡器的設(shè)計(jì)
    發(fā)表于 09-25 11:11 ?29次下載
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>USB</b><b class='flag-5'>讀卡器</b>的設(shè)計(jì)

    usb3.0和usb2.0讀卡器對(duì)比

    手里有個(gè)品勝的USB2.0讀卡器,電腦配置更新之后帶有3.0接口,所有買了個(gè)3.0的讀卡器,選來(lái)選去感覺還是螃蟹芯片好些,入了一個(gè)“川宇C396”,之前有個(gè)老的8G內(nèi)存卡。還有個(gè)前年買了一個(gè)威剛
    發(fā)表于 05-15 16:09 ?2.5w次閱讀

    USB讀卡器(SLAVE)應(yīng)用實(shí)驗(yàn)的詳細(xì)直流概述免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)技術(shù)的是USB讀卡器(SLAVE)應(yīng)用實(shí)驗(yàn)的詳細(xì)資料概述免費(fèi)下載。
    發(fā)表于 09-11 08:00 ?4次下載

    筆記本的讀卡器有何用處 讀卡器的類型介紹

    曾幾何時(shí),多合一讀卡器筆記本身上的標(biāo)配,可以方便我們讀取數(shù)碼相機(jī)、行車記錄儀等數(shù)碼產(chǎn)品內(nèi)置存儲(chǔ)卡中的數(shù)據(jù)。然而,如今筆記本領(lǐng)域讀卡器的境遇卻發(fā)生了變化。 漸被遺忘的插槽 隨著
    的頭像 發(fā)表于 01-24 10:48 ?1.3w次閱讀

    UM1799_STM32Nucleo的NFC讀卡器入門

    UM1799_STM32Nucleo的NFC讀卡器入門
    發(fā)表于 11-22 19:25 ?3次下載
    UM1799_<b class='flag-5'>STM32</b>Nucleo的NFC<b class='flag-5'>讀卡器</b><b class='flag-5'>入門</b>

    STM32入門學(xué)習(xí)筆記USB讀卡器實(shí)驗(yàn)2

    USB是英文Universal Serial BUS(通用串行總線)的縮寫,是一個(gè)外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊。是應(yīng)用在PC領(lǐng)域的接口技術(shù)。USB接口支持設(shè)備的即插即用和熱插拔功能。
    的頭像 發(fā)表于 02-16 15:59 ?830次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>入門</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b><b class='flag-5'>USB</b><b class='flag-5'>讀卡器</b><b class='flag-5'>實(shí)驗(yàn)</b>2

    STM32入門學(xué)習(xí)筆記USB讀卡器實(shí)驗(yàn)3

    USB是英文Universal Serial BUS(通用串行總線)的縮寫,是一個(gè)外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊。是應(yīng)用在PC領(lǐng)域的接口技術(shù)。USB接口支持設(shè)備的即插即用和熱插拔功能。
    的頭像 發(fā)表于 02-16 16:00 ?1507次閱讀

    基于STM32單片機(jī)USB讀卡器使用庫(kù)文件設(shè)計(jì)源代碼

    基于STM32單片機(jī)USB讀卡器使用庫(kù)文件設(shè)計(jì)源代碼
    發(fā)表于 04-26 14:53 ?4次下載