STM32例程之USB HID雙向數據傳輸(源碼下載)【轉】


程序功能


  • 將STM32的USB枚舉為HID設備。
  • STM32使用3個端點,端點0用於枚舉用,端點1和2用於數據的發送和接收。
  • 端點長度為64,也就是單次最多可以傳輸64個字節數據。
  • STM32獲取上位機下發的數據並將該數據通過USB原樣返回,同時將數據打印輸出。
  • 上位機程序通過調用windows的API實現對HID設備的讀寫控制。

USB接口原理圖:
<ignore_js_op>USB.jpg 
HID枚舉成功:
<ignore_js_op>1.jpg 
程序效果圖

<ignore_js_op>1.jpg 
圖一 上位機程序運行圖
<ignore_js_op>2.jpg 
圖二  STM32串口打印輸出
<ignore_js_op>3.jpg 
圖三 Bus Hound抓取的數據
程序部分代碼
STM32的報告描述符:

  1. const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 
  2.         0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 
  3.         0x09, 0x01, /* USAGE (Demo Kit) */ 
  4.         0xa1, 0x01, /* COLLECTION (Application) */ 
  5.         
  6.         // The Input report 
  7.         0x09,0x03, // USAGE ID - Vendor defined 
  8.         0x15,0x00, // LOGICAL_MINIMUM (0) 
  9.         0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 
  10.         0x75,0x08, // REPORT_SIZE (8bit) 
  11.         0x95,0x40, // REPORT_COUNT (64Byte) 
  12.         0x81,0x02, // INPUT (Data,Var,Abs) 
  13.         // The Output report 
  14.         0x09,0x04, // USAGE ID - Vendor defined 
  15.         0x15,0x00, // LOGICAL_MINIMUM (0) 
  16.         0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 
  17.         0x75,0x08, // REPORT_SIZE (8bit) 
  18.         0x95,0x40, // REPORT_COUNT (64Byte) 
  19.         0x91,0x02, // OUTPUT (Data,Var,Abs) 
  20.         0xc0 /* END_COLLECTION */ 
  21. }; /* CustomHID_ReportDescriptor */
復制代碼

上位機測試程序

  1. /**
  2.   * @brief  發送數據后讀取數據 
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void HIDSampleFunc(void)   
  7. {       
  8.         HANDLE       hDev;       
  9.         BYTE         recvDataBuf[1024],reportBuf[1024];;                   
  10.         DWORD        bytes;       
  11.         hDev = OpenMyHIDDevice(0); // 打開設備,不使用重疊(異步)方式 ;      
  12.         if (hDev == INVALID_HANDLE_VALUE){           
  13.                 printf("INVALID_HANDLE_VALUE\n");
  14.                 return;  
  15.         }
  16.         reportBuf[0] = 0; // 輸出報告的報告 ID 是 0      
  17.         for(int i=0;i<REPORT_COUNT;i++){
  18.                 reportBuf[i+1]=i+1;//將數據存放在數據緩沖區
  19.         }
  20.         printf("開始寫數據到設備...\n");
  21.         // 寫入數據到設備,注意,第三個參數值必須為REPORT_COUNT+1,否則會返回1784錯誤
  22.         if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){           
  23.                 printf("write data error! %d\n",GetLastError());
  24.                 return;    
  25.         }else{
  26.                 printf("成功向設備寫出%d個數據... \n",bytes);
  27.         }
  28.         printf("開始從設備讀取數據...\n");
  29.         // 從設備讀取數據,注意,第三個參數值必須大於等於REPORT_COUNT+1,否則會返回1784錯誤
  30.         if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 讀取設備發給主機的數據  
  31.                 printf("read data error! %d\n",GetLastError());
  32.                 return;    
  33.         }else{
  34.                 printf("成功向設備讀出%d個數據... \n",bytes);
  35.         }
  36.         printf("設備返回的數據為:\n");
  37.         //顯示讀取回來的數據
  38.         for(int i=0;i<REPORT_COUNT;i++){
  39.                 printf("0x%02X ",recvDataBuf[i+1]);
  40.         }
  41.         printf("\n\r");
  42. }  
復制代碼

源碼下載
STM32程序下載: <ignore_js_op> stm32_usb_hid.zip 
STM32F105/107版本源碼下載: <ignore_js_op> usb_hid.rar 
HID上位機程序下載(VS2010): <ignore_js_op> STM32_HID_PC_Driver.zip
HID上位機程序下載(VS2008): <ignore_js_op> PC_HID.zip ) 

USB開發相關資料下載
<ignore_js_op> USB2.0技術規范(中文).pdf
<ignore_js_op> Windows主機端與自定義USB_HID設備通信詳解.pdf 
<ignore_js_op> STM32F10xxx USB-FS-Device firmware library.pdf 
<ignore_js_op> STM32F10xxx USB開發工具包.pdf 
<ignore_js_op> STM32_USB-FS-Device_Lib_V3.0.1.zip 
<ignore_js_op> STM32_usb固件庫.pdf 
<ignore_js_op> 基於STM32的USB程序開發筆記.pdf 
<ignore_js_op> 深入解析STM32_USB-FS-Device_Lib庫.pdf 

出處:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199&extra=&page=1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM