由于項(xiàng)目需要,使用了stm32f107的芯片,移植了STM32_USB-Host-Device_Lib_V2.2.0 官方usb固件庫,在UCOSII上運(yùn)行,剛開始使用的是STM32_USB-FS-Device_Lib_V2.3.0的庫,這個庫網(wǎng)上資源較多,但是在使用的時(shí)候發(fā)現(xiàn)這個庫和UCOSII的延時(shí)函數(shù)有沖突,導(dǎo)致ucos操作系統(tǒng)不能正常運(yùn)行,經(jīng)過調(diào)試沒有發(fā)現(xiàn)原因,調(diào)試期間在st官網(wǎng)找到了最新的固件庫STM32_USB-Host-Device_Lib_V2.2.0,于是移植過來使用,發(fā)現(xiàn)UCOS操作系統(tǒng)正常運(yùn)行,官方提供的例程使用了端點(diǎn)1作為數(shù)據(jù)輸入輸出,我想改成端點(diǎn)1輸入,端點(diǎn)2輸出,通過查看 官網(wǎng)的庫用戶文檔CD00289278.pdf找到了修改方法,因?yàn)槲沂鞘褂玫?customhid的例程,所以以下的修改適用于customhid例程,修改注意這些文件
usbd_conf.h , usb_conf.h , usbd_customhid_core.c
其中 usbd_conf.h 修改 如下宏定義
#define HID_IN_EP 0x81 設(shè)備->主機(jī) 0x8x 表示IN端點(diǎn)x
#define HID_OUT_EP 0x02 主機(jī)->設(shè)備 0x0x 表示OUT端點(diǎn)x
#define HID_IN_PACKET 64 IN包長度
#define HID_OUT_PACKET 64 OUT包長度
usb_conf.h 修改 如下宏定義
#define RX_FIFO_FS_SIZE 128 接收FIFO長度
#define TX0_FIFO_FS_SIZE 64 發(fā)送端點(diǎn)0FIFO長度
#define TX1_FIFO_FS_SIZE 64 發(fā)送端點(diǎn)1FIFO長度
#define TX2_FIFO_FS_SIZE 64 發(fā)送端點(diǎn)2FIFO長度
#define TX3_FIFO_FS_SIZE 64 發(fā)送端點(diǎn)3FIFO長度
usbd_customhid_core.c修改
1:修改配置描述符,如果要實(shí)現(xiàn)自定義雙向通信還要修改報(bào)告描述符(參考了圈圈的書)
下面是我實(shí)現(xiàn)雙向通信的配置描述符和報(bào)告描述符
配置描述符:
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
USB_CUSTOM_HID_CONFIG_DESC_SIZ,
/* wTotalLength: Bytes returned */
0x00,
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: Configuration value*/
0x00, /*iConfiguration: Index of string descriptor describing
the configuration*/
0xC0, /*bmAttributes: bus powered and Support Remote Wake-up */
0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/
/************** Descriptor of Custom HID interface ****************/
/* 09 */
0x09, /*bLength: Interface Descriptor size*/
USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
0x00, /*bInterfaceNumber: Number of Interface*/
0x00, /*bAlternateSetting: Alternate setting*/
0x02, /*bNumEndpoints*/
0x03, /*bInterfaceClass: HID*/
0x00, /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
0x00, /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
0, /*iInterface: Index of string descriptor*/
/******************** Descriptor of Custom HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size*/
CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/
0x11, /*bcdHID: HID Class Spec release number*/
0x01,
0x00, /*bCountryCode: Hardware target country*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow*/
0x22, /*bDescriptorType*/
USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/
0x00,
/******************** Descriptor of Custom HID endpoints ***********/
/* 27 */
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
HID_IN_EP, /* bEndpointAddress: Endpoint Address (IN) */
0x03, /* bmAttributes: Interrupt endpoint */
HID_IN_PACKET, /* wMaxPacketSize: 64 Bytes max */
0x00,
0x01, /* bInterval: Polling Interval (32 ms) */
/* 34 */
0x07, /* bLength: Endpoint Descriptor size */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */
/* Endpoint descriptor type */
HID_OUT_EP, /* bEndpointAddress: */
/* Endpoint Address (OUT) */
0x03, /* bmAttributes: Interrupt endpoint */
HID_OUT_PACKET, /* wMaxPacketSize: 64 Bytes max */
0x00,
0x01, /* bInterval: Polling Interval (20 ms) */
/* 41 */
} ;
報(bào)告描述符:
static uint8_t CustomHID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] =
{
0x06,0x00,0xff,/* USAGE_PAGE */
0x05, 0x8c, /* USAGE_PAGE (ST Page) */
0x09, 0x01, /* USAGE (Demo Kit) */
0xa1, 0x01, /* COLLECTION (Application) */
// The Input report
0x09,0x03, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8bit)
0x95,0x40, // REPORT_COUNT (64Byte)
0x81,0x02, // INPUT (Data,Var,Abs)
// The Output report
0x09,0x04, // USAGE ID - Vendor defined
0x15,0x00, // LOGICAL_MINIMUM (0)
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
0x75,0x08, // REPORT_SIZE (8bit)
0x95,0x40, // REPORT_COUNT (64Byte)
0x91,0x02, // OUTPUT (Data,Var,Abs)
0xc0 /* END_COLLECTION */
}; /* CustomHID_ReportDescriptor */
2:修改端點(diǎn)初始化函數(shù):
static uint8_t USBD_CUSTOM_HID_Init (void *pdev,
uint8_t cfgidx)
{
/* Open EP IN */
DCD_EP_Open(pdev,
HID_IN_EP,
HID_IN_PACKET,
USB_OTG_EP_INT);
/* Open EP OUT */
DCD_EP_Open(pdev,
HID_OUT_EP,
HID_OUT_PACKET,
USB_OTG_EP_INT);
return USBD_OK;
}
static uint8_t USBD_CUSTOM_HID_DeInit (void *pdev,
uint8_t cfgidx)
{
/* Close HID EPs */
DCD_EP_Close (pdev , HID_IN_EP);
DCD_EP_Close (pdev , HID_OUT_EP);
return USBD_OK;
}
完成了上面的修改,下一步就是如何接收數(shù)據(jù)和發(fā)送數(shù)據(jù):
發(fā)送數(shù)據(jù)使用
uint8_t USBD_CUSTOM_HID_SendReport (USB_OTG_CORE_HANDLE *pdev,
uint8_t *report,
uint16_t len)
{
if (pdev->dev.device_status == USB_OTG_CONFIGURED )
{
DCD_EP_Tx (pdev, HID_IN_EP, report, len);
}
return USBD_OK;
}
函數(shù),這里有個要注意的地方就是在usbd_customhid_core.c中有一個發(fā)送中斷回調(diào)函數(shù),如果想把IN端口改為其他的端點(diǎn),需要將if (epnum == 1) PrevXferDone = 1中的epnum修改為對應(yīng)的端點(diǎn),否則會發(fā)送不出去數(shù)據(jù),回調(diào)函數(shù)原型如下
static uint8_t USBD_CUSTOM_HID_DataIn (void *pdev,
uint8_t epnum)
{
/* Ensure that the FIFO is empty before a new transfer, this condition could
be caused by a new transfer before the end of the previous transfer */
DCD_EP_Flush(pdev, HID_IN_EP);
if (epnum == 1) PrevXferDone = 1;
return USBD_OK;
}
接收數(shù)據(jù)使用如下回調(diào)函數(shù)
uint8_t USBD_CUSTOM_HID_DataOut (void *pdev,
uint8_t epnum)
{
return USBD_OK;
}
調(diào)用 uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev,
uint8_t ep_addr,
uint8_t *pbuf,
uint16_t buf_len) 函數(shù);
上一篇:USB Device應(yīng)用筆記(基于STM32F103)
下一篇:STM32F103系列USB的學(xué)習(xí)過程及使用心得(一)(概括篇)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- 意法半導(dǎo)體緊湊型可配置車規(guī)負(fù)載驅(qū)動器具備安全引腳
- 美光宣布在美投資增至 2000 億美元,加建晶圓廠和 HBM 封裝設(shè)施
- AMD舉辦Advancing AI 2025大會:Instinct MI350系列GPU發(fā)布,35倍推理性能提升
- 特斯拉起訴前Optimus機(jī)器人工程師,指控其竊取商業(yè)機(jī)密
- Nordic Semiconductor將在MWC上海2025上展示前沿蜂窩物聯(lián)網(wǎng)解決方案
- SiC 市場的下一個爆點(diǎn):共源共柵(cascode)結(jié)構(gòu)詳解
- 香港科技大學(xué)工學(xué)院推出擬人化自動駕駛系統(tǒng)
- 現(xiàn)代摩比斯推出新型安全技術(shù) 防止追尾碰撞
- 研究人員開發(fā)新型機(jī)器人系統(tǒng) 利用AI賦能機(jī)器人技術(shù)
- 研究人員開發(fā)具有突破性觸覺靈敏度的機(jī)械手 可實(shí)現(xiàn)類人靈巧操作
- 張洪為:中國工程師待遇不高 且40歲后還有失業(yè)之憂
- 爆料:華為Mate40系列將發(fā)布!自由曲面技術(shù)鏡片+可測溫TOF
- 蘋果和三星的相愛相殺:我恨你,但我需要你
- 用百億美元中國進(jìn)口關(guān)稅對抗中國?美癡迷半導(dǎo)體霸主夢
- 美媒稱國會要審查谷歌華為合作:中美數(shù)字冷戰(zhàn)加劇
- 任務(wù)2:PCB投板方法
- 任務(wù)3:直接應(yīng)用寄存器點(diǎn)亮LED
- 任務(wù)4:控制指定LED的亮滅
- 任務(wù)5:應(yīng)用層次化軟件設(shè)計(jì)思想實(shí)現(xiàn)多路LED閃爍
- 任務(wù)6:認(rèn)知ATmega168PA最小工作系統(tǒng)
- 三星Display初始化時(shí)關(guān)于SPI通訊的問題
- 電路板老化試驗(yàn)怎么做
- 基于ZX-2型FPGA開發(fā)板的串口示波器(一)
- 關(guān)于指紋識別儀的開發(fā)問題 biokey 3.8
- [分享]好的電路的寓意~~優(yōu)秀男人
- 昨天發(fā)帖發(fā)現(xiàn)大家很不理解2538 zigbee跑6lowpan,roll,最終使用CoAP的意義說明一下
- ADAS:基于ADSP-BF592的低成本車道偏離告警解決方案
- TI 電源設(shè)計(jì)小貼士 42
- 射頻前端技術(shù)介紹
- pic16f1828能同時(shí)寫出1m,100k,10k的PWM嗎?