谷谷小师妹 发表于 2023-2-11 23:13:47

【MCU应用笔记】NXP LPC5516 USB 代码解读

【MCU应用笔记】NXP LPC5516 USB 代码解读

在前两篇文章中,我们针对 LPC 的键鼠项目开发时,对于 LPC USB 代码流程的讲解,让大家对于代码的架构以及流程有所了解。在本篇中以及后续的文档中不定期将对于之前没有说明的部分进行补充说明,大家可以当做番外篇或者 DLC 来看。
DLC内容1. 在使用原厂的 SDK demo 时,大家应该能够发现一个情况:在编译下载键鼠的例程到开发板之后,只要设备通过 USB 线接上电脑上电后,就会不停地画框(鼠标例程)或者上下翻页(键盘例程)。例程中是通过在三个地方中添加函数来实现的,由于键鼠两个例程都是相同的位置,我这边就以鼠标例程来进行说明。其中我们可以在例程中找到主要实现鼠标画框的函数为USB_DeviceHidMouseAction,如下图所示:
主要调用的三个地方分别为:kUSB_DeviceHidEventSendResponse、kUSB_DeviceEventSetConfiguration以及kUSB_DeviceEventSetInterface 这三个地方进行调用。
其中kUSB_DeviceHidEventSendResponse 这个事件是在设备发送完 USB 数据之后底层回报的事件,用以通知数据发送完成或者取消的结果,而例程中在这里添加发送函数的作用是循环发送鼠标数据。流程如下图所示:
而剩下的两个事件就是在设备上电工作时进行 USB 配置完成后开始传输的时间,处理流程如下:
其中可以看出当底层协议栈接收到主机端设置配置或者接口请求之后,会通过这两个事件通知到应用程序中,可以准备发送 USB 数据了。如果在开发代码时,可以将 USB_DeviceHidMouseAction 函数干掉,或者修改成符合自己需要的发送函数,并且将这三个事件中调用该函数的代码干掉,其中在 kUSB_DeviceEventSetInterface以及kUSB_DeviceEventSetConfiguration 函数中添加相关的标志位,用于提示可以准备发送数据了,而 kUSB_DeviceHidEventSendResponse 事件中可以根据通知结果添加自己对应的后续操作。
2. 在开发项目的过程中,还有一个常用的功能需要添加的,就是当主机休眠时,设备需要执行 Suspend 以及后续的 Resume 的唤醒功能。对此,SDK 中有一个相关的例程dev_suspend_resume_hid_mouse 可以参考,首先需要在 .h 中将 USB 的 Lowpower 功能打开,如下图所示:
这样的话才能确保到相应的 Suspend 以及 Resume 的事件能够在 SDK 中运行,具体可以例程搜索 USB_DEVICE_CONFIG_LOW_POWER_MODE。其中代码中会在 USB 中断 USB_DeviceLpcIp3511IsrFunction 中查询 USB device 的状态寄存器 DEVCMDSTAT 中关于 DSUS_C bit,如下图所示:
如果 DSUS_C 位被置 1 就说明设备将处于这三个状态中:需要进入 Suspend 状态;设备断开连接;设备接收到 Resume 信号。那么如何区别这些状态咧?就需要继续查看寄存器中 DSUS bit,如下图所示:
当DSUS bit 置1,则表明设备已经超过 3ms 没有发送 SOF 信号来维持活跃状态,需要执行 Suspend 操作,而DSUS bit没有置 1 而 DSUS_C bit 置 1,则表明设备接收到了 Resume 信号,需要执行 Resume 操作。在通过 SDK 中标准和类驱动中,最后传输到应用程序中是USB_DeviceCallback 函数中 kUSB_DeviceEventSuspend 以及 kUSB_DeviceEventResume,SDK 是在这两个事件中通过设置对应的标志位,然后通过一个任务不断查看这些标志位来进行对应的操作。
总结在本篇中主要是描述了键鼠例程中发送函数的流程和对应事件,以及如何修改添加自己的发送函数;还有就是关于 USB 主机关机休眠时,设备执行 Suspend & Resume 操作时的流程。后续会随着对于 USB 的深入了解再继续推出补充说明。参考资料《Device Class Definition for Human Interface Devices (HID)》《SDK_2_11_0_LPCXpresso55S16》《LPC55S1x/LPC551x User manual》《微控制器 USB 的技术及应用入门》
页: [1]
查看完整版本: 【MCU应用笔记】NXP LPC5516 USB 代码解读