嵌入式学习小组
直播中

刘浩

7年用户 1059经验值
私信 关注

NUC505 USB Host如何判断U盘拔出?

  使用NUC505 的U盘例子,可以识别U盘并读出扇区等,但不知道如何判断U盘已经拔出?
我做了下列尝试:


1. 使用下列断点办法判断USB设备拔出,但是没有效果:
   该断点却可以感应到USB设备插入
    for (;;)
    {
        if (USBH_ProcessHubEvents())
        {
            put_rc(f_mount(&FatFs[0], "", 0));  //设置断点
        }
    }   

2. 观察NUC505的相关寄存器来判断USB设备拔出,也无效果
  寄存器:Host Controller Root Hub Port Status
  此寄存器有一个 CSC 标志位 Connect Status Change

3. 拦截USBH的中断,无效果
  在此设置断点 void USBH_IRQHandler(void)




回帖(1)

王玲

2024-5-20 17:46:21
有两种方法可以判断U盘是否已经拔出:

1. 使用USBH_IsDeviceConnected函数判断
可以在循环中调用USBH_IsDeviceConnected函数,该函数会返回当前USB设备是否连接,如果返回0,则说明设备已经拔出。例如:

for (;;) {
    if (USBH_ProcessHubEvents()) {
        if (!USBH_IsDeviceConnected(&USB_OTG_FS, MSC_DEVICE_ADDR)) {
            // U盘已经拔出
            break;
        }
        // U盘仍然连接,继续操作
    }
}

2. 使用USBH_UserProcess函数判断
另一种方法是在USBH_UserProcess函数中判断U盘是否连接。该函数会在USB设备连接或者断开时被调用。例如:

void USBH_UserProcess(USBH_HandleTypeDef *phost, uint8_t id) {
    if (phost == &USB_OTG_FS_Core) {
        // 判断是否为U盘设备
        if (id == MSC_DEVICE_ADDR) {
            if (phost->gState == HOST_CLASS) {
                // U盘连接
                printf("USB device connected.rn");
            } else if (phost->gState == HOST_IDLE) {
                // U盘断开
                printf("USB device disconnected.rn");
            }
        }
    }
}

这两种方法都可以有效地判断U盘是否已经拔出。需要注意的是,在操作U盘时一定要注意及时关闭文件、卸载文件系统、停止USB传输等操作,否则可能会导致U盘数据丢失。
举报

更多回帖

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