找回密码
 立即注册
查看: 41|回复: 7

USB 做 MSC 设备时,怎么判断 是否成功连接到计算机了?

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-07-31 10:51:51

22

主题

104

回帖

868

积分

高级会员

积分
868
发表于 前天 17:11 | 显示全部楼层 |阅读模式
USB 做 MSC 设备时,需要在接计算机时屏蔽MCU本身对 TF 卡的操作
有什么标志,可以怎么判断 是否成功连接到计算机了?

例程是 AI8051 试验箱 1.2 版本的
47-MSC(Mass Storage Class)协议范例-U盘演示程序
回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 前天 17:12 | 显示全部楼层
在使用USB MSC(Mass Storage Class)设备时,判断是否成功连接到计算机是实现U盘功能的关键环节。对于基于AI8051试验箱12版本的47-MSC范例程序,需确保MCU在连接至计算机后,能够正确识别并切换至MSC模式,同时屏蔽对TF卡的本地操作,以避免数据冲突。

一、USB MSC设备连接状态判断方法

1. USB枚举过程  
   当USB设备插入计算机时,系统会进行枚举(Enumeration)过程,包括识别设备类型、获取设备描述符、配置端点等。在MSC设备中,该过程完成后,系统将识别为一个可读写的存储设备。

2. 设备状态标志  
   在AI8051平台中,可通过以下方式判断设备是否成功连接:
USB接口状态寄存器:检查USB控制器的状态寄存器,确认设备已进入“已连接”或“已配置”状态。
MSC类协议状态:通过MSC类驱动的回调函数或状态变量来判断是否成功初始化MSC接口。
主机检测标志:部分USB库提供主机连接检测函数,例如usbhostconnected(),可用于判断主机是否已接入。

3. LED指示或调试输出  
   在实际应用中,可通过LED灯或串口调试信息反馈设备连接状态。例如,在连接成功后点亮LED或打印“USB connected”信息。

二、屏蔽MCU对TF卡的操作

当设备被识别为MSC设备后,应立即停止MCU对TF卡的本地读写操作,以防止数据冲突。具体实现方法如下:

1. 设置标志位控制  
   在程序中定义一个全局变量(如bool usbconnected = false;),用于标识USB是否已连接。在MSC初始化完成后,将其设为true,并在主循环中根据该标志决定是否执行TF卡操作。

  
  1. c
  2.    if (!usbconnected) {
  3.        // 执行TF卡操作
  4.    }
复制代码

2. 中断或事件触发机制  
   若使用USB库提供的回调函数(如onusbconnect()),可在该函数中设置标志位,并在此处暂停TF卡操作。

3. 资源释放与状态切换  
   在连接成功后,应释放TF卡相关的资源(如关闭SPI接口、释放DMA通道等),避免硬件冲突。

三、示例代码片段(基于AI8051)

以下为简化版伪代码,展示如何在AI8051平台上实现上述逻辑:
  1. c
  2. volatile bool usbconnected = false;
  3. void onusbconnect() {
  4.     usbconnected = true;
  5.     // 停止TF卡操作
  6.     tfcardstop();
  7.     // 可选:点亮LED或打印日志
  8. }
  9. void main() {
  10.     initusb();
  11.     inittfcard();
  12.     while (1) {
  13.         if (!usbconnected) {
  14.             // 执行TF卡读写操作
  15.             readfromtf();
  16.         } else {
  17.             // 等待USB传输完成
  18.             delayms(100);
  19.         }
  20.     }
  21. }
复制代码

四、注意事项
USB枚举时间:主机可能需要一定时间完成枚举,建议在连接后等待1~2秒再开始MSC操作。
多任务处理:若系统支持多任务,应确保MSC和TF卡操作在不同任务中隔离执行。
错误处理:应加入超时机制,防止因USB未连接导致程序阻塞。

五、总结

在AI8051试验箱12版本的MSC范例中,判断USB是否成功连接主要依赖于USB枚举状态和设备标志位。通过合理设置标志位并屏蔽TF卡操作,可确保设备稳定运行。建议结合硬件指示和软件逻辑进行综合判断,以提升系统鲁棒性。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 前天 18:14 | 显示全部楼层
1。判断DeviceState == DEVSTATE_CONFIGURED


2.判断scsi协议状态机
SCCI_STARTSTOPUNIT
SCSI_MEDIAREMOVAL
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-07-31 10:51:51

22

主题

104

回帖

868

积分

高级会员

积分
868
发表于 昨天 10:51 | 显示全部楼层
erci*** 发表于 2025-7-30 18:14
1。判断DeviceState == DEVSTATE_CONFIGURED

谢谢回复
DeviceState == DEVSTATE_CONFIGURED
这个我知道,但是我现在的问题是,我第一次上电
DeviceState  = DEVSTATE_DEFAULT        (2)
插上 计算机后
DeviceState  =DEVSTATE_CONFIGURED     (4)
拔掉后
DeviceState  还是维持 DEVSTATE_CONFIGURED     (4)
并不回到
DEVSTATE_DEFAULT        (2)
例程就是 47-MSC(Mass Storage Class)协议范例-U盘演示程序
我只加了
    while(1)
     {
       printf("USB:%bu\r\n",DeviceState);
       delay_ms(250);
     }

点评

其它状态只预留了函数没有处理,可以在 usb_resume usb_suspend 里加调试信息看看  详情 回复 发表于 昨天 11:34
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 昨天 11:34 | 显示全部楼层
zh*** 发表于 2025-7-31 10:51
谢谢回复
DeviceState == DEVSTATE_CONFIGURED
这个我知道,但是我现在的问题是,我第一次上电

其它状态只预留了函数没有处理,可以在

usb_resume
usb_suspend
里加调试信息看看
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-07-31 10:51:51

22

主题

104

回帖

868

积分

高级会员

积分
868
发表于 昨天 15:44 | 显示全部楼层
erci*** 发表于 2025-7-31 11:34
其它状态只预留了函数没有处理,可以在

usb_resume

拔出USB,这两个函数都没有 调用
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-07-31 10:51:51

22

主题

104

回帖

868

积分

高级会员

积分
868
发表于 昨天 16:06 | 显示全部楼层
erci*** 发表于 2025-7-31 11:34
其它状态只预留了函数没有处理,可以在

usb_resume

拔出 USB,不会产生中断,我给USB中断加了一个超时,如果超时没有中断,我就认为USB 拔出了

点评

我试试看  详情 回复 发表于 昨天 16:14
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 昨天 16:14 | 显示全部楼层
zh*** 发表于 2025-7-31 16:06
拔出 USB,不会产生中断,我给USB中断加了一个超时,如果超时没有中断,我就认为USB 拔出了 ...

我试试看
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-1 01:53 , Processed in 0.124789 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表