首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 USB-HID通信移植步骤

STM32 USB-HID通信移植步骤

很久没写过文章了,趁今晚有空出来露一下。最近发现很多人对STM32USB通信很感兴趣。要将USB的通信协议搞懂确实是一个比较漫长的过程。但是USBHID通信无论是上位机的设计还是STM32程序的编程都非常的简单。只是我想很多人都不知道而已。这篇文章的目的是让大家以最短的时间将USB加到你的设备中。如果想学得更深就靠大家。


HID
只是适合低速传输,其理论上可以达到64KB/S,但多由于windows系统和硬件的关系一般达不到这个传输数度。但这个速度对于一般系统的控制和数据传输都已经足够了,而且是免驱,省去了很多麻烦。如果您需要高速传输可参考我的另外一篇文章《STM32USB例程修改步骤》文章在http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx


一、安装完MDK后请打开C:/Keil/ARM/Examples/ST/STM32F10xUSBLib/Demos路径,将Custom_HID在同一个目录下复制一份,如果你要放到其他路径你需要在MDK Options for targetC/C++中添加USB的头文件路径(MDK下的/INC/ST/STM32F10x/USB)。
二、打开usb_desc.c文件,该文件主要包含的端点描述符、设备描述符、配置描述符和字符描述符等。具体请大家参考其他资料了,这里主要说几个常用。






u8 DeviceDescriptor[SIZ_DEVICE_DESC]USB设备描述符。当中的
0x83,
/*idVendor (0x0483)*/

0x04,
0x50,
/*idProduct = 0x5750*/

0x57,
//idVender字段。厂商ID号,我们这里取0x0483,仅供实验用。
//实际产品不能随便使用厂商ID号,必须跟USB协会申请厂商ID号。
//注意小端模式,低字节在先。
//idProduct字段。产品ID号,我们这里取0x5750
//注意小端模式,低字节应该在前。






const u8 ConfigDescriptor[SIZ_CONFIG_DESC]是配置描述符,注意如下

USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */




0x81,
/* bEndpointAddress: Endpoint Address (IN) */


0x03,
/* bmAttributes: Interrupt endpoint */


0x02,
/* wMaxPacketSize: 2 Bytes max */


0x00,


0x20,
/* bInterval: Polling Interval (32 ms) */


/* 34 */





0x07,
/* bLength: Endpoint Descriptor size */


USB_ENDPOINT_DESCRIPTOR_TYPE,
/* bDescriptorType: */


/*
Endpoint descriptor type */


0x01,
/* bEndpointAddress: */


/*
Endpoint Address (OUT) */


0x03,
/* bmAttributes: Interrupt endpoint */


0x02,
/* wMaxPacketSize: 2 Bytes max
*/


0x00,

0x20,
/* bInterval: Polling Interval (20 ms) */



上面包含了“输入端点描述符”和“输出端点描述符”。
//wMaxPacketSize字段。该端点的最大包长。
//bInterval字段。端点查询的时间,


为了实现更高速的通信我们修改如下:

/******************** Descriptor of
endpoint ********************/


/* 27 */


0x07,
/*bLength: Endpoint Descriptor size*/


USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/




0x81,
/*bEndpointAddress: Endpoint Address (IN)*/


0x03,
/*bmAttributes: Interrupt endpoint*/


0x40,
/*wMaxPacketSize: 64 Byte max */


0x00,


0x0A,
/*bInterval: Polling Interval (10 ms)*/


/* 34 */


/******************** Descriptor of
endpoint ********************/


/* 27 */


0x07,
/*bLength: Endpoint Descriptor size*/


USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/




0x01,
/*bEndpointAddress: Endpoint Address (OUT)*/


0x03,
/*bmAttributes: Interrupt endpoint*/


0x40,
/*wMaxPacketSize: 64 Byte max */


0x00,


0x0A,
/*bInterval: Polling Interval (10 ms)*/







const u8 ReportDescriptor[SIZ_REPORT_DESC]HID专用的报告描述符,具体的大家就参考资料了,这里可以直接复制了。
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =

{


0x05, 0xFF,
// USAGE_PAGE(User define)


0x09, 0xFF,
// USAGE(User define)


0xa1, 0x01,

// COLLECTION (Application)


0x05, 0x01,
// USAGE_PAGE(1)


0x19, 0x00,
//
USAGE_MINIMUM(0)


0x29, 0xFF,
//
USAGE_MAXIMUM(255)


0x15, 0x00,
//
LOGICAL_MINIMUM (0)


0x25, 0xFF,
//
LOGICAL_MAXIMUM (255)


0x75, 0x08,
//
REPORT_SIZE (8)


0x95, 0x40,
//
REPORT_COUNT (64)


0x81, 0x02,
//
INPUT (Data,Var,Abs)


0x05, 0x02,
// USAGE_PAGE(2)


0x19, 0x00,
//
USAGE_MINIMUM (0)


0x29, 0xFF,
//
USAGE_MAXIMUM (255)


0x15, 0x00,
//
LOGICAL_MINIMUM (0)


0x25, 0xFF,
//
LOGICAL_MAXIMUM (255)


0x95, 0x08,
//
REPORT_COUNT (8)


0x75, 0x40,
//
REPORT_SIZE (64)


0x91, 0x02,
//
OUTPUT (Data,Var,Abs)


0xc0
// END_COLLECTION


}; /* ReportDescriptor */



const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR]
const u8 StringProduct[SIZ_STRING_PRODUCT]
const u8 StringSerial[SIZ_STRING_SERIAL]
继承事业,薪火相传
返回列表