USB 做 MSC 设备时,怎么判断 是否成功连接到计算机了?
USB 做 MSC 设备时,需要在接计算机时屏蔽MCU本身对 TF 卡的操作有什么标志,可以怎么判断 是否成功连接到计算机了?
例程是 AI8051 试验箱 1.2 版本的
47-MSC(Mass Storage Class)协议范例-U盘演示程序
在使用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卡操作。
c
if (!usbconnected) {
// 执行TF卡操作
}
2. 中断或事件触发机制
若使用USB库提供的回调函数(如onusbconnect()),可在该函数中设置标志位,并在此处暂停TF卡操作。
3. 资源释放与状态切换
在连接成功后,应释放TF卡相关的资源(如关闭SPI接口、释放DMA通道等),避免硬件冲突。
三、示例代码片段(基于AI8051)
以下为简化版伪代码,展示如何在AI8051平台上实现上述逻辑:
c
volatile bool usbconnected = false;
void onusbconnect() {
usbconnected = true;
// 停止TF卡操作
tfcardstop();
// 可选:点亮LED或打印日志
}
void main() {
initusb();
inittfcard();
while (1) {
if (!usbconnected) {
// 执行TF卡读写操作
readfromtf();
} else {
// 等待USB传输完成
delayms(100);
}
}
}
四、注意事项
USB枚举时间:主机可能需要一定时间完成枚举,建议在连接后等待1~2秒再开始MSC操作。
多任务处理:若系统支持多任务,应确保MSC和TF卡操作在不同任务中隔离执行。
错误处理:应加入超时机制,防止因USB未连接导致程序阻塞。
五、总结
在AI8051试验箱12版本的MSC范例中,判断USB是否成功连接主要依赖于USB枚举状态和设备标志位。通过合理设置标志位并屏蔽TF卡操作,可确保设备稳定运行。建议结合硬件指示和软件逻辑进行综合判断,以提升系统鲁棒性。
[本文内容由国芯人工智能辅助生成,仅供参考] 1。判断DeviceState == DEVSTATE_CONFIGURED
2.判断scsi协议状态机
SCCI_STARTSTOPUNIT
SCSI_MEDIAREMOVAL
ercircle 发表于 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);
}
zhx 发表于 2025-7-31 10:51
谢谢回复
DeviceState == DEVSTATE_CONFIGURED
这个我知道,但是我现在的问题是,我第一次上电
其它状态只预留了函数没有处理,可以在
usb_resume
usb_suspend
里加调试信息看看
ercircle 发表于 2025-7-31 11:34
其它状态只预留了函数没有处理,可以在
usb_resume
拔出USB,这两个函数都没有 调用 ercircle 发表于 2025-7-31 11:34
其它状态只预留了函数没有处理,可以在
usb_resume
拔出 USB,不会产生中断,我给USB中断加了一个超时,如果超时没有中断,我就认为USB 拔出了 zhx 发表于 2025-7-31 16:06
拔出 USB,不会产生中断,我给USB中断加了一个超时,如果超时没有中断,我就认为USB 拔出了 ...
我试试看
试了下有这几个现象:
1.在文件夹左侧菜单栏->U盘->右键弹出,会调用scsi的removal和stop接口,但是未实际弹出,仍在发00心跳包。
而在桌面右下角“安全删除硬件 并弹出媒体”右键弹出则未触发,但是停止发00心跳包。
倒是可以根据这个00心跳包判断是否U盘在使用。
2.usb_suspend、usb_resume刚上电触发一次,然后再也不触发了,待研究。
STC-USB键盘之挂起/恢复中断响应及唤醒睡眠电脑的应用 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯人工智能技术交流网站 - AI32位8051交流社区
关于STC8H8K64U的USB主动挂起 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯人工智能技术交流网站 - AI32位8051交流社区
参考这两个帖子试了下,键盘范例可以触发挂起(外部供电,拔出USB,或电脑系统休眠),而U盘不行....,感觉和设备类型有关系
基于擎天柱开发板测试:
页:
[1]
2