娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月12日(星期四)

2019年06月12日 | USB Device應用筆記(基于STM32F103)

發布者:stampie 關鍵字:USB  Device  STM32F103 手機看文章 掃描二維碼
隨時隨地手機看文章

常見USB設備類

音頻類(Audio),通信設備類(CDC),設備固件升級類(DFU),人機接口類(HID),大容量存儲設備類(Mass Storage)


USB的數據由Packet(包)組成Transaction(事務),Transaction組成Transfer(傳輸),不同傳輸類型每Frame(幀)占用帶寬的特性不同。同步傳輸每幀占用固定帶寬;中斷傳輸每幀都占用帶寬,但所占帶寬不固定;控制傳輸和批量傳輸在需要時才占用幀帶寬,批量傳輸將會占用幀的所有剩余帶寬。除同步傳輸外,一個Transaction由token包,數據包,握手包構成,STM32的每次中斷都完成一個Transaction,token包和握手包的收發由硬件完成,數據包由應用程序完成。


四種傳輸類型

用于描述端點(Endpoint)或通道(Pipe)的特性 

1. 中斷傳輸(Interrupt Transfer) 

2. 控制傳輸(Control Transfer) 

3. 同步傳輸(Isochronous Transfer) 

4. 批量傳輸(Bulk Transfer) 

同步傳輸與中斷傳輸是周期性的,控制傳輸和批量傳輸是突發的


通道類型

數據流:單向 ->批量,中斷,同步傳輸

消息: 雙向 -> 控制傳輸

事務(Transaction)

分類:SETUP, OUT, IN 

這里寫圖片描述


Packet格式

SYNC Packet Content EOP 

其中,Packet Content的組成 

PID 地址 幀號 數據 CRC 

注意:不是每種包都包含完整Packet Content


Packet種類及其組成

命令包 token 

PID + ADDR(設備地址,端點地址) + CRC5

幀首包 SOF(Start of frame) 

PID + 幀號 + CRC5

數據包 DATA 

PID + 數據 + CRC16

握手包 Handshake 

PID

PID域的類型

Token 

IN, OUT, SETUP

SOF 

SOF

Data 

DATA0, DATA1, DATA2, DATAM

Handshake 

ACK, NAK, STALL, NYET/ERR(HS)

幀格式

這里寫圖片描述


說明: 

- USB規范規定SETUP分組不能以非ACK握手分組應答,如果SETUP分組失敗,則會引起下一個SETUP分組。因此,以NAK或STALL分組響應主機的SETUP分組是被禁止的。 

- 控制傳輸使用雙向端點


舉例: Control Transfer的SETUP Transaction的組成 

SETUP Packet + DATA0 Packet + ACK Package 

SETUP包只跟以DATA0為PID的數據包,且數據包的方向為Host到Device。 

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述


這里寫圖片描述

USB設備狀態

插入 -> 供電 -> 復位 -> 地址 -> 配置 掛起 


這里寫圖片描述

實現一個USB設備的軟件流程(以Mass Storage為例)

1. 系統初始化

(1)初始化系統時鐘,配置USB時鐘為48MHz; 

(2)清除掛起的中斷標志; 

(3)復位USB模塊 

(4)配置本應用關心的中斷,設備狀態為UNCONNECTED 

(5)初始化媒介層(SD卡,Flash)


2. USB復位(RESET中斷)

(1)設置分組緩沖區基地址; 

(2)配置端點的類型,發送狀態,接收狀態,端點地址(EP_TYPE, EP_KIND, EA),發送緩沖區或接收緩沖區地址,接收端點還需要設置接收長度; 

(3)初始化設備地址為0,置位USB_DADDR. EF使能USB模塊; 

(4)初始化BOT狀態機,CBW.dSignature; 

(5)設備狀態為ATTACHED


3. SETUP階段和數據階段

SETUP階段使用標準請求和類特定請求完成設備枚舉,由端點0的控制傳輸完成。 

IN過程 

(1)CTR_TX置位,發生中斷,根據USB_ISTR的EP_ID和DIR位識別出端點號和方向; 

(2)清除USB_EPnR. CTR_TX位; 

(3)填寫發送緩沖區,設置COUNTn_TX; 

(4)將STAT_TX設置為”11”,使能該端點的TX。 

OUT過程 

注意:SL_SIZE和NUM_BLOCK決定了最大接收字節數 

STAT_RX在接收數據后變為10(NAK) 

(1)CTR_RX置位,發生中斷,根據USB_ISTR. EP_ID位和USB_ISTR. DIR位識別出端點號和方向; 

(2)根據USB_EPnR. SETUP位確定事務類型,是OUT還是SETUP,同時清除USB_EPnR. CTR_RX位; 

(3)讀出緩沖區描述表指向的COUNTn_RX,獲得此次傳輸的字節數; 

(4)從ADDRn_RX處獲得數據; 

(5)使能下次接收,即設置USB_EPnR. STAT_RX位為”11”,使能該端點。


說明: 

- USB_CNTR. USB置位后所有的配置寄存器不會被復位,但設備的地址寄存器和端點寄存器會被USB復位所復位; 

- 使用雙緩沖機制時,STAT_TX和STAT_RX不會因為完成一次IN/OUT分組而被置為NAK; 

- 對于同步端點,端點的狀態只能是有效或者禁用,因此硬件不會在數據傳輸結束時改變端點的狀態; 

- 端點地址不一定要與端點號一致,由于用4位二進制表示(EA[3:0]),故端點地址取值為0 - 15,端點0作為控制端點,必須使其端點地址為0;


描述符(Descriptor)分類

設備描述符(Device Descriptor)

配置描述符(Configuration Descriptor)

接口描述符(Interface Descriptor)

端點描述符(Endpoint Descriptor)

字符描述符(String Descriptor)

報告描述符(Report Descriptor)

(*pProperty->Init)()

(*pProperty->Init)()完成了全速/低速設備上拉電阻檢測,復位,設置應用關心的中斷屏蔽位 

CNTR. CTRM,CNTR. RESETM,未完成端點傳輸類型,緩沖區描述表的配置,設備地址DADDR的配置(僅置0并置位USB_DADDR. EF來使能USB),在函數的最后:bDeviceState = UNCONNECTED 

而USB_Init()的下一條語句是while (bDeviceState != CONFIGURED),顯然接下來應該在中斷中完成緩沖區描述表填寫(USB_BTABLE),端點傳輸類型(USB_EPnR),枚舉過程的工作。


//USB中斷服務函數

USB_Istr()

{

...

#if (IMR_MSK & ISTR_RESET)

  if (wIstr & ISTR_RESET & wInterrupt_Mask)

  {

    _SetISTR((uint16_t)CLR_RESET);

    Device_Property.Reset();

#ifdef RESET_CALLBACK

    RESET_Callback();

#endif

  }

#endif

...

}


Device_Property.Reset()完成以下工作:

Device_Info.Current_Configuration = 0(同前)

pInformation->Current_Feature = MASS_ConfigDescriptor[7]

設置Buffer table的地址(BTABLE_ADDRESS) ,設備地址默認為0

初始化EP 

EP0:控制類型;發送NAK、接收Valid;設置接收buffer地址和長度;設置發送buffer地址

EP1:批量類型;發送NAK、接收Disable;設置發送buffer地址

EP2:批量類型;發送Disable、接收VALID;設置接收buffer地址和長度

bDeviceState = ATTACHED 全局變量,表示設備當前已被插入主機


這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

關于Setup0_Process()中調用DataStageIn()的原因

Setup0_Process() - > 處理標準request / class相關request -> 根據數據階段:如果是IN -> DataSatgeIn() 

USB Device收到IN Packet且地址正確后,訪問ADDRn_TX和COUNTn_TX,將相應緩沖區的內容通過移位寄存器發送出去,并等待Host發送ACK Package。Device收到ACK后toggle DTOG_TX位,硬件設置STAT_TX位為”10”(NAK),使端點無效,CTR_TX置位。應用程序需要清除中斷標志CTR_TX,把下次要發送的內容寫進ADDRn_TX指向的hw_buf,更新COUNTn_TX為需要發送的字節數,然后設置STAT_TX為”11”(VALID),使能數據傳輸。當STAT_TX為”10”(NAK)時,所有IN請求都會被NAK,Host不斷重發IN請求,直到該端點有效。


每次處理CTR_TX中斷時,寫進hw_buf的內容都是下次要發送的內容,因此,在首次處理IN請求之前需要準備好hw_buf,如果SETUP的數據階段是IN,就要在Setup0_Process()中調用DataStageIn()填充首次需要準備的內容。


關于端點地址的設置

In0_Process() -> WAIT_STATUS_IN -> 如果是SET_ADDR命令:寫寄存器 -> 設置各端點地址 

如果端點地址需要設置成與端點號不一致,需要修改本函數的部分


@

for(i=0; i_SetEPAddress((uint8_t)i, (uint8_t)i);

}


修改為:


@

_SetEPAddress(0,0);

_SetEPAddress(1,EP_ADDR1);

_SetEPAddress(2,EP_ADDR2);

這里寫圖片描述

非零端點的處理


這里寫圖片描述

USB請求格式

USB請求由SETUP transaction完成,一條完整的USB請求存放在其中的DATA0 packet中,字節序為小端模式。


偏移量 域 長度 描述

0 bmRequestType 1 請求特征

D7:傳輸方向

0=主機至設備

1=設備至主機

D6..5:種類

0=標準

1=類

2=廠商

3=保留

D4..0:接受者

0=設備

1=接口

2=端點

3=其他

4..31:保留

1 bRequest 1 命令類型編碼值

2 USBwValue 2 根據不同的命令,含義不同

4 USBwIndex 2 根據不同的命令,含義不同,主要用于傳送索引或偏移

6 USBwLength 2 數據階段的字節數,如果沒有數據階段則填0

USB Mass Storage Class

USB Mass Storage使用BOT(Bulk only Transfer)協議和SCSI指令來處理傳輸。相對于CBI(Control Bulk Interrupt)協議,BOT協議僅需要控制端點,一個Bulk IN端點和一個Bulk OUT端點即可完成命令、數據、狀態的傳輸,BOT狀態機如下圖所示: 

這里寫圖片描述


CBW(Command Block Wrapper)是一個31字節長的包,由Host發起,格式如下: 

 

dCBWSignature: 0x43425355 

dCBWTag: 用戶定義標簽,dCSWTag應當原樣返回 

dCBWDataTransferLength: 主機期望傳輸的數據長度。 

bmCBWFlags: 主要定義數據的傳輸方向,由bit 7定義(0-out, 1-in),其他比特默認為0 

bCBWLUN: 邏輯單元號 

bCBWCBLength: CB的有效長度 

CBWCB: 設備執行的命令塊,這里是SCSI命令,一般是16字節

這里寫圖片描述 

CSW(Command Status Wrapper)是Device收到Host發送的CBW并完成數據傳輸后向Host發送有關狀態信息的包,長度為13字節,格式如下: 

 這里寫圖片描述 

dCSWSignature: 0x53425355 

dCSWTag: 應當與dCBWTag一致 

dCSWDataResidue: 

bCSWStatus: CBW傳輸的成功或失敗狀態,為0表示傳輸成功,非0表示傳輸失敗, 如下表所示 


這里寫圖片描述

Class-Specific requests 

BOT協議要求支持兩個類相關請求: 

1. Bulk-only mass storage reset 

該請求用于復位Mass Storage設備及與其相關的接口。Device接收到請求后,清除兩個Bulk端點的data toggle,初始化CBW signature到默認值,設置BOT狀態機到BOT_IDLE狀態,以準備接收下一個CBW。 

該請求在Mass_NoDataSetup()@usb_prop.c中處理。 

2. Get Max LUN request 

一個Mass storage設備可能管理多個共享同一device特性的邏輯單元,host使用CBW中的bCBWLUN域決定當前使用哪一個邏輯單元。 

該請求在Mass_DataSetup()@usb_prop.c中處理。


Standard request requirements 

@usb_prop.c 

BOT協議規定,device在接收到以下兩個標準請求時必須響應相應的requirement:


Mass_Storage_SetConfiguration()


當device從unconfigured狀態轉換為configured狀態時,所有端點的data toggle都必須清零


Mass_Storage_ClearFeature()


當host發送了一個帶有非法signature或length的CBW時,device必須設置兩個Bulk端點的狀態為STALL,直到收到mass storage reset請求。


Mass_Storage_SetDeviceAddress()


設置device的地址


bDeviceState = ADDRESSED


這里寫圖片描述


關于獲取LUN數量的修改

USB Host獲取LUN數量是通過class-specified請求處理函數uint8_t *Get_Max_Lun(uint16_t Length)完成的,定位到Get_Max_Lun()可以看到LUN的數量由Max_Lun變量來確定,定位到變量定義處并修改,注意Max_Lun表示最大的LUN,LUN號從0開始,有兩個LUN,Max_Lun應該填1而不是2。 


這里寫圖片描述

這里寫圖片描述

從Bulk端點到存儲器訪問函數的流程

1. OUT(Mass_Storage_Write)

EP2_OUT_Callback()@usb_endp.c 

Mass_Storage_Out()@usb_bot.c 

Data_Len = USB_SIL_Read(EpAddr, Bulk_Data_Buff)@usb_sil.c 

??-> CBW_IDLE : CBW_Decode() ; CBW_DATA_OUT 

SCSI_Write10_Cmd(CBW.bLUN, SCSI_LBA, SCSI_BlkLen)@usb_scsi.c 

??-> 檢查地址合法性;BOT狀態轉換;EP2_RX設置為Valid 

Write_Memory(lun, LBA, BlockNbr)@memory.c 

??-> 處理packet到block的轉換,block地址到byte地址轉換 

MAL_Write(lun, ByteAddr, NumOfByte)@mass_mal.c 

??-> 寫入一個block


2. IN(Mass_Storage_Read)

EP1_IN_Callback()@usb_endp.c 

Mass_Storage_In()@usb_bot.c 

??-> CBW_IDLE : CBW_Decode() ; BOT_DATA_IN 

SCSI_Read10_Cmd(CBW.bLUN, SCSI_LBA, SCSI_BlkLen)@usb_scsi.c 

??-> 檢查地址合法性;BOT狀態轉換;在首次IN前調用Read_Memory()填充hw_buf 

Read_Memory(lun, LBA, BlockNbr)@memory.c 

??-> 處理block到packet的轉換,block地址到byte地址的轉換 

MAL_Read(lun, ByteAddr, NumOfByte)@mass_mal.c 

??-> 讀出一個block 

USB_SIL_Write(EP1_IN, (uint8_t *)Data_Buffer, BULK_MAX_PACKET_SIZE)@usb_sil.c 

??-> 分多次向EP1寫入packet


說明: 

@memory.c 

Write_Memory()函數和Read_Memory()函數定義的用于block到byte的地址、長度轉換的變量是uint32_t類型的,而32 bit無符號變量最大尋址能力是4G,也就是說sd card超過4G的部分無法訪問,所以需要修改類型為uint64_t。同時注意其調用的MAL_Write()和MAL_Read()函數的單位和數據類型。 

@mass_mal.c 

MAL_Write()和MAL_Read()函數的Input參數Memory_Offset和Transfer_Length單位是字節,注意Mass Storage的API,特別是SD卡的API,有些的單位是BlockAddr和NumOfBlock。


uint32_t Mass_Memory_Size[2];

uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)

uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)


這里的uint32_t也要修改成uint64_t 


這里寫圖片描述

這里寫圖片描述

USB HID Class

1. JoyStick Mouse

計算機顯示屏坐標增長方向 

X坐標 自左至右增大 

Y坐標 自上至下增大 

鼠標發送給PC的數據每次4個字節 

BYTE0 BYTE1 BYTE2 BYTE3


定義如下:

BYTE0 

bit7: 1 表示 Y坐標的變化量超出 -256~255 的范圍,0表示沒有溢出

bit6: 1 表示 X坐標的變化量超出 -256~255 的范圍,0表示沒有溢出

bit5: Y坐標變化的符號位,1表示負數,即鼠標向上移動

bit4: X坐標變化的符號位,1表示負數,即鼠標向左移動

bit3: 恒為1

bit2: 1表示中鍵按下

bit1: 1表示右鍵按下

bit0: 1表示左鍵按下

BYTE1 – X坐標變化量,與BYTE1的bit4組成9位符號數,負數表示向左移,正數表右移。用補碼表示變化量

BYTE2 – Y坐標變化量,與BYTE1的bit5組成9位符號數,負數表示向下移,正數表上移。用補碼表示變化量

BYTE3 – 滾輪變化。


關鍵字:USB  Device  STM32F103 引用地址:USB Device應用筆記(基于STM32F103)

上一篇:STM32的USRT通訊實現
下一篇:stm32 usb hid 移植時出現的問題及解決辦法

推薦閱讀

2018 年 5 月 21 日,紐約——美光科技有限公司(納斯達克股票代碼:MU)推出的業界首款基于革命性四層單元(QLC)NAND 技術的固態硬盤現已開始供貨。美光? 5210 ION 固態硬盤在美光2018年分析師和投資者大會上首次亮相,面向之前由硬盤驅動器 (HDD) 提供服務的細分市場,可提供高出三層單元 (TLC) NAND 33%的位密度。新型 QLC 固態硬盤...
格力電器再次在微博炮轟奧克斯。格力表示,用事實說話,已準備好充分證據供監管部門調閱,并視情況適時向社會公布。6月10日下午,格力電器在其微博上發布了奧克斯生產銷售不合格空調產品的舉報信。格力電器稱,經格力電器實驗室實測,奧克斯部分型號空調產品與其宣傳、標稱的能效值差距較大。格力電器稱,經其委托有專業資質的第三方機構檢測驗證,檢測結...
6月11日下午消息,小米剛剛正式發布了小米手環5,相比上代產品,小米手環5支持動態表盤,新增5種運動模式,并且首次采用磁吸式充電,加入遙控拍照,依然分為NFC版和標準版,售價分別是229元和189元。  動態彩顯大屏 百款個性主題表盤  小米手環5配備了一塊1.1英寸AMOLED動態彩顯大屏,是小米首款支持動態顯示功能的手環產品。根據小米的數...
調研機構Omdia發布最新報告表示,由于零組件吃緊、終端庫存水位低,下半年筆電面板需求仍將維持高檔,將全年出貨從2.63億片上調至2.73億片,年增幅擴大至19%,有助推升面板廠出貨。Omdia指出,去年第二季度以來,筆電面板已連續五個季度保持增長態勢,雖然品牌廠對面板需求有超額下單的憂慮,但從整體需求和終端庫存分析,下半年筆電仍可望維持高檔,預估...

史海拾趣

問答坊 | AI 解惑

請教一下,如果使用汽車電瓶供電,電源線上是否還有共模噪聲?

請教一下,如果使用汽車電瓶供電,電源線上是否還有共模噪聲?…

查看全部問答∨

斯巴魯推出翼豹WRX

翼豹WRX為2008車型推出一款全新平臺,包括較長的103.1英寸的軸距和一個全新的雙叉后懸吊系統。重新調校的懸吊系統為2009款WRX的駕駛性能的進一步的提升提供了保障。標準的17 x 7英寸的鋁合金輪圈,以及目前更換的225/45R17夏季高性能輪胎,替代了目 ...…

查看全部問答∨

線性電路中的過渡過程

線性電路中的過渡過程…

查看全部問答∨

有人在51最小系統板上用過擴展的6264嗎?幫幫忙

我在51在最小系統板上,使用擴展的6264,不能讀寫,不知道為什么,373,138都已經裝上了…

查看全部問答∨

播放器在wince5.0中,無法準確的定位播放位置

先詳細解釋一下標題的意思。    我的播放器運行在wince5.0中,我編寫了各種各樣的播放器,有使用WMP的,有使用TCPMP的,有使用用DSHOW的,都會有這么個情況:    我要跳轉到視頻的某個位置,比如說10s,不能準確的設置到10s,而 ...…

查看全部問答∨

【連載】【ALIENTEK MiniSTM32 開發板】STM32不完全手冊--PWM輸出實驗(實驗八)

ALIENTEK開發板購買地址:http://shop62103354.taobao.com/ [ 本帖最后由 正點原子 于 2010-8-30 09:37 編輯 ]…

查看全部問答∨

香帥,請教。MDK軟件仿真沒有CAN外設。

MDK 3.80 STM32F107 調試時,外設沒有CAN部分,我在網上聽說別人的有,我估計是不是安裝了什么插件。請教!上圖求真相! 下載 (31.08 KB) 2009-12-22 17:33 …

查看全部問答∨

求助:MSP430F149采樣問題

各位大俠,幫小弟看看這個問題: 我想用430做數據采集,雙通道數據采集,每個通道采集64個點之后,通過IO口來發送,現在是ADC這塊都有問題。采樣頻率為20KHz以上,使用TIMERA.OUT1為觸發源。 問題是:我單步運行運行到ADCTL0 |= ADC12SC;這條語句 ...…

查看全部問答∨

求c2000 renewable energy developer skit電路圖n

按理說在官網和controlSUITE上應該有的,但是我就是找不到,求個位大哥指點。具體實物為下圖: …

查看全部問答∨

魔法光繪

Arduino制作的魔法光繪…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 东乡族自治县| 灵璧县| 永济市| 皮山县| 泰兴市| 和林格尔县| 丰台区| 辰溪县| 柘荣县| 阿荣旗| 兴国县| 聂拉木县| 平邑县| 易门县| 乌兰浩特市| 汉川市| 喀喇沁旗| 清丰县| 靖西县| 大关县| 兴文县| 阿图什市| 长子县| 吉安县| 宜昌市| 白玉县| 临安市| 仙居县| 邵武市| 蒙城县| 沽源县| 文水县| 营口市| 青铜峡市| 麟游县| 白河县| 曲靖市| 曲周县| 任丘市| 潞西市| 山阳县|