【MCU应用笔记】NXP LPC5516 USB 代码流程讲解(上)
LPC5516 是 NXP LPC55XX 系列的一款 General MCU,具有 HighSpeed USB 功能,能够实现最高 8K Report Rate。在高端的电竞外设市场中有着巨大的优势。
在本文中,我们将会对 LPC5516 SDK 中的 USB 例程进行讲解,具体例程为 usb_device_composite_hid_mouse_hid_keyboard,因为这个例程是 LPC5516 实现 HID 功能,同时枚举成鼠标跟键盘,同时能够实现鼠标跟键盘的功能。具体 SDK 的下载,大家可以在 https://mcuxpresso.nxp.com/zh/welcome 官网中找到对应的开发板或者 MCU 进行下载就行了,这里就不再赘述了。
在进行代码分析中,我们先对于例程的文件夹进行说明。文件夹如下图所示:
其中我们就对常用的几个文件夹进行说明: - LPC55S16 文件夹中主要放的是关于低功耗的驱动代码;
- Board 文件夹中是对于这块开发板中的硬件接口的定义,例如按键,LED,系统时钟的配置;
- Component 文件夹是对于操作系统:bm or FreeRTOS 的一些调度函数就是放在这里的,Main 函数也是放在这里面的,除此之外还有串口 Debug 的驱动代码;
- Device 文件夹放的就是该芯片 LPC5516 的寄存器定义的文件,这部分可以结合 UserManual 一起看;
- Driver 文件夹就是存放不同外设的驱动文件。如果后续需要添加不同的外设时就可以在 SDK 的文件夹中找到对应驱动文件,并放到这个文件夹中;
- Sources 文件夹就是放例程相关功能的文件,例如本文中例程就是放键盘跟鼠标的代码文件,以及 USB 描述符的文件;
- Startup 文件夹就是放启动文件;
- USB 文件夹主要放的是关于 USB PHY 层以及 Device 层的代码,如果后面需要对 USB Class,hid 等内容修改的话,就对这个文件夹里面的文件进行修改;
在讲完文件夹的结构之后,我们再来介绍到一些关键参数的定义以及修改: 对于很多客户来说,他们拿到一份代码之后通常都会提出一个问题,这份代码的 USB 描述符我能改吗,在哪里改?对此,可以在上文提到的 sources 文件夹中的 usb_device_descriptor.c 中进行修改,如下图所示:
该图为关于鼠标的描述符定义。除此之外这个 C 文件中还有键盘的描述符定义,所以如果需要修改描述符就可以先定好描述符后对结构体进行替换就好了。 在该例程中默认是使用 Full Speed USB 的,Full Speed USB 特性是最多只能 1ms 发一次数据帧,所以只能最高做到 1K report rate。就有客户会问了,如果我要使用 High Speed USB 外设,而且要做 4K 甚至 8K Report Rate的话是需要进行怎么样的代码改动?对此,可以在 sources 文件夹中的 usb_device_config.h 文件中进行修改,如下图所示:
可以通过这个宏来进行修改,目前 SDK 中是使用了一个 Full Speed USB,0 个 High Speed USB。 如果需要修改 USB 的 Report Rate 的话,则需要修改usb_device_descriptor.h 中的 Interval 参数,如下图所示:
其中分有 High Speed USB 以及 Full Speed USB 的 Interval 参数,这个参数会在 USB 一开始跟主机沟通时上报的,用于指示数据帧(Full Speed USB)或者数据微帧(High Speed USB)的上报间隔,时间公式为 T = 2^(Interval-1) 个最小单位,其中 Full Speed 数据帧的最小单位为 1ms; High Speed 数据微帧的最小单位为 125 μs。所以可以计算出上图中 Full Speed 的间隔为 8ms,High Speed 的间隔为 4ms。
由于篇幅的限制,在本文中我们就先介绍 USB 代码常用到或者需要修改到的内容,在下篇中,我们将会介绍 USB 枚举后对于 set report,get report 等操作时的代码流程,敬请期待。 |