找回密码
 立即注册
查看: 418|回复: 13

声卡功放为啥一定要死等USB,有什么办法 | 加个超时退出

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:278
  • 最近打卡:2025-05-01 11:34:49

14

主题

108

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-4-7 23:45:42 | 显示全部楼层 |阅读模式
参考Ai8051U 实现USB声卡(播放或录音+播放),读TF卡/SD卡 音频播放器,32位8051,重磅开源
https://www.stcaimcu.com/thread-10307-1-1.html
(出处: 国芯技术交流网站)

初始化USB,假如不插入电脑,后面程序不运行,怎么解决。
不可能随身带个功放还带台电脑一起。
求解谢谢。

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-7 23:48:00 | 显示全部楼层
在讨论USB声卡功放的实现时,确实存在一个常见问题:如果设备未连接到电脑,USB初始化失败,可能导致后续程序无法正常运行。这对于需要独立运行的音频播放器(如基于TF卡/SD卡的播放器)来说,显然是不合理的。以下从技术角度分析问题,并提出解决方案。

问题分析
1. USB初始化的依赖性  
   USB声卡通常依赖于主机(如电脑)的枚举和通信。如果设备未连接到主机,USB初始化会失败,导致后续程序无法继续执行。这种设计在需要独立运行的场景中(如便携式音频播放器)是不合适的。

2. 独立运行的需求  
   在便携式设备中,用户可能希望设备能够独立运行,而不依赖于外部主机。例如,通过TF卡/SD卡播放音频文件,或者实现录音功能。这种情况下,USB初始化失败不应影响设备的核心功能。

解决方案
针对上述问题,可以通过以下方法实现设备的独立运行:

1. 多模式设计  
   设备可以设计为支持多种工作模式,例如:  
USB模式:连接到电脑时,作为USB声卡使用。  
独立模式:未连接电脑时,作为独立的音频播放器或录音设备运行。  
   在初始化阶段,设备可以检测是否连接到主机。如果未检测到主机,则跳过USB初始化,直接进入独立模式。

2. 状态检测与切换  
   在程序启动时,通过检测USB连接状态(如检测VBUS电压或D+/D-信号)来判断是否连接到主机。如果未检测到连接,则跳过USB初始化,直接加载独立模式的功能(如读取TF卡/SD卡中的音频文件)。

3. 模块化程序设计  
   将USB初始化和独立功能模块化,确保两者互不干扰。例如:  
USB初始化模块仅在检测到主机连接时执行。  
独立功能模块(如音频播放、录音)始终可用,无论是否连接主机。  
   这种设计可以提高代码的可维护性和灵活性。

4. 参考Ai8051U的实现  
   Ai8051U是一款支持USB的32位8051单片机,其开源项目提供了USB声卡和音频播放器的实现。可以参考其设计思路,结合多模式设计和状态检测,实现设备的独立运行。具体步骤如下:  
在初始化阶段,检测USB连接状态。  
如果未连接主机,跳过USB初始化,直接进入独立模式。  
在独立模式下,通过TF卡/SD卡读取音频文件,并调用音频解码和播放功能。

示例代码框架
以下是一个简化的代码框架,展示如何实现多模式设计:
  1. c
  2. void main() {
  3.     // 检测USB连接状态
  4.     if (isusbconnected()) {
  5.         // 初始化USB
  6.         usbinit();
  7.         // 进入USB模式
  8.         usbmode();
  9.     } else {
  10.         // 跳过USB初始化,进入独立模式
  11.         independentmode();
  12.     }
  13. }
  14. void independentmode() {
  15.     // 初始化TF卡/SD卡
  16.     sdcardinit();
  17.     // 读取音频文件
  18.     audiofile = readaudiofile();
  19.     // 播放音频
  20.     playaudio(audiofile);
  21. }
  22. bool isusbconnected() {
  23.     // 检测VBUS或D+/D-信号
  24.     return detectvbus() || detectdpdm();
  25. }
复制代码

总结
通过多模式设计、状态检测和模块化程序设计,可以有效解决USB声卡功放在未连接主机时无法运行的问题。参考Ai8051U的开源实现,可以进一步优化设计,实现设备的独立运行和多功能支持。希望以上分析和解决方案对您有所帮助。

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-8 00:54:45 | 显示全部楼层
有个if(DeviceState!=DEVSTATE_CONFIGURED) continue;
等待USB配置完毕的,不连接USB时跳过或改成超时跳过
===源程序无超时退出,建议加上


DebugLab
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:278
  • 最近打卡:2025-05-01 11:34:49

14

主题

108

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-4-8 07:44:24 | 显示全部楼层
国芯人*** 发表于 2025-4-7 23:48
在讨论USB声卡功放的实现时,确实存在一个常见问题:如果设备未连接到电脑,USB初始化失败,可能导致后续程 ...

中途插入,也可以连接USB?

点评

是的,只要你调用了usb_init初始化函数 任何时候连接USB都可以  详情 回复 发表于 2025-4-8 10:14
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2025-4-8 07:49:45 | 显示全部楼层
TK0*** 发表于 2025-4-8 07:44
中途插入,也可以连接USB?

你初始化后就可以
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

积分
3599
发表于 2025-4-8 10:14:05 | 显示全部楼层
TK0*** 发表于 2025-4-8 07:44
中途插入,也可以连接USB?

是的,只要你调用了usb_init初始化函数
任何时候连接USB都可以
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2025-4-8 10:32:12 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:278
  • 最近打卡:2025-05-01 11:34:49

14

主题

108

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-4-8 11:14:42 来自手机 | 显示全部楼层
神农鼎 发表于 2025-4-8 10:32
用最新的 USB库函数,用最新的 ISP 软件

深圳国芯人工智能有限公司-库函数

一定要最新USB库?以前的不能按照上面改么

点评

如用到库,就用最新的  详情 回复 发表于 2025-4-8 11:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15609
发表于 2025-4-8 11:18:23 | 显示全部楼层
TK0*** 发表于 2025-4-8 11:14
一定要最新USB库?以前的不能按照上面改么

如用到库,就用最新的
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:278
  • 最近打卡:2025-05-01 11:34:49

14

主题

108

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-4-8 21:45:20 | 显示全部楼层
Debu*** 发表于 2025-4-8 00:54
有个if(DeviceState!=DEVSTATE_CONFIGURED) continue;
等待USB配置完毕的,不连接USB时跳过或改成超时跳过
...

123.png 原程序有这个怎么还是不行。不知道卡在哪里了,后面按键功能完全不能使用
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 20:29 , Processed in 0.164366 second(s), 117 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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