1. 本篇是基於
STM32F401/411 HID Test(Keyboard + Mouse + HidRaw)這篇文章, 繼續探討HID雙向溝通的測試方式.
2. 範例程式下載連結: (使用IAR EWARM v7.7)
stm32f401_411_usb_device_hid_test_2016
============================= interrupt in/out =============================
3. 由於之前的範例僅有
mcu to pc(interrupt in)的這個部份, 因此首先我們要先補上
pc to mcu(interrupt out)的這個部份.
- 先到usbd_hid_core.c去新增相關function.
- 宣告USBD_HID_DataOut function.
- 將USBD_HID_DataOut 加入 callback function.
- 由於新增了endpoint out的描述, 因此需要加上endpoint out描述的length.
- 目前程式定義pc to mcu的data length為8bytes.
- 將程式燒進去後, 我們便可以開啟bus hound來進行測試, 當程式成功執行且與pc連結後, 應該會在bus hound上看到如下顯示的畫面, 此時我們選擇最上層的USB輸入裝置, 並double click它.
- 此時我們選擇endpont 1裡面的interrupt out端點, 接著將Data Length修改為8, 並在底下data的區域中輸入與畫面相同的資料, 且依照1 - 2 - 3 - 4的步驟執行..
- 我們可以從USBD_HID_DataOut裡面看到, 當接收完pc傳來的8bytes後, 程式便開始判斷要對哪一個LED執行on/off function, 其中我們目前只有用到Report_buf[0] 和 Report_buf[1]而已, 分別代表的意義如下:
Report_buf[0]: LED number
Report_buf[1]: On/Off
Report_buf[2]~Report_buf[7]: Reserve
- interrupt in/out 的bus hound操作圖.
- 當按下user button後, 就會開始透過interrupt in的端點來傳送資料給pc, 接著pc透過interrupt out去開啟/關閉LED3.
============================= control in/out =============================
4. 除了使用EP-1 interrupt in/out外, 還可以使用EP-0 control in/out這個方式來與 pc之間溝通, 因此首先我們要補上control in/out的程式.
- 將EP0的程式加到call back function.
- 接著在USBD_HID_Setup function內, 加入set report和get report這2個command.
- 接著完成EP0_RxReady和EP0_TxSent這兩個function.
- control out(set report command) flow:
- USBD_HID_Setup function => case HID_REQ_SET_REPORT => USBD_HID_EP0_RxReady function
- control in(get report command) flow:
- USBD_HID_Setup function => case HID_REQ_GET_REPORT => USBD_HID_EP0_TxSent function
- pc to mcu測試方式與interrupt out相同, 將程式燒入後, 使用bus hound打開裝置後, 對EP0 Control double click, 接著再輸入指令(set report), 則可以開啟/關閉LED.
- mcu to pc測試方式則如下所示, 按下列步驟操作則可以讀到預設的資料.
- control in/out 的bus hound操作圖.
- 使用set report command讓pc傳送資料給mcu來開啟/關閉LED, 接著pc再透過get report command去讀取資料.