USB接口是上位机(如电脑)和下位机(如我们自己开发的单片机板子)最常用的通信方式之一。USB有各种不同版本,有USB2.0,USB3.0,USB3.1等等。

USB2.0 又分为Low-Speed,Full-Speed,以及High-Speed。USB2.0 Full-speed理论上支持12Mbits/s,最大的有效数据速率为1.2MBytes/s。在通常的应用场景下,这个速率是足够的,而且支持USB2.0 Full-speed的MCU比较多,如STM32F1系列,MCU设计成本也相对较低。因此,本次只专注于USB2.0 Full-speed的介绍。

物理接口上,USB2.0的通信线路是USB接口上的D 和D-,USB2.0设备接入枚举的终端电阻如下所示:HOST即我们通常意义上的电脑,Device为我们的下位机。(STM32F103系列的上拉电阻需要外接,其他MCU可能会集成进内部)

usb组合设备的用途(USB2.0系列HID设备)(1)

USB速度检测

另外,USB2.0的Device耗电在配置前要小于100mA,配置后不能超过500mA。

USB的数据的传输类型分为4种:控制,中断,批量,以及同步。在本文中讲的HID设备是中断的传输方式。传输速率为1.2Mbyte/s,每次通信的最大Bytes为64位。其实,我们日常生活中接触到很多HID设备,如鼠标,键盘等。

那么,为什么会选择HID设备作为通信方式呢?最主要的原因,HID设备的电脑驱动是通用的,不需要为专门的USB设备装驱动,开发驱动等。我只需要将下位机配置HID设备,电脑将会设别到,然后通过Vendor的方式进行通信即可。

STM32F103有专门的HID库实现了HID设备,这样,我们下位机的开发将方便很多,HID的描述符如下:(有了USB描述符,HOST就会知道设备VID,PID以及基本的数据格式,比如数据传输最高为几位,最低为几位,数值的大小范围,数值是几位的等等)

__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x05, 0x8c, //0x05:USAGE PAGE 0x09, 0x00, //0x09:USAGE 0xA1, 0x00, //0xA1:COLLECTION //下面开始数据配置 0x09, 0x00, //0x09:USAGE 0xA1, 0x00, //0xA1:COLLECTION 0x09, 0x00, //0x09:USAGE 0x15, 0x00, //0x15:LOGICAL MIN 最小数为0x00 0x26, 0xFF, 0x00, //0x26:LOGICAL MAX 最大数为0XFF 0x75, 0x08, //0x75:REPORT SIZE;0x08:8位bit 0x95, 0x40, //0x95:REPORT COUNT;0x40:最大64 bytes传输 0x91, 0x02, //0x91:OUTPUT;0x02:Var(可变量) //上面OUT格式 0x09, 0x00, //0x09:USAGE 0x15, 0x00, //0x15:LOGICAL MIN 0x26, 0xFF, 0x00, //0x26:LOGICAL MAX 0x75, 0x08, //0x75:REPORT SIZE 0x95, 0x40, //0x95:REPORT COUNT 0x81, 0x02, //0x81:INPUT; 0x02:Var(可变量) //上面IN格式 //有两个 COLLECTION,就需要两个END COLLECTION 0xC0, //END COLLECTION /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ };

上面就是其中一个HID的数据格式配置,确定是可用的,我里面有注释,大概介绍了每个数据含义。

还有设备的VID和PID描述,还是设备名称等,在这里不做介绍,因为这个在STM32F103的HAL库里面已经封装好了,感兴趣可以看一下。

后面文章会介绍STM32F103 HAL库实现USB HID设备。

,