天天看點

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

程式功能

  • 将STM32的USB枚舉為HID裝置。
  • STM32使用3個端點,端點0用于枚舉用,端點1和2用于資料的發送和接收。
  • 端點長度為64,也就是單次最多可以傳輸64個位元組資料。
  • STM32擷取上位機下發的資料并将該資料通過USB原樣傳回,同時将資料列印輸出。
  • 上位機程式通過調用windows的API實作對HID裝置的讀寫控制。

USB接口原理圖:

<ignore_js_op>

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

HID枚舉成功:

<ignore_js_op>

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

程式效果圖

<ignore_js_op>

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

圖一 上位機程式運作圖

<ignore_js_op>

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

圖二  STM32序列槽列印輸出

<ignore_js_op>

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

圖三 Bus Hound抓取的資料

程式部分代碼

STM32的報告描述符:

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

複制代碼

上位機測試程式

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

複制代碼

源碼下載下傳

STM32程式下載下傳: <ignore_js_op>

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

 stm32_usb_hid.zip 

STM32F105/107版本源碼下載下傳: <ignore_js_op>

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

 usb_hid.rar 

HID上位機程式下載下傳(VS2010): <ignore_js_op>

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

 STM32_HID_PC_Driver.zip

HID上位機程式下載下傳(VS2008): <ignore_js_op>

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

 PC_HID.zip ) 

USB開發相關資料下載下傳

<ignore_js_op>

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

 USB2.0技術規範(中文).pdf

<ignore_js_op>

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

 Windows主機端與自定義USB_HID裝置通信詳解.pdf 

<ignore_js_op>

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

 STM32F10xxx USB-FS-Device firmware library.pdf 

<ignore_js_op>

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

 STM32F10xxx USB開發工具包.pdf 

<ignore_js_op>

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

 STM32_USB-FS-Device_Lib_V3.0.1.zip 

<ignore_js_op>

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

 STM32_usb固件庫.pdf 

<ignore_js_op>

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

 基于STM32的USB程式開發筆記.pdf 

<ignore_js_op>

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

 深入解析STM32_USB-FS-Device_Lib庫.pdf 

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

轉載于:https://www.cnblogs.com/flyheart33/p/3610866.html