1. 初始化SD卡。
我现在用的多是SPI形式,所以在这儿只评论SPI形式。在SPI形式中,一切的指令都要求先将CS脚置0。所以这点,我在后边就不再强调了。
CMD0,使SD卡从SD形式转到SPI形式。判别回来值R0,假如不是CARD IS NOT READY,阐明硬件上有问题。
CMD8,参数是0x000001AA,判别SD卡契合哪个规范。假如回来ILLEGAL COMMAND,阐明是ver1.x的卡,不然便是ver2.0的卡。
CMD1,假如是ver2.0的卡,参数是1<<30,不然便是0,读取SD卡的状况,重复,直到CARD IS READY或许超时。这儿有一个问题,Spec上主张运用ACMD1,说是通用性比CMD1好,并且CMD1并不是一开端就能够运用的。可是我在实际运用中,发现一些老卡对这个指令会回来PARAMETER ERROR。搞不懂是为什么,并且实际运用中CMD1也很好用,并没有呈现SD卡不能初始化的问题,所以我现在都直接用CMD1。
到这儿基本上SD卡就初始化结束了。接下来就能够读取数据了。
2. 读取CID(CMD10),SD卡鉴别信息,这一步不是有必要的。
鉴别信息中包含了生产商ID,使用ID,产品名称,产品版别,产品序列号,生产日期。
3. 读取CSD(CMD9),SD卡信息。
回来的CSD有两个版别。
if (CSD[0] & 0x40 == 0x40) // ver2.0的卡
容量 = 1024L*(CSD[8]<<8+CSD[9])
这个数字便是这张SD卡里边总共有多少个扇区。
if (CSD[0] & 0x40 != 0x40) // ver1.x的卡
容量 = (((CSD[6]&0x03)<<10) | (CSD[7]<<2) | ((CSD[8]&0xC0)>>6) + 1) * (1 << ((((CSD[9]&0x03)<<1) | ((CSD[10]&0x80)>>7)) + 2))
4. 读取Partition Table。
读取SD卡的扇区0到buf。
假如buf[0]不是0xEB或许0xE9,阐明这是一个分区表。
buf[454]开端的四个byte是该分区前的扇区数。例如63表明在这个分区前有63个扇区,那么这个分区的第一个扇区便是扇区63。
buf[458]开端的四个byte是该分区的扇区数。例如7990000,不是这个分区有7990000个扇区。那么这个分区的块地址便是63~7990063。
一个设备能够最多有四个分区,其他三个分区的相关数据是在buf[470]/buf[474],buf[486]/buf[490],buf[502]/buf[506]。
留意,读取buf的时分查看最好两位,应该是55AA。
5. 读取BPB。
好,到这儿咱们现已知道第一个分区是在什么方位了。现在需求做的便是读取这个分区的0扇区。也便是SD卡的第36个扇区。
这个512个byte便是这个分区的详细资料了。
查看buf[0],应该是0xEB或许0xE9。假如是的话,那便是BPB表了。接下来比较重要的几个数字是:
buf[13]的Sectors Per Cluster,便是每个簇的扇区数,也便是你在读取文件是需求一次读取的扇区数。例如8。
buf[14-15]的Reserved Sectors,保存扇区数,这个保存扇区是在分区第一个扇区到FAT表之间的扇区数。例如38。
buf[28-31]的Hidden Sectors,躲藏扇区数,这个躲藏扇区指的是在这个分区前面有多少个扇区,这个值在分区表里也有的。便是63。
buf[19-20]和buf[32-35],前者是FAT16格局中的扇区数,后者是FAT32格局中的扇区数。这个值在分区表里也是有的。便是7990000。
buf[16],FAT表数,一般是2。
buf[22-23],buf[36-39],FAT表占用的扇区数,前者是FAT16的,后者是FAT32的。例如7793。
好了,到这儿咱们就能够读取FAT文件体系中的数据了。
6. 读取FAT表。
在上面的比如中,FAT表的方位应该是分区的第一个扇区再偏移躲藏扇区数,便是63+38,等于101。所以从SD卡的101扇区开端,便是分区一的FAT表,一共有7793个扇区。
7. 读取根目录。
在FAT16中,根目录是独自的。应该是能够树立512个文件,每个文件占用32byte,所以总共是512*32/512=32个扇区。
根目录是跟在FAT表后边的,所以第一个扇区是在101+7793*2=15687。
关于FAT32体系,这段疏忽。
8. 读取数据区。
FAT16中,数据区是在根目录后边的,所以第一个扇区是15687+32=15719。便是在SD卡上的第15719个扇区。
而FAT32中,因为没有根目录,所以数据区直接跟在FAT表后边的,所以便是第15687个扇区。这个扇区便是LBA=2的当地。所以之后假如上层的文件操作函数,要对LBA=1000写数据,那便是对1000+15687=16687扇区进行写操作。
到此,咱们就得到了整个FAT体系的结构和数据,接下来就能够开端操作文件了。