USB论坛
直播中

abdkjshd

9年用户 1258经验值
擅长:可编程逻辑
私信 关注
[问答]

FX2LP如何在不重新插入USB电缆的情况下在dfu过程之后重新启动设备?

我正在使用 FX2LP 设备,我想通过将 iic 文件写入 eeprom 为我的设备添加“设备更新固件”功能。它运行得很好,但我不知道如何在不重新插入 USB 电缆的情况下在 dfu 过程之后重新启动设备?

回帖(1)

张虎豹

2025-5-8 18:13:14

在FX2LP设备完成DFU(设备固件更新)后,无需物理拔插USB线即可重启设备的步骤如下:


方法一:通过寄存器触发软复位




  1. 写入复位寄存器:在固件更新完成后,通过向FX2LP的CPU控制与状态寄存器(CPUCS)写入特定值触发8051内核复位。该寄存器位于地址0xE600


    // 在固件代码中添加以下操作
    CPUCS = 0x01;  // 将bit0置1以触发复位


    • 此操作会立即复位8051内核,设备将从EEPROM重新加载新固件。




  2. 确保EEPROM配置正确



    • 确认EEPROM的开头包含有效的固件头(如0xC00xC2),确保复位后能正确加载。

    • 检查VID/PID设置,避免枚举冲突。




方法二:模拟USB断开/重连



  1. 控制USB连接状态:通过设置USBCS寄存器的DISCON位(断开USB物理连接),随后重新使能连接。
    // 断开USB连接
    USBCS |= 0x01;   // 设置DISCON位
    Sleep(100);       // 短暂延时确保断开生效
    USBCS &= ~0x01;   // 清除DISCON位,重新连接


    • 这会导致主机重新枚举设备,类似于重新插拔的效果。



方法三:使用看门狗定时器



  1. 配置并触发看门狗复位:在DFU完成后停止喂狗,让看门狗超时触发复位。
    // 启用看门狗(假设默认未启用)
    WDCS = 0x01;      // 启用看门狗
    // 在DFU过程中定期喂狗
    // ...
    // DFU完成后停止喂狗,触发复位
    while(1);         // 看门狗超时导致复位


    • 需确保看门狗超时时间设置合理,避免意外复位。



主机端辅助复位(可选)



  • 发送总线复位请求:通过主机发送USB总线复位信号(如使用libusb_reset_device或CyAPI的Reset方法),强制设备重新枚举。
    // 使用CyAPI库示例
    CCyUSBDevice device;
    device.Reset();


    • 此方法依赖主机驱动支持,可能需在固件中配合处理。



验证步骤



  1. 更新EEPROM后检查复位:确保EEPROM写入成功后立即执行复位操作。

  2. 监控USB枚举:使用工具(如USBLogView)观察设备是否重新枚举并加载新固件。

  3. 调试寄存器操作:通过调试器或日志确认寄存器写入成功,避免硬件配置错误。


注意事项



  • 电源管理:确保USB总线供电稳定,避免复位过程中断电。

  • 固件兼容性:新固件需正确处理USB描述符,避免枚举失败。

  • 延时处理:在断开/重连USB时适当延时,确保操作生效。


通过上述任一方法,可实现FX2LP在DFU完成后自动复位并加载新固件,无需手动插拔USB线。推荐优先使用软复位寄存器(CPUCS),因其直接且可靠性高。

举报

更多回帖

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