USB论坛
直播中

李梅

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

如何在主板上实现CX3 UVC+CDC功能?

我想在我的主板上实现 CX3 UVC+CDC 功能。
现在,我尝试使用论坛中的方法,我可以在我的 Windows PC 上看到 com 端口,但是我尝试使用 Tera term 打开 CX3 com 端口,然后 CX3 总是崩溃……
请告诉我调试方法...谢谢。

回帖(1)

飘逸的D

2025-5-22 17:01:44

在实现Cypress CX3的UVC+CDC复合功能时遇到崩溃问题,可以按照以下步骤进行系统化调试:


一、硬件排查




  1. 电源与时钟验证



    • 使用示波器检查CX3的3.3V/1.8V供电是否稳定(纹波<5%)

    • 确认24MHz主时钟信号完整性(上升时间<3ns,峰峰值800mV)

    • 检查I2C总线是否有上拉电阻(建议4.7kΩ)




  2. 信号完整性测试



    • 使用USB协议分析仪(如LeCroy Voyager)捕获USB3.0 Eye Diagram

    • 检查HSync/VSync等控制信号是否存在过冲(建议添加33Ω串联电阻)




二、固件配置诊断




  1. 描述符冲突检测


    // 复合设备描述符示例(需验证的要点)
    __CONST USB_DEVICE_DESCRIPTOR deviceDscr = {
    .bLength = 0x12,
    .bDescriptorType = USB_DESCR_TYP_DEVICE,
    .bcdUSB = 0x0210,  // USB2.1
    .bDeviceClass = 0xEF,  // Miscellaneous Device
    .bDeviceSubClass = 0x02,  // Common Class
    .bDeviceProtocol = 0x01,  // Interface Association
    .bMaxPacketSize0 = 0x40,
    .idVendor = 0x04B4,
    .idProduct = 0x00F8,
    .bcdDevice = 0x0100,
    .iManufacturer = 1,
    .iProduct = 2,
    .iSerialNumber = 0,
    .bNumConfigurations = 1
    };


    • 确认接口关联描述符(IAD)正确配置

    • 验证端点分配:UVC建议使用EP1-IN(等时传输),CDC使用EP2-IN/OUT(批量传输)




  2. DMA缓冲区配置


    #define UVC_BUF_SIZE  (1920*1080*2)  // 1080p YUV
    #define CDC_BUF_SIZE  1024
    CyU3PDmaChannelSetXfer(&uvcChHandle, UVC_BUF_SIZE, 0);  // 视频传输
    CyU3PDmaChannelSetXfer(&cdcChHandle, CDC_BUF_SIZE, 0);   // 串口传输


    • 检查DMA通道是否独立配置(建议UVC和CDC使用不同通道)

    • 确认总缓冲区不超过CX3内部SRAM限制(典型值512KB)




三、驱动与协议分析




  1. Windows系统日志检查



    • 打开事件查看器 → Windows日志 → System

    • 筛选事件ID 219/225(USB设备错误)

    • 注意VID_04B4&PID_00F8相关错误条目




  2. USB协议层调试



    • 使用Wireshark捕获USB数据包(需USBPcap驱动)

    • 重点关注SET_INTERFACE(0x0B)和SET_CONFIGURATION(0x09)请求

    • 验证描述符请求顺序是否匹配固件响应




四、崩溃场景复现与诊断








































  1. 故障隔离测试 测试场景 UVC状态 CDC状态 结果
    单独启用UVC On Off 正常
    单独启用CDC Off On 正常
    复合模式(无数据传输) On On 崩溃?
    仅发送AT命令 On On 崩溃?



  2. 内存溢出检测


    // 在链接脚本中增加内存保护区
    MEMORY {
    IRAM (rwx) : ORIGIN = 0x40000000, LENGTH = 0x80000
    PROTECT (rwx) : ORIGIN = 0x40080000, LENGTH = 0x1000
    }


    • 在关键函数前后设置内存标记(0xDEADBEEF)

    • 使用JTAG调试器定期检查内存标记完整性




五、高级调试技巧




  1. 实时跟踪调试


    CyU3PDebugPrint(4, "CDC_ISR: Received %d bytesrn", count);
    // 通过UART输出调试信息(建议波特率3Mbps)



  2. 性能计数器监控


    CYU3PTraceUnitConfig(CYU3P_TRACE_UNIT_PERFCOUNTER, CY_U3P_TRACE_MODE_CONTINUOUS);
    CYU3PTraceEnable(CY_U3P_TRACE_SELECT_PERFCOUNTER);



  3. 错误注入测试


    // 强制触发USB错误状态
    CyU3PUsbStall(CY_U3P_USB_EP_CONTROL, CyTrue, CyFalse);



六、推荐解决方案




  1. 关键配置检查清单



    • [ ] 接口关联描述符(IAD)存在且位置正确

    • [ ] 端点方向/类型不冲突(UVC用IN,CDC用IN+OUT)

    • [ ] 每个接口的bInterfaceNumber唯一

    • [ ] 字符串描述符索引正确映射




  2. 固件更新建议



    • 从Cypress官网获取最新SDK(至少v1.3.3)

    • 合并cyu3p_uvcdc示例中的中断处理机制
      CyU3PUsbRegisterEpIntrCallback(CDC_EP, cdcIsrCallback);
      CyU3PUsbRegisterEpIntrCallback(UVC_EP, uvcIsrCallback);




  3. 硬件修改建议



    • 在USB D+/D-线路上添加共模滤波器(如TDK MPZ2012S102A)

    • 为I2C_SCL增加RC滤波器(10Ω+100pF)




最终建议使用Cypress提供的FX3_SuperSpeedExplorer套件进行对比测试,通过逐步移植功能模块定位问题根源。若仍无法解决,建议捕获USB协议层错误代码(观察CyU3PUsbGetErrorCode返回值)并与Cypress技术支持分享详细的USB流量日志。

举报

更多回帖

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