RT-Thread论坛
直播中

石飞鹏

8年用户 1082经验值
私信 关注
[问答]

ART-PI2的CherryUSB cdc_acm例程 在复位后需要好久才能出来COM口?

第一次使用ART-PI2上的USB-HS接口。在ART-PI2上烧录编译的art_pi2_cherryusb_usbdev_cdc_acm工程,程序能够正常运行:


但是在复位后,需要等待2分钟以上才能出现虚拟的CDC设备:

具体原因不详,怀疑硬件问题,板子是吃灰几个月的新板子。不知道是否有人有类似情况?


回帖(1)

梅利号

2025-9-16 17:59:06

针对ART-PI2使用CherryUSB CDC_ACM例程时复位后需要等待2分钟以上才出现COM口的问题,以下是可能的原因分析和解决方案:




可能原因分析:




  1. USB硬件初始化延迟



    • USB-HS PHY芯片(如RTL8201)初始化时序或复位序列不匹配。

    • 外部晶振启动不稳定,导致USB时钟源(如480MHz PLL)同步超时。




  2. CherryUSB协议栈配置问题



    • dcd_connect()dcd_disconnect()函数调用时机不当,导致主机无法及时检测设备。

    • USB描述符(Descriptor)配置错误(如未正确声明为CDC设备),导致主机反复尝试枚举。




  3. 复位电路干扰



    • 复位按键或NRST信号存在干扰,导致MCU多次复位,延长初始化时间。

    • USB接口的VBUS电压不稳定,触发过压保护或使能延迟。




  4. 驱动兼容性问题



    • 主机操作系统(如Windows)对CDC设备的识别延迟,特别是首次使用时需加载驱动。




  5. 硬件潜在缺陷



    • 板载USB-HS接口的保护元件(TVS二极管、滤波电容)老化或接触不良。






解决方案步骤:


1. 优化CherryUSB初始化流程




  • 强制复位PHY芯片
    在USB初始化前,手动复位PHY(通过GPIO控制其复位引脚):


     // 假设PHY复位引脚为PA10
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
    HAL_Delay(100);  // 等待PHY稳定



  • 调整连接/断开时机
    确保在USB配置完成后再调用连接函数:


     void usb_init(void) {
         usb_dc_init();        // 初始化USB控制器
         usbd_cdc_acm_init();  // 初始化CDC协议
         dcd_connect();        // 连接主机(关键!不能在PHY未就绪时调用)
    }



2. 检查时钟配置



  • 确认SystemClock_Config()中USB时钟源正确:
    RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USBH;
    PeriphClkInit.UsbPhyClockSelection = RCC_USBPHYCLKSOURCE_PLL3; // HS USB需用PLL3
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

  • 使用示波器测量PA8(USB SOF)信号,确认时钟频率稳定为1ms周期。


3. 修改USB描述符



  • usbd_cdc_acm.c中检查设备描述符是否符合CDC规范:
    const uint8_t cdc_dev_desc_tab[] = {
       0x12,        // bLength
       USB_DESC_DEVICE, // bDescriptorType
       ...          // 确保bDeviceClass=0x02(CDC设备)
    };


4. 硬件排查



  • 更换USB线缆和端口:排除主机侧问题。

  • 测量VBUS电压:使用万用表确认VBUS(5V)在4.75V~5.25V范围内。

  • 检查DP/DM信号:用逻辑分析仪捕获USB D+/D-信号,观察是否有持续的SE0状态(表明设备未响应)。


5. 固件调试技巧



  • 添加日志追踪
    在USB中断处理函数中添加调试输出,确认枚举流程:
     void OTG_HS_IRQHandler(void) {
         dcd_int_handler(0); // CherryUSB中断入口
         printf("USB IRQ Handled!n"); // 通过UART输出
    }

  • 强制缩短复位延迟
    如果使用MX_USB_HOST_Init(),在其后添加HAL_Delay(500)而非默认长延迟。




实验结果验证


按以下步骤测试:



  1. 烧录修改后的固件。

  2. 短按复位键,观察串口日志输出。

  3. 使用USBlyzer(Windows工具)捕获USB枚举过程:

    • 正常情况:设备应在500ms内响应GET_DESCRIPTOR请求。

    • 故障现象:主机多次发送请求超时,需重点检查PHY响应。




重要提示:若以上步骤无效,尝试使用另一块ART-PI2交叉测试,确认是否为硬件老化问题。若多块板子均存在延迟,需检查原理图中USB-HS的阻抗匹配(应为90Ω差分)和电容取值(≤10μF)。





通过上述调整,可显著缩短CDC设备枚举时间。若问题依旧,建议检查CherryUSB库版本是否适配ART-PI2的HAL库(如STM32H7系列存在已知USB初始化时序问题)。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分