ACMD6与CMD6是初始化末尾容易混淆的一对命令。ACMD6只管车道数,参数0为1位、2为4位,CMD7选中后发,发完先给至少8个时钟主机再切4位;CMD6管速度,32位参数bit31选查询或执行,应答64字节看四个位置,切完必须把时钟提到50MHz才真正生效。
关键要点
ACMD6即SET_BUS_WIDTH只管车道数:参数0为1位、2为4位,在CMD7选中卡之后发送。
ACMD6发完先给至少8个时钟,控制器再切4位,否则头几次传输错位或CRC失败。
CMD6即SWITCH_FUNC管速度:32位参数bit31选查询或执行,6个功能组每4位一组,常用Group 1访问模式。
CMD6应答为R1加64字节状态:看byte[1]bit0、byte[9]低4位、byte[6]低4位、byte[19]的busy。
典型两次调用:查询0x00FFFFF1确认能力,执行0x80FFFFF1切高速,全组查询用0x00FFFFFF。
切换成功后主机要把时钟提到50MHz并重算CLKDIV;示波器时钟仍停在几百kHz就是没改分频。
两条命令各管一件事
ACMD6和CMD6在握手末尾经常并排出现,名字又像。分工清楚:ACMD6决定数据走几根线,CMD6决定总线跑什么速度。两者分别发、分别确认,ACMD6前还要带CMD55前缀。
ACMD6:只切车道数
ACMD6即SET_BUS_WIDTH,参数只有两个合法值:0为1位、2为4位。发送有前提,卡必须先由CMD7按RCA选中、进入传输态,空闲态发没有意义。卡接收配置后主机不能立刻切宽度,要先给至少8个时钟再切4位。省掉这8个时钟,命令阶段正常,切宽后头几次读会数据错位或CRC失败。
CMD6的32位参数怎么读
CMD6即SWITCH_FUNC,参数是一个32位功能组结构。bit31是模式位,0为查询、1为执行;bit30到bit24保留;之后每4位构成一个功能组,共6组,Group 1为访问模式即速度,Group 2为命令系统,Group 3为驱动强度,Group 4为电流限制。TF卡通常只用到Group 1。
64字节状态看哪四个位置
CMD6应答是R1加512bit即64字节功能状态数据,按顺序看四个位置:byte[1]的bit0表示Group 1是否支持切换;byte[9]低4位是支持的功能位图,bit1为1即支持高速;byte[6]低4位是当前生效功能号;byte[19]是Group 1的busy状态,bitN为1表示功能N切换成功。只看R1不解析这64字节,会把卡拒绝的切换误判为成功。
典型两次调用与速度档表
工程上通常调两次:先用Mode等于0查询,Group 1填目标功能号,切高速填0x00FFFFF1,确认能力位图后再用0x80FFFFF1执行;一次查全6组填0x00FFFFFF。Group 1取值与时钟固定对应,常用档位见下表。米客方德TF卡遵循CMD6协商顺序,先查询0x00FFFFF1再执行0x80FFFFF1,支持Default Speed 25MHz与High Speed 50MHz两档;Industrial WT工业宽温版与High Endurance高耐久版按颗粒档位对应速度等级,监控、记录仪这类循环覆写场景选高耐久版,宽温工况选工业版。SDR50、SDR104等档位还要求1.8V信号,需要主机硬件支持。
表1 Group 1访问模式与总线时钟
| 取值 | 访问模式 | 总线时钟 | 附加要求 |
| 0 | Default Speed | 25MHz | 上电默认,所有卡支持 |
| 1 | High Speed | 50MHz | 常用提速档 |
| 2 | SDR12 | 25MHz | 需1.8V信号 |
| 3 | SDR25 | 50MHz | 需1.8V信号 |
| 4 | SDR50 | 100MHz | 需1.8V信号加调谐 |
| 5 | SDR104 | 208MHz | 需CMD19调谐 |
| 6 | DDR50 | 50MHz双沿 | 需1.8V信号 |
切完不改分频,速度不会变
卡接受高速模式只是协商完成,时钟由主机控制器产生。CMD6成功后,主机必须把时钟提到对应频率并重算CLKDIV,Default为25MHz、High Speed为50MHz,否则卡在高速模式、总线速率没有变化。示波器上很直观:命令时序正常,时钟线却停在识别阶段的几百kHz。升频动作放在ACMD6与CMD6都完成、总线空闲时做,不要夹在数据传输中途改分频。米客方德TF卡的固件含ECC纠错与掉电数据保护,切宽升频后跑在50MHz仍按既定时序收发,异常掉电时正在写入的数据也有保护机制兜底。
切换失败的三个落点
宽度切错、速度切错、时钟没跟上,现象各有特征。切4位后头几次传输出错,回看ACMD6后的8个时钟和两侧宽度是否一致。CMD6能力位图不含目标功能,说明卡不支持该档或主机不满足1.8V信号条件,退回Default或High Speed。状态显示已切换但速率没变,查CLKDIV寄存器。
切换操作清单
确认CMD7已按RCA选中卡,卡进入传输态。
带CMD55前缀发ACMD6,按目标宽度填参数0或2。
ACMD6后给至少8个时钟,再把主机控制器切到4位。
发CMD6查询,参数0x00FFFFF1,解析64字节位图。
确认byte[9]低4位含目标功能,再发0x80FFFFF1执行。
看byte[19]对应busy位,确认功能N切换成功。
按目标档把时钟提到25MHz或50MHz,重算CLKDIV。
SDR50以上先确认主机支持8V信号,SDR104安排CMD19调谐。
示波器量时钟频率,确认没停在几百kHz。
切宽后首轮读写做校验,确认无错位与CRC失败。
常见问题
问:ACMD6和CMD6是不是同一条命令的两种写法?
答:不是。ACMD6切总线宽度,参数0为1位、2为4位;CMD6切功能与速度模式,参数是32位结构,两条分别发送与确认。
问:ACMD6发完为什么不能马上切4位?
答:规范要求先给至少8个时钟,主机再切自己的总线宽度。省掉这步,切宽后头几次传输容易错位或CRC失败。
问:CMD6查询和执行的参数差在哪?
答:差在bit31模式位。切高速时查询填0x00FFFFF1,执行填0x80FFFFF1;6个功能组一次查全用0x00FFFFFF。
问:CMD6返回成功为什么速度没变?
答:卡侧协商完成不等于主机侧提速。主机要把时钟提到50MHz并重算CLKDIV,示波器上时钟仍停在几百kHz,就是分频没改。
问:64字节状态主要看哪些位置?
答:四处:byte[1]bit0看是否支持切换,byte[9]低4位看能力位图,byte[6]低4位看当前功能号,byte[19]看各功能busy位。
问:SDR104切换要额外做什么?
答:SDR104时钟208MHz,要求1.8V信号并执行CMD19采样调谐;主机不支持1.8V信号时,SDR50以上都无法使用。
52