1. 程式人生 > >基於STM32的USB列舉過程學習筆記(二)

基於STM32的USB列舉過程學習筆記(二)

    接下來介紹USB裝置的列舉,列舉就是從裝置讀取各種描述符資訊,這樣主機就可以根據這些資訊來載入合適的驅動,從而知道是什麼樣的裝置,如何進行通訊。 列舉過程使用的是控制傳輸。控制傳輸可以保證資料的正確性。控制傳輸分三個過程:建立過程,可選資料過程及狀態過程。

    下面介紹列舉的詳細過程。

    USB主機檢測到USB裝置插入後,就會先對裝置復位,並通過一個帶資料過程的控制傳輸完成裝置描述符的獲取。

    第一步,USB主機會往地址0的端點0傳送獲取裝置描述符的標準請求,傳送請求屬於控制傳輸的建立過程。建立過程是一個事務。首先是令牌包,即主機發送一個SETUP令牌,令牌的格式如上一篇描述的那樣,有令牌的PID,地址和端點號等;其次是資料包,SETUP使用DATA0資料包,資料包中包括標準請求的ID;最後是握手包,裝置只能使用ACK來應答,除非出錯不應答。下面根據網上找的USB協議分析捕捉的圖分析該建立過程。

    下面通過STM32官方的USB的例子,自己新增列印資訊,檢視該控制傳輸的建立工程中USB主機發送的請求。如上一篇介紹,我們只需根據硬體置的標誌位來判斷USB傳輸的狀態即可。在usb_istr.c的USB_Istr()函式中,根據中斷標誌,新增列印資訊。在正確傳輸中斷的處理函式CTR_LP()中Setup0_Process()函式表示端點0的建立過程,即上面USB主機復位獲取裝置描述符將執行的函式。增加列印資訊的函式如下:

/*******************************************************************************
* Function Name  : Setup0_Process
* Description    : Get the device request data and dispatch to individual process.
* Input          : None.
* Output         : None.
* Return         : Post0_Process.
*******************************************************************************/
uint8_t Setup0_Process(void)
{

  union
  {
    uint8_t* b;
    uint16_t* w;
  } pBuf;

#ifdef STM32F10X_CL
  USB_OTG_EP *ep;
  uint16_t offset = 0;
 
  ep = PCD_GetOutEP(ENDP0);
  pBuf.b = ep->xfer_buff;
#else  
  uint16_t offset = 1;
  
  pBuf.b = PMAAddr + (uint8_t *)(_GetEPRxAddr(ENDP0) * 2); /* *2 for 32 bits addr */
#endif /* STM32F10X_CL */

#ifdef  USB_DEBUG0
  printf("\r\nSETUP0中斷-->控制傳輸.建立過程\r\n");
#endif /* #if USB_DEBUG0 */

  if (pInformation->ControlState != PAUSE)
  {
#ifdef USB_DEBUG0
    printf("裝置可以接收新的資料\r\n");
#endif /* USB_DEBUG0 */
    pInformation->USBbmRequestType = *pBuf.b++; /* bmRequestType */
    pInformation->USBbRequest = *pBuf.b++; /* bRequest */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwIndex  = ByteSwap(*pBuf.w++); /* wIndex */
    pBuf.w += offset;  /* word not accessed because of 32 bits addressing */
    pInformation->USBwLength = *pBuf.w; /* wLength */

#ifdef USB_DEBUG0
    printf("裝置接收資料如下:\r\n");
    printf("0x%x ",pInformation->USBbmRequestType);//用於指定請求的 資料傳輸反向 請求型別 請求的接收者
    printf("0x%x ",pInformation->USBbRequest);//標準請求及程式碼

    printf("0x%x ",pInformation->USBwValue0);
    printf("0x%x ",pInformation->USBwValue1);//具體見圈圈書P77頁

    printf("0x%x ",pInformation->USBwIndex0);
    printf("0x%x ",pInformation->USBwIndex1);  

    printf("0x%x ",pInformation->USBwLength1);
    printf("0x%x ",pInformation->USBwLength0);

    printf("\r\n");
#endif /* USB_DEBUG0 */
  }
return Post0_Process();
pInformation->ControlState = SETTING_UP;
  if (pInformation->USBwLength == 0)
  {
    /* Setup with no data stage */
    NoData_Setup0();
  }
  else
  {
    /* Setup with data stage */
    Data_Setup0();
  }
  return Post0_Process();
}

在列印資訊之後直接就讓函式返回,使主機得不到ACK應答,下面根據列印資訊看下測試情況。


根據列印資訊,由於從機沒有ACK應答給PC機的請求,在PC機嘗試發了3次請求後,就放棄了。可以在PC機的裝置管理器看到,在請求列印3次以後出現了unknown device。

關於8個位元組的請求程式碼的具體含義請參照USB協議,或者在《圈圈教你玩USB》裡面對照。

    以上就是列舉過程獲取裝置描述符的第一步控制傳輸的建立過程,主機發送獲取描述符的請求,下一篇我們將程式碼中ACK返回,使主機接收到建立過程的應答,從而進入到資料過程,即裝置響應主機的請求,將裝置描述符傳送給主機。

相關推薦

基於STM32的USB列舉過程學習筆記()

    接下來介紹USB裝置的列舉,列舉就是從裝置讀取各種描述符資訊,這樣主機就可以根據這些資訊來載入合適的驅動,從而知道是什麼樣的裝置,如何進行通訊。 列舉過程使用的是控制傳輸。控制傳輸可以保證資料的正確性。控制傳輸分三個過程:建立過程,可選資料過程及狀態過程。    

基於STM32的USB列舉過程學習筆記(一)

     之前使用ST官方的庫以及網路的資料,完成了使用USB HID類進行STM32和PC機的通訊。由於其他原因並沒有深入的分析,雖然實現了功能,但是關於USB裝置的列舉,以及具體的通訊方式都沒有清晰的概念,所以現在回頭重新學習USB相關知識。主要參考資料是《圈圈教你玩

基於STM32的USB列舉過程學習筆記(四)

    前幾篇介紹中,USB主機完成了獲取裝置的描述符,現在進入第二步,設定裝置的地址階段。     該階段是一個無資料過程的控制傳輸。首先,在建立過程中USB主機往裝置的端點0發出一個設定地址的請求,新地址在建立過程的資料包中。該事務的結構包括:SETUP0令牌包+SET

基於.NET的CAD次開發學習筆記:AutoCAD .NET中的物件

1、CAD物件 一個CAD檔案(DWG檔案)即對應一個數據庫,資料庫中的所有組成部分,看的見(包括點、多段線、文字、圓等)和看不見(圖層、線型、顏色等)的都是物件,資料庫本身也是一個物件。 直線、圓弧、文字和標註等圖形物件都是物件。 線型與標註樣式等樣式設定都是物件。 圖層

評估深度學習模型-基於keras的python學習筆記

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_44474718/article/details/86238644 一、自動評估 keras可將資料集一部分分成評估資料集,並在每個epoch中使用該評估資料集對模型進行評

springboot學習筆記():基於MySql資料庫的JDBC操作

1 , 連線資料庫 SpringBoot的Web應用中,基於MySql資料庫的JDBC操作 JDBC 連線資料庫主要配置 1 , 屬性配置檔案(application.properties) spring.datasource.url=jdbc:

學習筆記)——基於opencv人臉檢測原理及實現

最近搞了幾天的人臉檢測,終於把大體框架和原理搞清楚了,現在寫出來供大家學習之用,如有不對之處,還請大家指正。也希望大家在學習opencv的過程中能將學習過程及重點記錄下來,以部落格的形式分析,畢竟opencv的教材還不太多,我們自己學習大部分要靠網上的資料。通過部落格分享的

oracle學習筆記()分享之儲存過程巢狀遊標例子

create or replace procedure aa1 is v_aa varchar2(20); v_bb varchar2(20); va_aa varchar2(20); va_bb varchar2(20); va_number_aa number; mess

SpringMVC學習筆記:常用註解

title c學習 請求 pin 學習 lin att 詳解 stp 轉載請註明原文地址:http://www.cnblogs.com/ygj0930/p/6831976.html 一、用於定義類的註解:@Controller @Controller 用於標記在一個類上,

Scala學習筆記()(for循環相關)

spa nts multiple bool val turn 優化 n) 例子 Scala裏if...else語句 if語句不管是在哪種語言裏是使用最多的語句了. scala的if語句與java如出一轍. 舉個栗子就不再贅述: 一個 if 語句的語法: if(Boolean

Android APK安裝過程學習筆記

屏蔽 組成 學習 二進制 替換 壓縮包 基於 壓縮 方式 1.什麽是APK   APK,即Android Package,Android安裝包。不同平臺的安裝文件格式都不同,類似於Windows的安裝包是二進制的exe格式,Mac的安裝包是dmg格式。APK可以再Andro

ES6學習筆記()——字符串擴展

兩個 -m 開始 部分 學習筆記 erro xxx ocs 個數 相信很多人也和我一樣,不喜歡這樣循規蹈矩的逐條去學習語法,很枯燥乏味。主要是這樣學完一遍之後,沒過一段時間就忘到九霄雲外了。不如實際用到的時候研究它記得牢靠,所以我就整理成筆記,加深記憶的同時便於復習查看。

MySQL學習筆記(

發送 int 賦值 數據庫基礎知識 font 字符 需要 con spa -- 回顧 數據庫基礎知識: 關系型數據庫(磁盤),建立在關系模型上的數據庫,數據結構(二維表),浪費空間。 操作數據的指令集合:SQL(DDL,DML[DQL]和DCL) 完整性約束:表內和表之間(

Android第一行代碼學習筆記---在活動中使用Toast

一行代碼 就會 onclick log sta contex instance and undle Toast:是Android系統提供的一種非常好的提醒方式,在程序中可以使用它將一些短小的信息通知給用戶,這些信息會在一段時間後自動消失,並且不會占用任何屏幕空間。 首先需要

framework7學習筆記:基礎知識

部分 cnblogs query 基礎 logs code 自己 $$ pan 一:DOM7 framework7有自己的 DOM7 - 一個集成了大部分常用DOM操作的高性能庫。它的用法和jQuery幾乎是一樣的,包括大部分常用的方法和jquery風格的鏈式調用。 在開發

node.js學習筆記之版本問題

nodejs targe tle 下一個 .cn blank 網站 mage 功能 一、版本說明 進入node.js官網https://nodejs.org/en/download/ 點擊上面的【All download options】進入到所有下載列表的地址 下載地

Java基礎學習筆記 網絡編程

數據丟失 交互圖 主動 總結 交互 servers -- 處理 關閉 絡通信協議 通過計算機網絡可以使多臺計算機實現連接,位於同一個網絡中的計算機在進行連接和通信時需要遵守一定的規則,這就好比在道路中行駛的汽車一定要遵守交通規則一樣。在計算機網絡中,這些連接和通信的規則被

Java基礎學習筆記十三 Java核心語法之反射

負責 目錄 boolean tostring 筆記 str 編譯 三種 進制 類加載器 類的加載 當程序要使用某個類時,如果該類還未被加載到內存中,則系統會通過加載,鏈接,初始化三步來實現對這個類進行初始化。 加載就是指將class文件讀入內存,並為之創建一個Clas

Java基礎學習筆記十四 MySQL安裝圖解

password data 默認 count 重新 doc documents tran xp系統 、MYSQL的安裝 1、打開下載的mysql安裝文件mysql-5.5.27-win32.zip,雙擊解壓縮,運行“setup.exe”。

Java基礎學習筆記十七 DBUtils和連接池

ride 基本 代碼塊 ear 不同 一行 ria 靜態方法 ... DBUtils 如果只使用JDBC進行開發,我們會發現冗余代碼過多,為了簡化JDBC開發,本案例我們講采用apache commons組件一個成員:DBUtils。DBUtils就是JDBC的簡化開發工