ElectronBot USB设备类实现:自定义HID与CDC复合设备

ElectronBot USB设备类实现:自定义HID与CDC复合设备

【免费下载链接】ElectronBot 【免费下载链接】ElectronBot 项目地址: https://gitcode.com/gh_mirrors/el/ElectronBot

在嵌入式开发中,USB(Universal Serial Bus,通用串行总线)设备的实现往往面临着既要保证数据传输稳定性,又要满足多样化功能需求的挑战。ElectronBot项目创新性地采用了自定义HID(Human Interface Device,人机接口设备)与CDC(Communication Device Class,通信设备类)复合设备方案,成功解决了传统单一USB设备类功能局限的问题。本文将详细解析这一实现过程,帮助开发者掌握复合USB设备的设计要点。

USB设备类架构设计

ElectronBot的USB设备类实现基于STM32F4系列微控制器,采用了分层架构设计,确保了各模块间的低耦合和高内聚。从硬件接口到应用层逻辑,整个系统分为USB物理层、协议层和应用层三个主要层次。

ElectronBot硬件架构

USB物理层负责与外部USB主机的物理连接,通过ULPI(USB 2.0 Low Pin Interface)接口实现高速数据传输。协议层则实现了USB协议栈,包括设备描述符、配置描述符、接口描述符等关键数据结构的定义,以及USB标准请求的处理。应用层则根据具体的业务需求,实现了自定义HID和CDC类设备的功能逻辑。

设备描述符配置

设备描述符是USB设备与主机通信的第一扇窗,它包含了设备的基本信息,如厂商ID、产品ID、设备版本号等。在ElectronBot项目中,设备描述符的配置文件位于2.Firmware/ElectronBot-fw/USB_DEVICE/App/usbd_desc.c

#define USBD_VID     0x1001
#define USBD_PID_HS     0x8023
#define USBD_MANUFACTURER_STRING     "Pengzhihui"
#define USBD_PRODUCT_STRING_HS     "ElectronBot@PZH"

上述代码片段定义了ElectronBot设备的厂商ID(0x1001)、产品ID(0x8023)、厂商名称(Pengzhihui)和产品名称(ElectronBot@PZH)。这些信息将在设备枚举过程中被USB主机读取,用于识别设备类型和加载相应的驱动程序。

除了设备描述符外,配置描述符的设计尤为关键,它定义了设备的配置信息,包括接口数量、端点配置等。ElectronBot采用了复合设备的设计理念,同时包含了HID和CDC两个接口,从而实现了数据采集和通信控制的双重功能。

CDC类设备实现

CDC类设备主要用于实现串口通信功能,它允许ElectronBot与主机之间进行双向的数据传输。在ElectronBot项目中,CDC类设备的实现代码位于2.Firmware/ElectronBot-fw/UserApp/usbd_cdc_if.cpp

CDC类设备的初始化函数CDC_Init_HS()负责设置发送和接收缓冲区,并注册相应的回调函数。接收数据时,CDC_Receive_HS()函数会被调用,该函数实现了数据的接收和处理逻辑。为了提高数据传输的效率,ElectronBot采用了乒乓缓冲区的设计,通过切换两个接收缓冲区,实现了数据的连续接收。

static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t* Len)
{
    electron.usbBuffer.receivedPacketLen = *Len;
    if (electron.usbBuffer.receivedPacketLen == 224)
        electron.SwitchPingPongBuffer();
    
    USBD_CDC_HandleTypeDef* hcdc = (USBD_CDC_HandleTypeDef*) (hUsbDeviceHS.pClassData);
    hcdc->RxBuffer = electron.GetPingPongBufferPtr();
    
    return USBD_LL_PrepareReceive(&hUsbDeviceHS, CDC_OUT_EP, hcdc->RxBuffer, CDC_DATA_HS_OUT_PACKET_SIZE);
}

发送数据时,应用程序可以调用CDC_Transmit_HS()函数,该函数会将数据发送到USB主机。为了确保数据传输的可靠性,函数首先检查发送状态,只有在发送缓冲区空闲时才会进行数据发送。

HID类设备实现

HID类设备主要用于实现人机交互功能,如键盘、鼠标等。在ElectronBot项目中,HID类设备被用于实现自定义的数据报告功能,通过HID报告描述符定义了设备与主机之间的数据交换格式。

HID报告描述符的设计是HID类设备实现的核心,它定义了报告的结构、数据字段的含义和范围等。ElectronBot的HID报告描述符采用了自定义格式,包含了多个数据字段,用于传输传感器数据和控制命令。

HID类设备的初始化和数据传输过程与CDC类设备类似,但在数据格式和传输方式上有所不同。HID设备通常采用中断传输方式,确保数据的实时性。在ElectronBot项目中,HID类设备的实现代码与CDC类设备的实现代码分离,通过不同的接口描述符进行区分。

复合设备协调工作

复合设备的关键在于如何协调多个接口的工作,确保它们能够共享USB总线资源而不产生冲突。在ElectronBot项目中,这一目标通过USB协议栈的多接口支持和端点的合理配置来实现。

USB协议栈允许一个设备包含多个接口,每个接口可以独立工作,拥有自己的端点配置。ElectronBot的CDC接口和HID接口分别使用不同的端点,避免了数据传输的冲突。例如,CDC接口使用批量端点进行大数据量传输,而HID接口则使用中断端点进行实时数据传输。

ElectronBot USB协议栈架构

此外,在软件层面,ElectronBot采用了任务调度机制,通过FreeRTOS实时操作系统对CDC和HID任务进行调度,确保了各任务之间的协调工作和资源的合理分配。

驱动安装与测试

为了确保ElectronBot能够在Windows操作系统上正常工作,项目提供了专用的USB驱动程序,位于3.Software/_Tools/BotDriver/目录下。用户可以通过运行驱动安装程序installer_x64.exeinstaller_x86.exe来安装相应的驱动程序。

安装完成后,用户可以使用串口调试工具(如Putty、SecureCRT等)与ElectronBot进行通信,测试CDC接口的功能。对于HID接口,用户可以使用专用的HID测试工具,如HID Terminal,来发送和接收HID报告,验证HID接口的功能。

性能优化与调试

在USB设备类实现过程中,性能优化和调试是不可或缺的环节。ElectronBot项目采用了多种优化措施,提高了USB数据传输的效率和稳定性。

首先,在硬件层面,通过合理配置USB控制器的参数,如FIFO大小、中断优先级等,优化了数据传输性能。例如,在2.Firmware/ElectronBot-fw/USB_DEVICE/Target/usbd_conf.c文件中,通过调用HAL_PCDEx_SetRxFiFo()HAL_PCDEx_SetTxFiFo()函数,设置了接收和发送FIFO的大小。

HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_HS, 0x200);
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x80);
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x174);

其次,在软件层面,通过优化数据缓冲区的管理和数据处理算法,减少了数据传输的延迟和丢包率。例如,采用乒乓缓冲区技术,实现了数据的连续接收和处理。

在调试方面,ElectronBot项目提供了丰富的调试接口和日志输出功能。开发人员可以通过串口或JTAG接口对USB设备进行调试,查看USB协议栈的运行状态和数据传输过程,快速定位和解决问题。

总结与展望

ElectronBot的USB设备类实现充分展示了复合USB设备的设计思路和实现方法,通过CDC和HID两个接口的协同工作,实现了数据采集和通信控制的双重功能。这一方案不仅满足了机器人控制的需求,也为其他嵌入式系统的USB设备设计提供了有益的参考。

未来,可以进一步优化USB设备的性能,如提高数据传输速率、降低功耗等。同时,可以考虑增加更多的USB接口,如Mass Storage类接口,实现固件升级和数据存储功能。此外,还可以研究USB Type-C和USB Power Delivery等新技术,为ElectronBot增加快速充电和视频传输等功能。

通过不断优化和扩展USB设备功能,ElectronBot将能够更好地满足用户的需求,为机器人技术的发展做出更大的贡献。

欢迎点赞、收藏、关注,获取更多关于ElectronBot项目的技术分享和更新。

【免费下载链接】ElectronBot 【免费下载链接】ElectronBot 项目地址: https://gitcode.com/gh_mirrors/el/ElectronBot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值