做这个USB Device也有一段时间,就是对各种表示比较多疑惑,但是都解决了很多,分享一下经验.
基本概念:
- USB也是一个一个Byte发给主机,从机不能主动给主机发,要等主机问一下从机你有事没事,等主机问的时候才能发.所以有个bInterval属性,设置太短呢,MCU很忙,设置太长呢,实时性不能保证.
- USB其实也就是串口,也就是SPI,也就是各种基础协议,做个很复杂的封装,比如串口就一个TX,RX,我TX你,你RX,而USB是我TX0你,你RX0我,我用TX3你,你却用RX0回敬我.可以理解成好多个串口连线到主机.专业名词叫EP.
- 其中EP0是最特别的,他是老大,其他都是小兵,小兵可以是搬运工,可以是泥水工,但是老板只处理控制协议(所谓签协议,握手等等),下面的搬运工就只能搬砖的搬砖...
- USB2.0也有12MBit的版本的好吧,而像我用的STM32F072就是这个 版本,要高的什么STM32F7呢,也要加外部PHY,跟LPC高端还是差多了.
- 不是所有STM32的USB都有内置上拉电阻,我这个072就有,但是103就没有.
- USB协议是我认为最神奇,最好玩的协议了,无论多少个设备下来(其实有限制,可忽略.),都可以只用2根线和主机通信.
USB库的基本架构:
- 不知道是用户少还是怎么,用USB的还是极少,以我项目为例,主要内容有hUsbDeviceFS,FS_Desc,USBD_CUSTOM_HID,USBD_CustomHID_fops_FS这几个.
- FS_Desc就是各种描述,它里面怎么定义我们不用管.只要知道几个主要描述符位置就好,比如usbd_desc.c和usbd_custom_hid_if.c,usbd_custom_hid.c.
- USBD_CustomHID_fops_FS是一些IO操作,我现在用的都是HID,不顶用.
- USBD_CUSTOM_HID是关键,如果你要做一些其他操作更加重要.比如USBD_CUSTOM_HID_EP0_RxReady就是EP0的RX,其中USBD_CUSTOM_HID_DataIn就是MCU写东西给主机,相对于主机是IN,因为我们是从机.USBD_CUSTOM_HID_DataOut很好理解.
- 假定 USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)pdev->pClassData; 还可以从hhid->Report_buf[0] 获取到USB Buf内容,比如我从主机EP0的OUT事件中接受一个数据,处理如下.