2016年7月29日 星期五

[Qt] STM32F401 USB-HID Test with Qt

1. 延續之前的STM32F401/411 USB-Device HID Test(Control in/out & Interrupt in/out) 這篇測試
    所進行的延伸, 最大的差別在於之前測試時使用Bus Hound下命令去控制LED On/Off和接收
    Device上傳的資料, 而現在則改用Qt所寫的視窗程式來進行測試.

2. Test Video:
   

3. Test Code Link:



4. Tool Link:



5. To be continued......


2016年7月22日 星期五

2016年7月20日 星期三

[nRF52832] small evaluation board

最近在淘寶上購買了nRF52832的最小化開發板, 希望跟官方版本的一樣好用啊~~~~~~






2016年7月10日 星期日

STM32F401/411 USB-Device HID Test(Control in/out & Interrupt in/out)

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.
  • 將Endpoints由原先定義的1個改為2個.

  • 新增endpoint out的描述.


  • 由於新增了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的步驟執行..

  • 此時應該已經看到LED3已經開始亮起.

  • 我們可以從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所需使用的變數與程式進行宣告.
  • 將EP0的程式加到call back function.
  • 接著在USBD_HID_Setup function內, 加入set report和get report這2個command.

  • 接著完成EP0_RxReadyEP0_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去讀取資料.

2016年7月8日 星期五

STM32F429 USB-Host HID KeyBoard Test

1. 本範例是利用stm32f429 discovery board來實做出usb-host keyboard, 並把keyboard上按下的按鍵顯示在內建的LCM上.

2.  程式完整範例下載連結: (使用IAR EWARM v7.7)
     stm32f429_usb_host_hid_mouse_keyboard

3. Main flow:

  • 程式基本流程與stm32f429_usb_host_hid_mouse的內容幾乎一模一樣, 僅差別在mouse/keyboard的init/decode程式而已.
  • 程式一開始仍然是對usb host hid 去做init.
  • 跟host hid mouse有差異的地方在callback function.


4.  Test flow:
  • 在未接上Keyboard至裝置時, 僅會執行LED/Button/LCM的Init function.


  • 當接上keyboard且系統偵測到後, 會在LCM上顯示Keyboard的基本資訊., 若是要開始進行測試的話, 就需要按下user button.

  • 當按下user button後, 就會到達顯示的視窗, 此時在Keyboard上面按下按鍵, 就會顯示在LCM上面.

  • 這是按下"jkl456789"的訊息.

5. Test Video: 為了方便拍攝, 僅使用數字鍵盤測試.




2016年7月6日 星期三

STM32F429 USB-Host HID Mouse Test

1. 本範例是利用stm32f429 discovery board來實做出usb-host mouse, 並把mouse cursor和Button顯示在內建的LCM上.




2.  程式完整範例下載連結: (使用IAR EWARM v7.7)
     stm32f429_usb_host_hid_mouse

3. main flow:

  • 初始化Host HID

  • LCD/GPIO/Button的初始化放在 USBH_USR_Init() function 


  • mouse callback function主要有2個, 分別為Init和Decode.

4. Test Flow:
  • 程式燒錄上電後, 若是在未插入滑鼠的情況下, 則會看到如下的訊息, 代表USB Host Library開始運作.


  • 接著將mouse插入usb port, 則會看到基本的vid/pid等滑鼠相關的資訊.



  • 此時按下User Button後, 就可以看到滑鼠的滑動範圍和cursor, 還有left/middle/right button的顯示區.

5. Test Mouse model name:  Logitech M105


6. Test Video:

2016年7月3日 星期日

STM32F429 USB HID/VCP/MSC Test(keyboard + mouse + hidraw + virtual com port + mass storage)

1. 本範例是利用stm32f429 discovery board來實做出usb keyboard/mouse/hidraw/virtual com port/mass storage等裝置, 並送出簡單的測試資料來驗證是否正確.



2. 程式完整範例下載連結: (使用IAR EWARM v7.7)
    stm32f429_usb_hid_vcp_msc_example_code

3. main flow:

  • 程式用來切換hid or vcp or msc的設定在stm32f429i_discovery.h中, 現在預設的是MSC, 而底下的KeyBoardTest/MouseTest/HidRawTest等3個define, 則是決定可以進行哪些子項目的測試, 可以全部一起打開, 也可以只打開其中一個.


  • main loop主要在執行button scan, 當確認到按下user button後, 根據不同的define去送出不同的資料.

    • 特別需要注意的是當keyboard/mouse放開時, 需送出release key的event, 否則會看到連發key的情形出現, 而hidraw則不需要.
    4. test flow:
    • HID:
      • keyboard test: 可以先開啟一個空白文字檔來測試, 當按下user button時, 會送出一個小寫(in lowercase letters)的a出現, 放開即馬上停止輸出.
      • mouse test: 當按下user button時, 滑鼠鼠標會朝右上方移動, 放開即馬上停止輸出.
      • hidraw test: 測試時, 可先安裝Bus Hound tool, 接著接上stm32f429 discovery board, 若成功則可以看到我們新增出來的usb device(ex: [44]USB輸入裝置).


    按下user button後, 即可看到我們輸出的資料, 放開不需做其它處理即會自行停止輸出.

    • VCP:
      • 程式開始執行後, 先至裝置管理員確認是否有長出Virtual COM Port.

      • 接著開啟終端機程式(ex: putty)

      • 按下user button後, 就會看到如下的訊息開始打印.

    • MSC:
      • 主要操作的程式接放在usbd_storage_msd.c裡面, 包含disk size(96KB)和SRAM Init/SRAM Write/SRAM Read functions.

      • 程式開始執行後, 會先馬上看到產生需要格式化的訊息出現, 這時選擇格式化磁片.


      • 接著會看到磁碟的基本資訊, 大小正如同我們設定的一樣(96K RAM),按下開始執行格式化.
      • 等待執行完成.

      • 這時候去裝置管理員底下的磁碟機查看, 可以看到STM32 USB RAM-DISK USB Device.

      • 這時候就可以去磁碟底下進行跟隨身碟一樣的操作, 例如新增檔案, 或是資料夾等.