在给tf card下单块读命令cmd17后,必须要等待一段时间才能读出第一个数据。像手头上东芝4G卡的等待时间大概是0.6ms。我估计这个等待时间是tf card内的控制芯片读取nand flash数据 到缓冲区的时间。
这个等待时间由卡内CSD寄存器中TAAC与NSAC两项参数确定,其中TAAC参数规定了固定的等待时间,这个时间不因外部时钟频率而改变,这是卡内异步操作的时长。NSAC规定了需要输入时钟脉冲的最少数目,以100为单位,参数为n代表n百个时钟脉冲。总的等待时间是上述两时间之和(TAAC+100NSAC时钟周期)。在东芝4G卡上读出NSAC=0,TAAC=0x0F(即等待时间是1ms,实际的等待时间比这个时间要短,为什么?)。TAAC和NSAC两个参数只读,不能被修改。即等待时间在TF Card生产出来后已经确定了。因此,主控IC读取TF Card单块(CMD17)的速度不仅仅取决于通信引脚CLK的速度,还与等待时间有关。比如读单块512bytes,需要时间=等待时间0.6ms+(512*2)/4Mhz=0.856ms(其中4M是通信引脚clk的时钟频率)。多块读命令CMD18只有读第一个Block的时候才需要等待时间,读后面的block就没有等待时间了。我估计是内部的控制芯片边读NAND FLASH下一个Block的数据到缓冲区,边将上一个block的缓冲数据传出去。
命令9可以获取sd卡中csd寄存器的值,该值包括很多sd卡的信息,其中就有sd卡的容量,TAAC和NSAC的信息等。这个值在sd卡接收到cmd9之后会以response的形式存放在sd控制器的SDI Response Register[0,1,2,3]中。
在执行cmd9,cmd10等这样的命令的时候,卡的状态应该是不选中的,或直接在执行它们之前发送cmd7(0)不选中卡,不然的话会timeout。