Les Cartes SD

Tout le formatage en FAT32.

Les Cartes SD


Master boot record - MBR (Secteur 0)
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
etc
000001A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 82  ................
000001C0  03 00 0C FE FF FF 00 20 00 00 A3 6B CF 01 00 00  ....... ...k....
000001D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA  ..............U.

Partition entry N°1:
000001BE   00 82 03 00 0C FE FF FF 00 20 00 00 A3 6B CF 01
Partition entry N°2:
000001CE   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Partition entry N°3:
000001DE   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Partition entry N°4:
000001EE   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Layout of one 16-byte partition entry (all multi-byte fields are little-endian)
Pour retrouver l'adresse de la FAT32:
BootSectorStart=0x2000
[0x01C6..0x01c9]=00 20 00 00 soit en "little-endian" Le secteur 0x00002000, soit secteur 8192.
OffsetDescriptionTaille en octetDans cette carte
00x80 si actif (bootable), 0 sinon 100
1Début de la partition dans l'adressage CHS382 03 00 → 0x0382
4Type de la partition10C
5Fin de la partition dans l'adressage CHS3FE FF FF
8Décalage relatif à la partition dans les secteurs (LBA)400 20 00 00 → 0x00002000 (8192)
12Taille de la partition dans les secteurs4A3 6B CF 01 → 0x01CF6BA3 (30370723 soit 32Go)
FAT32 Boot Record Information

Pour le secteur 8192 de la partition 1:

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000000000 EB 58 90 →JUMP
000000003 4D 53 44 4F 53 35 2E 30 →OEM ID	"MSDOS5.0"
00000000B 00 02 → 0x0200 soit 512octets par secteurs
BPB_BytsPerSec=0x200
00000000D 10 → Secteurs par cluster 16 soit 16x512→8ko
BPB_SecPerClus=0x10
00000000E 22 00 → BPB_RsvdSecCnt : Secteurs réservés. Le nombre de secteurs précédant le début de la première FAT, 
					y compris le secteur de démarrage. 
					0x0022 soit 34 secteurs 
BPB_RsvdSecCnt=0x22
000000010 02 →  Nombre de copie du FAT
BPB_NumFATs=0x02
000000011 00 00 →  BPB_RootEntCnt Entrées racines (FAT12 / FAT16 uniquement).
000000013 00 00 →  Petits secteurs (FAT12 / FAT16 seulement).
000000015 F8 → BPB_Media Descripteur de média.0xF8 indique un disque dur.
000000016 00 00 →  Secteurs par FAT (FAT12 / FAT16 uniquement).
000000018 3F 00 →  Secteurs par piste 0x003F soit 63 secteurs
00000001A FF 00 →  Nombre de têtes.
00000001C 00 20 00 00 → Secteurs cachés. Le nombre de secteurs sur le volume avant le secteur de démarrage.
						 0x00002000 soit 8192 secteurs
000000020 A3 6B CF 01 →  30.370.723 secteurs total
000000024 DF 39 00 00 →  Secteurs par FAT (FAT32 seulement)
BPB_FATSz32=0x39DF
000000028 00 00 → BPB_ExtFlags.
00000002A 00 00 →  BPB_FSVer Version du système de fichiers (FAT32 uniquement).
00000002C 02 00 00 00 →  Le numéro de cluster du premier cluster du répertoire racine. (FAT32 uniquement).
BPB_RootClus=0x0002

000000030 01 00 →  BPB_FSInfo Numéro du secteur de l'information du système de fichiers (FAT32 uniquement).
	Numéro de cluster du premier cluster du répertoire racine.
	
Root_dir_cluster=0x0001
000000032 06 00 →  BPB_BkBootSec Secteur de démarrage de sauvegarde (FAT32 uniquement). (Secteur 0x0006)
000000034 00 00 00 00 00 00 00 00 00 00 00 00 →  BPB_Reserved Réserve pour futur extension (FAT32 uniquement).
000000040 00 →  BS_DrvNum:Numéro de lecteur physique.
000000041 00 →  BS_Reserved1:Réservé.
000000042 29 →  BS_BootSig :Signature de démarrage étendue. 0x29 ou 0x28
000000043 C1 C4 25 10 →  BS_VolID:Numéro de série au hasard du volume.
000000047 4E 4F 20 4E 41 4D 45 20 20 20 20 →  BS_VolLab:Ancienne étiquette de volume. "NO NAME"
000000052 46 41 54 33 32 20 20 20 → BS_FilSysType:System ID. Un champ de texte avec une valeur de "FAT32   "
00000005A 33 C9 8E D1 BC F4
000000060 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08
000000070 CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F
000000080 B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7
000000090 C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E
0000000A0 2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9
0000000B0 01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC
0000000C0 84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB
0000000D0 EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19
0000000E0 66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06
0000000F0 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4
000000100 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55
000000110 AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4
000000120 42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58
000000130 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE
000000140 C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A
000000150 56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61
000000160 0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3
000000170 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00
000000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000001A0 00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 52 65 ............♪◙Re
0000001B0 74 69 72 65 7A 20 6C 65 73 20 64 69 73 71 75 65 tirez les disque
0000001C0 73 FF 0D 0A 45 72 72 2E 20 64 69 73 71 75 65 FF s ♪◙Err. disque 
0000001D0 0D 0A 50 72 65 73 73 65 7A 20 75 6E 65 20 74 6F ♪◙Pressez une to
0000001E0 75 63 68 65 20 70 6F 75 72 20 72 65 64 82 6D 61 uche pour redéma
0000001F0 72 72 65 72 0D 0A 00 00 00 AC C2 D0 00 00       rrer♪◙...¼┬╨..  
0000001F0 55 AA Boot Record Signature 0xAA55
FieldMicrosoft's NameOffsetSizeValueActual
Bytes Per SectorBPB_BytsPerSec0x0B16 BitsAlways 512 Bytes0x200→512
Sectors Per ClusterBPB_SecPerClus0x0D8 Bits1,2,4,8,16,32,64,1280x10
Number of Reserved SectorsBPB_RsvdSecCnt0x0E16 BitsUsually 0x200x22
Number of FATsBPB_NumFATs0x108 BitsAlways 20x02
Sectors Per FATBPB_FATSz320x2432 BitsDepends on disk size0x39DF
Root Directory First ClusterBPB_RootClus0x2C32 BitsUsually 0x000000022
Signature(none)0x1FE16 BitsAlways 0xAA550xAA55
RootDirSectors=0 sur FAT32
FirstDataSector = BPB_RsvdSecCnt + (BPB_NumFATs * BPB_FATSz32) + RootDirSectors
					0x22		 +       2      x  0x39DF	   +   0
                = 0x73E0 (29664)
FirstDataSector*BPB_BytsPerSec=0x73E0*0x200=0x000E7C000

File System Information Sector instruction

FieldMicrosoft's NameOffsetSize
Bytes
Short Filename1DIR_Name0x008
Short file extension 0x083
Attrib Byte2DIR_Attr0x0B1
Reserved 0x0C1
First Cluster HighDIR_FstClusHI0x142
First Cluster LowDIR_FstClusLO0x1A2
File SizeDIR_FileSize0x1C4
1.First byte Short Filename
0x00Entrée disponible, marque également la fin du répertoire
0x05Le nom de fichier commence en fait par le caractère ASCII 0xE5 (valeur réservée)
0x2EEntrée '.' ou '..'
0xE5Entrée supprimée. Les outils de recouvrement de fichiers supprimés remplacent ce caractère par un autre pour restaurer le fichier supprimé.
2.Attrib Byte
BitMasqueDescription
00x01Lecture seule
10x02Fichier caché
20x04Fichier système
30x08Nom du volume
40x10Sous-répertoire
50x20Archive
60x40Device (utilisé en interne, jamais sur disque)
70x80Inutilisé

Long File Name on a FAT Volume

 Offset(h)000102030405060708090A0B0C0D0E0F
2nd
Long
Entry
000E7C0200x42.grp000x0F0x00Check
Sum
0xFFFF
000E7C0300xFFFF0xFFFF0xFFFF0xFFFF0xFFFF0x00000xFFFF0xFFFF
1st
Long
Entry
000E7C0400x01homer0x0F00Check
Sum
-
000E7C050simps0x0000on
Short
Entry
000E7C060HOMER-~1GRP20NTCreate time
000E7C070Create
Date
Last
Access
Date
0x0000 Last
Modified
Time
Last
Modified
Date
First
Cluster
File Size
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000E7C000 52 45 43 4F 56 45 52 59 20 20 20 08 00 00 00 00 RECOVERY   ◘....
000E7C010 00 00 00 00 00 00 1A 79 F3 4A 00 00 00 00 00 00 ......→y≤J......
000E7C020 42 2E 00 67 00 72 00 70 00 00 00 0F 00 9C FF FF B..g.r.p...☼.£  
000E7C030 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF           ..    
000E7C040 01 68 00 6F 00 6D 00 65 00 72 00 0F 00 9C 2D 00 ☺h.o.m.e.r.☼.£-.
000E7C050 73 00 69 00 6D 00 70 00 73 00 00 00 6F 00 6E 00 s.i.m.p.s...o.n.
000E7C060 48 4F 4D 45 52 2D 7E 31 47 52 50 20 00 94 6A 79 HOMER-~1GRP .öjy
000E7C070 F3 4A F3 4A 00 00 D0 33 E7 4A 03 00 28 C7 00 00 ≤J≤J..╨3τJ♥.(╟..
Cluster fichier : 29680 (0x73F0)
Poids forts (000E7C074)=	0x0000
Poids faible (000E7C07A)=	0x0003
Lba =((CLUSTER-Root_dir_cluster)  * BPB_SecPerCluster)   + FirstDataSector 
	=(0x03-0x02)*0x10+0x73E0
	=0x73F0
Taille=0x0000C728 = 50.984 octets
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000E7C080 42 2E 00 67 00 72 00 70 00 00 00 0F 00 0D FF FF B..g.r.p...☼.♪  
000E7C090 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF           ..    
000E7C0A0 01 68 00 6F 00 6D 00 65 00 72 00 0F 00 0D 5F 00 ☺h.o.m.e.r.☼.♪_.
000E7C0B0 73 00 69 00 6D 00 70 00 73 00 00 00 6F 00 6E 00 s.i.m.p.s...o.n.

000E7C0C0 48 4F 4D 45 52 5F 7E 31 47 52 50 20 00 0A 6B 79 HOMER_~1GRP .◙ky
000E7C0D0 F3 4A F3 4A 00 00 67 3A E1 4A 0A 00 B7 7D 01 00 ≤J≤J..g:ßJ◙.╖}☺.
Poids forts (000E7C0D4)=	0x0000
Poids faible (000E7C0DA)=	0x000A
Lba =((CLUSTER-Root_dir_cluster)  * BPB_SecPerCluster)   + FirstDataSector 
	=(0x0A-0x02)*0x10+0x73E0
	=0x7460 (29792)
Taille=0x00017DB7 = 97.719 octets
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000E7C0E0 42 70 00 00 00 FF FF FF FF FF FF 0F 00 EE FF FF Bp...      ☼.ε  
000E7C0F0 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF           ..    
000E7C100 01 53 00 63 00 6F 00 6F 00 62 00 0F 00 EE 79 00 ☺S.c.o.o.b.☼.εy.
000E7C110 2D 00 44 00 6F 00 6F 00 2E 00 00 00 67 00 72 00 -.D.o.o.....g.r.
000E7C120 53 43 4F 4F 42 59 7E 31 47 52 50 20 00 2B 6B 79 SCOOBY~1GRP .+ky
000E7C130 F3 4A F3 4A 00 00 CD 62 E8 4A 16 00 3F 3F 00 00 ≤J≤J..═bΦJ▬.??..
Cluster fichier : 29984 (0x7520)
Poids forts (000E7C0E4)=	0x0000
Poids faible (000E7C0EA)=	0x0016
Lba =((CLUSTER-Root_dir_cluster)  * BPB_SecPerCluster)   + FirstDataSector 
	=(0x16-0x02)*0x10+0x73E0
	=0x7520 (29984)
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000E7C140 41 53 00 68 00 61 00 67 00 67 00 0F 00 BC 79 00 AS.h.a.g.g.☼.╝y.
000E7C150 2E 00 67 00 72 00 70 00 00 00 00 00 FF FF FF FF ..g.r.p.....    
000E7C160 53 48 41 47 47 59 20 20 47 52 50 20 00 49 6B 79 SHAGGY  GRP .Iky
000E7C170 F3 4A F3 4A 00 00 FB 33 E7 4A 18 00 F7 4C 00 00 ≤J≤J..√3τJ↑.≈L..
Cluster fichier :  30016 (0x7540)
Poids forts (000E7C174)=	0x0000
Poids faible (000E7C17A)=	0x0018
Lba =((CLUSTER-Root_dir_cluster)  * BPB_SecPerCluster)   + FirstDataSector 
	=(0x18-0x02)*0x10+0x73E0
	=0x7540 (30016)
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000E7C180 E5 52 41 50 48 45 52 20 20 20 20 10 08 BD 66 60 σRAPHER    ►◘╜f` E5 : Entrée supprimée.
000E7C190 A6 4A F4 4A 00 00 71 3C F4 4A 1B 00 00 00 00 00 ªJ⌠J..q<⌠J←.....
...

Cas du répertoire


Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
000E7C200 41 41 00 72 00 64 00 75 00 69 00 0F 00 1E 6E 00 AA.r.d.u.i.☼.▲n.
000E7C210 6F 00 00 00 FF FF FF FF FF FF 00 00 FF FF FF FF o...      ..    
000E7C220 41 52 44 55 49 4E 4F 20 20 20 20 10 00 0E 30 3D ARDUINO    ►.♫0=
000E7C230 F4 4A F4 4A 00 00 31 3D F4 4A 47 00 00 00 00 00 ⌠J⌠J..1=⌠JG.....

Adresse in FAT : 0x00000047
(0x47-2)*0x10+0x73E0=0x7830 Secteur 30768

FirstDataSector = 29664 (0x73E0)
The last sector of this cluster is at 0x2004 + BPB_SecPerCluster -1 Résultat
STARTING...OK CMD0
BootSectorStart=0x2000
SecPerCluster=0x10
RsvdSecCnt=0x22
NumFATs=0x2
RootEntryCount=0x0
SecPerFAT=0x39DF
filesystem=0x93E0
fat_begin_lba=0x2022
Nom du fichier    Taille       Secteur          cluster   
HOMER-~1.GRP FILE 0000C728 ADR 000093F0 CLUSTER 00000003
HOMER_~1.GRP FILE 00017DB7 ADR 00009460 CLUSTER 0000000A
SCOOBY~1.GRP FILE 00003F3F ADR 00009520 CLUSTER 00000016
SHAGGY  .GRP FILE 00004CF7 ADR 00009540 CLUSTER 00000018
ARDUINO .    DIR  00000000 ADR 00009830 CLUSTER 00000047
PYTHON  .    DIR  00000000 ADR 00009840 CLUSTER 00000048
TESTSD_5.    DIR  00000000 ADR 0000A2E0 CLUSTER 000000F2
LECT_SD2.    DIR  00000000 ADR 0000A380 CLUSTER 000000FC
SIMPLE~1.ZIP FILE 002A5D46 ADR 0000A410 CLUSTER 00000105
Exemple secteur de départ
"HOMER-~1.GRP"

Secteur = (0x03-2)*0x10+0x93E0=0x093F0
filesystem=0x93E0

Comme il y à 16 (0x10) secteur/cluster, cela fait déjà 16x512=8192 (0x2000) octets à lire,
mais où est le cluster suivant?

Pour cela, il faut regarder la table de d'allocation : fat_begin_lba=0x2022

A partir de cette adresse, il faut lire le block avec un offset de :
0x03 * 4 = 0x0c Le 4 vient de la FAT32 adresse sur 32 bits soit 4 octets

0x2022+0x0c= 0x202E.

Maintenant nous lisons les 4 octets de la table d'allocation en "little-endian" soit 00 00 00 04
Soit l'adresse du nouveau secteur à lire.

Et on boucle Secteur = (0x04-2)*0x10+0x93E0=0x09400
...
La taille du fichier est importante, c'est ce qui permet de savoir quand on arrive au bout du fichier
Cependant en cas d'erreur,on peut verifier qu'il n'y à plus de secteur à lire après le bloc secteur 9.

Mais comment qu'on fait ça?

Du calme, en effet le système à des secteurs qui se suivent (mais c'est pas toujours le cas!),
donc si je regarde le bloc suivant après le secteur 9 :
0x09 * 4 = 0x24

[0x2046] FF FF FF 0F soit en "little-endian" (J'aime bien ce terme) 0x0FFFFFFF
ce qui correspond à un EOC (End Off Cluster)

La FAT32 Début de la fat (Allocation)
fat_begin_lba = Secteurs cachés + BPB_RsvdSecCnt
fat_begin_lba = 0x00002000 + 0x0022 = 0x2022
FirstSectorofCluster = ((N - 2) * BPB_SecPerCluster) + FirstDataSector;
= ((N - 2) * 0x10 +0x93E0;

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00002022 F8 FF FF 0F FF FF FF FF FF FF FF 0F 04 00 00 00
00002032 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00
00002042 09 00 00 00 FF FF FF 0F 0B 00 00 00 0C 00 00 00
000020520D 00 00 00 0E 00 00 00 0F 00 00 00 10 00 00 00
0000206211 00 00 00 12 00 00 00 13 00 00 00 14 00 00 00
0000207215 00 00 00 FF FF FF 0F 17 00 00 00 FF FF FF 0F
0000208219 00 00 00 1A 00 00 00 FF FF FF 0F FF FF FF 0F
00002092FF FF FF 0F FF FF FF 0F FF FF FF 0F 20 00 00 00
000020A221 00 00 00 22 00 00 00 FF FF FF 0F FF FF FF 0F
000020B225 00 00 00 26 00 00 00 FF FF FF 0F FF FF FF 0F
000020C229 00 00 00 FF FF FF 0F FF FF FF 0F 2C 00 00 00
000020D2FF FF FF 0F FF FF FF 0F FF FF FF 0F 30 00 00 00
000020E2FF FF FF 0F FF FF FF 0F 33 00 00 00 FF FF FF 0F
000020F2FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F
00002102FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F
00002112FF FF FF 0F FF FF FF 0F FF FF FF 0F 40 00 00 00
0000212241 00 00 00 FF FF FF 0F FF FF FF 0F 44 00 00 00
00002132FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F
00002142FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F
00002152FF FF FF 0F FF FF FF 0F FF FF FF 0F 50 00 00 00
00002162FF FF FF 0F FF FF FF 0F FF FF FF 0F FF FF FF 0F
0000217255 00 00 00 56 00 00 00 57 00 00 00 58 00 00 00
0000218259 00 00 00 5A 00 00 00 5B 00 00 00 5C 00 00 00
000021925D 00 00 00 5E 00 00 00 5F 00 00 00 60 00 00 00
000021A261 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00
000021B265 00 00 00 66 00 00 00 67 00 00 00 FF FF FF 0F
000021C269 00 00 00 6A 00 00 00 FF FF FF 0F FF FF FF 0F
000021D26D 00 00 00 6E 00 00 00 6F 00 00 00 70 00 00 00
000021E271 00 00 00 72 00 00 00 73 00 00 00 74 00 00 00
000021F275 00 00 00 76 00 00 00 77 00 00 00 78 00 00 00
0000220279 00 00 00 7A 00 00 00 7B 00 00 00 7C 00 00 00
000022127D 00 00 00 7E 00 00 00 7F 00 00 00 80 00 00 00

Filesystem ou 
FirstSectorofCluster = ((N – 2) * BPB_SecPerCluster) + FirstDataSector;
                     = ((N - 2) * 0x10               + 0x73E0;
Commande SPI La commande est exprimée en abréviation comme GO_IDLE_STATE ou CMD , est le nombre de l'index de commande et la valeur peut être de 0 à 63.
Le tableau suivant décrit uniquement les commandes qui doivent généralement être utilisées pour la lecture/écriture génériques et l'initialisation de la carte.
Pour plus de détails sur toutes les commandes, veuillez consulter les fiches techniques de MMCA et SDCA.
Command
Index
ArgumentResponseDataAbbreviationDescription
CMD0None(0)R1NoGO_IDLE_STATESoftware reset.
CMD1None(0)R1NoSEND_OP_CONDInitiate initialization process.
ACMD41(*1)*2R1NoAPP_SEND_OP_CONDFor only SDC. Initiate initialization process.
CMD8*3R7NoSEND_IF_CONDFor only SDC V2. Check voltage range.
CMD9None(0)R1YesSEND_CSDRead CSD register.
CMD10None(0)R1YesSEND_CIDRead CID register.
CMD12None(0)R1bNoSTOP_TRANSMISSIONStop to read data.
CMD16Block
length[31:0]
R1NoSET_BLOCKLENChange R/W block size.
CMD17Address[31:0]R1YesREAD_SINGLE_BLOCKRead a block.
CMD18Address[31:0]R1YesREAD_MULTIPLE_BLOCKRead multiple blocks.
CMD23Number of
blocks[15:0]
R1NoSET_BLOCK_COUNTFor only MMC. Define number of blocks to transfer
with next multi-block read/write command.
ACMD23(*1)Number of
blocks[22:0]
R1NoSET_WR_BLOCK_ERASE_COUNTFor only SDC. Define number of blocks to pre-erase
with next multi-block write command.
CMD24Address[31:0]R1YesWRITE_BLOCKWrite a block.
CMD25Address[31:0]R1YesWRITE_MULTIPLE_BLOCKWrite multiple blocks.
CMD55(*1)None(0)R1NoAPP_CMDLeading command of ACMD<n> command.
CMD58None(0)R3NoREAD_OCRRead OCR.
*1:ACMD<n> means a command sequense of CMD55-CMD<n>.
*2: Rsv(0)[31], HCS[30], Rsv(0)[29:0]
*3: Rsv(0)[31:12], Supply Voltage(1)[11:8], Check Pattern(0xAA)[7:0]

SPI Response

MMC et SDC

Il existe quelques formats de réponse de commande, R1, R2, R3 et R7, dépend de l'index de commande.
Un byte de réponse, R1, est retourné pour la plupart des commandes.
Le champ de bit de la réponse R1 est affiché en image droite, la valeur 0x00 signifie succès.
En cas d'erreur, le bit d'état correspondant dans la réponse sera défini.
La réponse R3 / R7 (R1 traînant des données 32 bits) ne concerne que CMD58 et CMD8.
Les commandes prennent un temps plus long que NCR et répond R1b.
Il s'agit d'une réponse R1 suivie d'un indicateur occupé (le DO est conduit à bas tant que le processus interne est en cours).
Le contrôleur hôte doit attendre la fin du processus jusqu'à ce que DO soit élevé (un 0xFF est reçu).

Réinitialisation du logiciel

Nous prévoyons un CMD0 avec CS bas pour réinitialiser la carte.
Le signal CS des échantillons de carte sur un CMD0 est reçu avec succès.
Si le signal CS est faible, la carte entre en mode SPI et répond à R1 avec In Idle State bit (0x01).
Étant donné que le CMD0 doit être envoyé en tant que commande native, le champ CRC doit avoir une valeur valide. Une fois que la carte entre en mode SPI, la fonction CRC est désactivée et la CRC n'est pas vérifiée par la carte, de sorte que la routine de transmission de commande peut être écrite avec la valeur CRC codée valide uniquement pour CMD0 et CMD8 avec l'argument de zéro. La fonction CRC peut également être commutée avec CMD59.