SD&U盘
📎 原始文档:https://www.kdocs.cn/l/cviQAlM2VU0i SD&U盘
MMC卡:MultiMediaCard,多媒体存储卡
SD卡:Secure Digital Memory Card
常用区分方式1:大卡
常用区分方式1:小卡
小的mmc卡有类似和SD卡外观形状一致的。需要仔细对比:
正常SD卡比MMC卡厚了0.7mm,外表几乎一样,但是放在一起,用手摸一下能看到厚薄的差别。
mmc卡和sd卡的 cmd检测命令不一致。所以如果程序配置SD卡检测方式为cmd检测,会出现无法兼容mmc卡的情况。

所以需要兼容SD卡和mmc卡,SD卡检测方式应选为clk或IO检测。并做以下修改:

SD相关应用
SD卡应用相关配置

三种检测方式

流程 检测到卡插入或拔出-->触发相应的公共设备事件处理-->解码设备上下线,设备挂载等处理-->设备扫盘
卡活跃状态的使能与否
杰理默认读卡流程如下:
- 读卡数据完毕后,发送CMD0命令将SD卡复位到Idle状态。(SD卡上电或者复位后,会进入idle低功耗状态)
- 在idle状态下省电,每当需要读取数据时,执行一次初始化流程再进行读取。(但该初始化过程的瞬态功耗很高,可能会导致扯电下线)
使能卡活跃状态后,流程如下: - 该状态下,读取完数据后不会让卡进入idle状态,卡的全程耗电是稳定的。但整体功耗会比idle高

另外,SDK 设计在 播高码率歌的 时候, 会动态将卡的操作模式 设为 卡活跃模式。 而 播 低码率的歌 时,会切回 非卡活跃 模式,省电。
通过配置提高sd卡解码读文件缓存的大小,可以优化播放高码率文件有卡顿的情况(在非卡活跃模式下,可减少瞬态扯电的频次,但作用不大)
注意:VBAT>IOVDD>SDPG,当发生扯电或者播放中sd卡下线时,须确认SDPG、VBAT的电压波形。VBAT作为源头,要保持稳定
- 如何使能MMC卡功能 如果需要支持市场上这种MMC卡程序上需要做以下配置
- 程序上打开MMC卡的配置 SDK\apps\soundbox\log_config\lib_driver_config.c
const int sdx_can_operate_mmc_card = 1;
SD卡的检测改为CLK或者IO检测。不能使用CMD检测

U盘不读问题处理方法
先检查U盘文件系统是否是支持的文件系统。 默认支持 FAT12,FAT16,FAT32,exFAT
不支持:NTFS
不支持:苹果文件系统常见U盘不读处理方法 以下所有方法只在ac608n_soundbox_sdk_v1.2.1和ac696n_soundbox_sdk_v1.3.0
,ac696n_soundbox_sdk_v1.2.3验证过。旧版本的可以参照一下。
对于608n省晶振系列和696系列:
有些U盘反应较慢,host过了超时时间会认为U盘没有回应导致不读取U盘,挂载不成功
3. 在程序上开启log打印。
观察打印有没有出现这个打印
若有可以修改
第1点没有改善可以看第2点。
2.在apps\common\usb\usb_common_def.h文件中修改
超时时间,复位持续时间,尝试次数加长,以等待slve回应,。
4. 程序若使能了PC模式,则USB OTG 会第一时间以host端发送数据,若从机没有回应会认为此时应该担任slave的角色。有些U盘会插入后发送信息会较慢,导致USB OTG 认为插入的是主机,从而切换到从机模式,导致U盘不读。 
检查下inquery的延时是否正确 apps\common\usb\host\usb_storage.c 文件中的int usb_stor_init(struct device *device),右图为正确修改

对于6965e使用的是USB和SD卡复用引脚,可以尝试一下改法:
【6.1-6965E使能U盘和SD卡复用时,如果遇到U盘不读挂载不上的问题时可以参考以下文档中的修改方法】
【金山文档】 6965E-SD卡和USB的DM脚复用的问题修改
6965E-SD卡和USB的DM脚复用的问题修改.otl
608N省晶振系列:
608系列可以参照第1点、第2点、第3点。若以上第1点和第2点没能改善,尝试下面的方法。
修改usb_host.c文件
注意:608N省晶振系列对于东芝U盘(Toshiba),采用以上办法后,仍然有概率不能挂载成功,这个问题暂时没有办法解决。
- U盘和卡复用相关 (SD、USB复用IO介绍请查找对应sdk介绍文档)
- U盘和卡复用后,默认SDK是不支持卡用CMD检测的(建议使用CLK检测)。若生产出现卡座出问题,无法使用CLK检测。一定要改成CMD检测,需要按以下修改,并多做测试:(以下是AC696X 案例)


6. USB DM接地/DM&DP短接检测(假U盘) 注意:SD&USB复用的方案,由于DM跟SD的dat是同一个IO。不能使用DM&DP短接的方式。否则会导致SD卡不正常
使用方法:sys_timer_add(NULL,fake_udisk_scan,100);
观察打印:三个状态对应的打印
DP接地/DM&DP短接: y_printf("fake udisk online 2\n");
拨出: y_printf("fake udisk offline\n");
//使用方法:sys_timer_add(NULL,fake_udisk_scan,100);
#include "usb/device/usb_stack.h"
void fake_udisk_scan(void *ptr)
{
static u16 online_cnt = 0;
static u16 outline_cnt = 0;
//static u16 fake_udisk_online = 0;
u32 otg = usb_otg_online(0);
//仅通过判断otg状态进行判断
printf("otg %x\n",otg);
extern int get_sd_status(void);
get_sd_status();
if((otg != HOST_MODE) && (otg != SLAVE_MODE)) {
//通过检测DP下拉,判断是不是假U盘
u32 usb_con0, usb_io_con0;
usb_con0 = JL_USB->CON0;
usb_io_con0 = JL_USB_IO->CON0;
//单纯 DP接地
gpio_direction_input(IO_PORT_DP);
gpio_set_die(IO_PORT_DP, 1);
gpio_set_pull_up(IO_PORT_DP, 1);
gpio_set_pull_down(IO_PORT_DP, 0);
gpio_direction_output(IO_PORT_DM,0);
gpio_set_die(IO_PORT_DM, 1);
printf("1 IO_PORT_DP DM %x %x\n",gpio_read(IO_PORT_DP),gpio_read(IO_PORT_DM));
if(gpio_read(IO_PORT_DP)==0){
online_cnt++;
if(online_cnt == 5) {
if(fake_udisk_online == 0) {
fake_udisk_online = 1;
app_task_switch_to(APP_USER_TASK);
y_printf("fake udisk online 2\n");
}
}
gpio_set_pull_up(IO_PORT_DP, 0);
//!!!这里直接返回
JL_USB->CON0 = usb_con0;
JL_USB_IO->CON0 = usb_io_con0;
return;
}
gpio_set_pull_up(IO_PORT_DP, 0);
JL_USB->CON0 = usb_con0;
JL_USB_IO->CON0 = usb_io_con0;
// printf("JL_USB->CON0 %x %x %x\n",JL_USB->CON0,JL_USB->CON0 & BIT(9),JL_USB->CON0 & BIT(15));
// if(JL_USB->CON0 & BIT(9) && (JL_USB->CON0 & BIT(15)) == 0) {
// online_cnt++;
// if(online_cnt == 5) {
// if(fake_udisk_online == 0) {
// fake_udisk_online = 1;
// y_printf("fake udisk online2\n");
// }
// }
// //!!!这里直接返回
// return;
// }
}
if(fake_udisk_online) {
fake_udisk_online = 0;
y_printf("fake udisk offline\n");
// app_task_msg_post(USER_MSG_BT_TASK_MODE, 0);
app_task_switch_to(APP_BT_TASK);
}
online_cnt = 0;
}
- 有某张TF卡不读,但其他的TF卡能读 排查思路:
1、软件开打印看一下log
2、排查一下TF卡的供电,用外置3.3V给卡供电是否正常;
3、插卡瞬间,VDDIO的电压是否有被拉低;
4、测试一下,OK卡和NG卡的瞬态工作电流,测试方法如下图:在TF电源串一个小电阻(例如2.7R),然后用示波器挂在电阻两端,测试电阻两端的瞬态压差,然后根据欧姆定律,转换为瞬态电流。
注意:不同品牌、不同速度等级、不同存储容量的TF卡,工作电流和额定工作电压是不一样的
电流大小:低速卡<高速卡<超高速卡, 小容量<大容量;
示例AC7018F-TF卡测试数据-20240903.xls
8、大音箱中,TF卡副板与音箱主板排线过长,导致不读卡
答:1、这类大音箱,一般是使用220V电源板或高压电源供电,电源辐射较强。主副板排线过长容易引入辐射干扰,影响TF卡通信。需要在TF卡副板端的CMD、CLK、DAT这3根数据线上各串一个磁珠(1K@100M)来吸收高频干扰。
2、用示波器测试TF卡插入瞬间,VCC电压是否被拉扯过低(不要低于3V ),若是被拉扯过低,则加大TF卡座电源脚的滤波电容,最大可加到226。