单片机/MCU论坛
直播中

哼小曲

13年用户 1215经验值
私信 关注
[问答]

请问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)

chumowei

2024-1-16 16:51:42
判断U盘是否已拔出的方法可以通过监测USB设备的连接状态来实现。在NUC505 USB Host中,可以使用USBH_HUB_GetDeviceStatus函数来获取USB设备的连接状态。该函数返回值为USBH_HUB_PORT_STATE枚举类型,其中有一个标志位USBH_HUB_PORT_CONNECT表示设备是否连接。

以下是一个示例代码段,用于判断U盘是否已拔出:

```c
for (;;) {
    if (USBH_ProcessHubEvents()) {
        USBH_HUB_PORT_STATE portState = USBH_HUB_GetDeviceStatus(USB_HOST_PORT_NUM);
      
        if (!(portState & USBH_HUB_PORT_CONNECT)) {
            // U盘已拔出
            break;
        }
      
        // U盘仍然连接着
        // 执行需要的操作
    }
}
```

注意:上述示例代码中的USB_HOST_PORT_NUM需要替换为实际使用的USB端口号,通常为0或1,具体取决于NUC505的硬件设计。

通过轮询USB设备的连接状态,可以判断出U盘是否已拔出。当USBH_HUB_GetDeviceStatus函数返回的状态中不包含USBH_HUB_PORT_CONNECT标志位时,即表示U盘已拔出。此时可以中断循环,并执行对应的处理逻辑。
举报

更多回帖

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