USB

USB具体使用请参见USB使用指南

FAQ1 关键注意事项

  1. USB接入后检查是否有中断产生

  2. 打开debug log可能会影响USB连接

  3. MCU降频和睡眠都会导致USB无法识别,需要中断脚处理

  4. 52系列灭屏后会降频,USB插入后需要配置不降频

  5. USB只能用60MHz的频率


FAQ2 快速检查清单

  1. USB引脚正确配置为模拟输入

  2. 系统未进入IDLE/睡眠模式

  3. 主频未降频(特别是52系列)

  4. USB时钟为60MHz

  5. 正确配置了USB设备/主机模式

  6. 睡眠唤醒后能重新启用USB时钟


FAQ3 USB接入后无法识别

  1. Debug Log影响

  • 可能原因:Debug Log影响。 RT_DEBUG_USB宏打开后会影响USB连接(打印过多)

  • 解决方案:建议关闭该宏进行调试

#if (RT_DEBUG_USB==1)
void HAL_DBG_printf(const char *fmt, ...)
{
    va_list args;
    static char rt_log_buf[RT_CONSOLEBUF_SIZE];
    extern void rt_kputs(const char *str);

    va_start(args, fmt);
    rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
    rt_kputs(rt_log_buf);
    va_end(args);
}
#endif
  1. 系统进入IDLE状态

  • 可能原因:进入IDLE后主控端USB设备被挂起,PC端无法识别

  • 解决方案:检测到USB插入后,需禁止IDLE和睡眠;USB拔出后,需恢复

    • USB插入时:

rt_pm_hw_device_start();           // 禁止进入IDLE
rt_pm_request(PM_SLEEP_MODE_IDLE); // 禁止睡眠
pm_scenario_start(PM_SCENARIO_AUDIO); // 禁止变频(特别是52系列灭屏后)
    • USB拔出时:

rt_pm_hw_device_stop();
rt_pm_release(PM_SLEEP_MODE_IDLE);
pm_scenario_stop(PM_SCENARIO_AUDIO);  // 允许变频
  1. 时钟频率问题

  • 可能原因: USB需要稳定的60MHz频率。主频降频会导致USB频率变化,从而无法识别

  • 解决方案

    • 52系列灭屏后会降频,需通过「2. 系统进入IDLE状态」的方法保持频率

    • 52X的检查下bsp_init.c下的USB 分频系数是否匹配

#ifdef BSP_USING_USBD
    // Make sure USB clock is 60M = 120M/2
    hwp_hpsys_rcc->USBCR = 4;                        // 4分频
    hwp_hpsys_rcc->CSR &= ~HPSYS_RCC_CSR_SEL_USBC;   // Use DLL2 (0 is SYSCLK, 1 is DLL2)  这里用的SYSCLK,SYSCLK 52X是跑的240M
#endif
  1. IO口配置检查

  • 可能原因: IO口配置错误

  • 解决方案: 重新配置IO。不同芯片型号USB IO口不同,具体看芯片手册/规格书

#if defined(BSP_USING_USBD) || defined(BSP_USING_USBH)
    HAL_PIN_Set_Analog(PAD_PA35, 1);  // 配置为模拟输入
    HAL_PIN_Set_Analog(PAD_PA36, 1);  // 不需要特殊功能配置
#endif
  1. USB配置检查

  • 可能原因: USB配置错误

  • 解决方案

    • 确认USB设备/主机模式配置正确

    • 参考文档正确配置相关参数

    • 检查menuconfig配置是否正确

具体参见USB使用指南


FAQ4 睡眠唤醒后USB无法识别

检查USB插入后,是否有硬件中断触发(充电中断,有专用的USB插入中断脚),主动调用enable打开USB时钟,并且注意是否有禁止系统睡眠,变频。

使能USB函数:

static void enabled_usb(void)
{    
    struct rt_device *usb_device = rt_device_find("usb_reg");
    if (usb_device) 
        rt_device_control(usb_device, RT_DEVICE_OFLAG_OPEN, RT_NULL);
}

禁用USB函数:

static void disabled_usb(void)
{
    struct rt_device *usb_device = rt_device_find("usb_reg");
    if (usb_device) 
        rt_device_control(usb_device, RT_DEVICE_OFLAG_CLOSE, RT_NULL);
}

FAQ5 插着USB开机后识别失败

  • 可能原因

    • 是一开机USB的dp引脚被上拉了,导致PC认为有USB设备进来,从而就发起了reset中断,但是这个时候系统正在执行更高优先级的任务,导致没有相应USB的中断。

  • 解决方案

    • 查看dp引脚是否有外部上拉存在,有就去掉。

    • 检查再开机的时候pinmux是否将dp引脚配置为上拉。


FAQ6 调试建议

  1. 分步调试:先关闭调试log,验证硬件连接

  2. 中断检查:确保USB插入中断能正常触发

  3. 功耗管理:特别注意睡眠和降频对USB的影响

  4. 时钟验证:确保USB时钟稳定在60MHz

  5. 芯片差异:不同系列芯片(52x/55x/56x)可能有特殊配置需求