客戶在做USB通訊的時候,基本的需求就是發送某些數據到USB host端,同時接收一些數據從USB Host端,那么如何快速的建立一個工程并驗證數據是否正確呢?下邊我們就結合STM32F072的評估板(其他的STM32xx系列的實現方式都是類似的)來快速實現一個簡單的數據收發實驗。
下面是具體操作和一些基本的解說。
USBHost軟件的準備
PC端軟件使用ST免費提供的Usb Hid Demonstrator。這個軟件可以在ST官網上免費下載到。連接地址:STSW-STM32084,此軟件調用的是windows標準的HID類驅動,所以無需安裝任何驅動程序及可運行。
下載安裝完這個軟件之后,我們就可以開始開發STM32的USB從機程序了。
首先,打開STM32CubeMX,新建工程,選擇STM32F072B-DISCOVERY開發板。
其次,在Pinout選項中,開打USB的device功能。
并在Middleware中選擇開啟class for IP中的 custom Human Interface Device(HID)
點擊“保存”后直接生成工程。我們這里以生成IAR工程為例,項目名叫做HID。
這樣我們的工程就基本成功了,但是還缺少最最關鍵的一步,就是USB主機和從機的通訊“協議”,這個協議在那里實現呢?因為我們Host端軟件已經是Usb Hid Demonstrator,那么這邊的協議就已經固定了(其實在實際的開發中大多是主機端和從機相互溝通后,軟件自行修改的),從機只需要對應這套協議即可。
將如下代碼復制,替換掉usbd_custom_hid_if.c文件中的同名數組。
__ALIGN_BEGIN static uint8_tCUSTOM_HID_ReportDesc_FS [USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
0x06, 0xFF, 0x00, /* USAGE_PAGE(Vendor Page: 0xFF00) */
0x09, 0x01, /* USAGE (Demo Kit) */
0xa1, 0x01, /* COLLECTION(Application) */
/* 6 */
/* LED1 */
0x85, LED1_REPORT_ID, /* REPORT_ID(1) */
0x09, 0x01, /* USAGE (LED 1) */
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, LED1_REPORT_COUNT, /*REPORT_COUNT (1) */
0xB1, 0x82, /* FEATURE(Data,Var,Abs,Vol) */
0x85, LED1_REPORT_ID, /* REPORT_ID(1) */
0x09, 0x01, /* USAGE (LED 1) */
0x91, 0x82, /* OUTPUT(Data,Var,Abs,Vol) */
/* 26 */
/* LED2 */
0x85, LED2_REPORT_ID, /* REPORT_ID 2*/
0x09, 0x02, /* USAGE (LED 2) */
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, LED2_REPORT_COUNT, /*REPORT_COUNT (1) */
0xB1, 0x82, /* FEATURE(Data,Var,Abs,Vol) */
0x85, LED2_REPORT_ID, /* REPORT_ID(2) */
0x09, 0x02, /* USAGE (LED 2) */
0x91, 0x82, /* OUTPUT(Data,Var,Abs,Vol) */
/* 46 */
/* LED3 */
0x85, LED3_REPORT_ID, /* REPORT_ID(3) */
0x09, 0x03, /* USAGE (LED 3) */
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, LED3_REPORT_COUNT, /*REPORT_COUNT (1) */
0xB1, 0x82, /* FEATURE(Data,Var,Abs,Vol) */
0x85, LED3_REPORT_ID, /* REPORT_ID(3) */
0x09, 0x03, /* USAGE (LED 3) */
0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */
/* 66 */
/* LED4 */
0x85, LED4_REPORT_ID, /* REPORT_ID4) */
0x09, 0x04, /* USAGE (LED 4) */
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, LED4_REPORT_COUNT, /*REPORT_COUNT (1) */
0xB1, 0x82, /* FEATURE(Data,Var,Abs,Vol) */
0x85, LED4_REPORT_ID, /* REPORT_ID(4) */
0x09, 0x04, /* USAGE (LED 4) */
0x91, 0x82, /* OUTPUT(Data,Var,Abs,Vol) */
/* 86 */
/* key Push Button */
0x85, KEY_REPORT_ID, /* REPORT_ID(5) */
0x09, 0x05, /* USAGE (Push Button)*/
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x82, /* INPUT(Data,Var,Abs,Vol) */
0x09, 0x05, /* USAGE (Push Button)*/
0x75, 0x01, /* REPORT_SIZE (1) */
0xb1, 0x82, /* FEATURE(Data,Var,Abs,Vol) */
0x75, 0x07, /* REPORT_SIZE (7) */
0x81, 0x83, /* INPUT(Cnst,Var,Abs,Vol) */
0x85, KEY_REPORT_ID, /* REPORT_ID(2) */
0x75, 0x07, /* REPORT_SIZE (7) */
0xb1, 0x83, /* FEATURE (Cnst,Var,Abs,Vol)*/
/* 114 */
/* Tamper Push Button */
0x85, TAMPER_REPORT_ID,/* REPORT_ID(6) */
0x09, 0x06, /* USAGE (Tamper PushButton) */
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x25, 0x01, /* LOGICAL_MAXIMUM (1)*/
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x82, /* INPUT(Data,Var,Abs,Vol) */
0x09, 0x06, /* USAGE (Tamper PushButton) */
0x75, 0x01, /* REPORT_SIZE (1) */
0xb1, 0x82, /* FEATURE(Data,Var,Abs,Vol) */
0x75, 0x07, /* REPORT_SIZE (7) */
0x81, 0x83, /* INPUT (Cnst,Var,Abs,Vol)*/
0x85, TAMPER_REPORT_ID,/* REPORT_ID(6) */
0x75, 0x07, /* REPORT_SIZE (7) */
0xb1, 0x83, /* FEATURE(Cnst,Var,Abs,Vol) */
/* 142 */
/* ADC IN */
0x85, ADC_REPORT_ID, /* REPORT_ID */
0x09, 0x07, /* USAGE (ADC IN) */
0x15, 0x00, /* LOGICAL_MINIMUM (0)*/
0x26, 0xff, 0x00, /* LOGICAL_MAXIMUM(255) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x81, 0x82, /* INPUT(Data,Var,Abs,Vol) */
0x85, ADC_REPORT_ID, /* REPORT_ID(7) */
0x09, 0x07, /* USAGE (ADC in) */
0xb1, 0x82, /* FEATURE (Data,Var,Abs,Vol)*/
/* 161 */
0xc0 /* END_COLLECTION */
};
注意:這里一定要覆蓋“同名”數組,千萬不要覆蓋錯了。
之后將如下代碼復制到usbd_custom_hid_if_if.h中。
評論
查看更多