Initialisation de la carte SD à l'ips questions
J'ai eu un coup d'oeil à Débordement de Pile question Initialisation d'une carte microSD à l'aide d'une interface SPI et n'ai pas vu toutes les réponses qui correspondait à mes question (qui est, choses que je n'ai pas encore essayé).
J'ai un problème similaire lorsque j'essaye d'accéder à une carte SD grâce à un microcontrôleur de l'interface SPI (en particulier un HC908). J'ai essayé de suivre les diagrammes de flux dans la Couche Physique Simplifié de la Spécification v2.00 et il semble à initialiser correctement sur Transcender 1GO & 2GO et un AE&C 1GO carte. Mais je vais avoir des problèmes sur les trois autres cartes au hasard de ma cachette de vieilles cartes que j'ai utilisé sur mon appareil photo.
Mon code est tous les HC908 assembleur. J'ai exploré le SPI de l'horloge de la ligne et lors de l'initialisation, il est d'environ 350kHz (le seul multiplicateur de vitesse que les HC908 de fournitures à bas de mon MCU vitesse d'horloge qui tombe dans l'100 - 400kHz fenêtre).
Voici les résultats des trois cartes qui ne sont pas à compléter ma routine d'initialisation (le tout fait consécutivement sans changer le code ou les paramètres de synchronisation):
Canon 16Meg card (labeled as SD):
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (indicates idle)
Send CMD8 [0x48000001AA87] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Because illegal command set local flag to indicate v1 or MMC card
Send CMD58 [0x7A00000000FD] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
because illegal command branch to error routine
Send CMD13 [0x4D000000000D] (show status buffer) and Loop up to 8 times waiting for high bit on response to go low
R1= 0x05 (idle and illegal command)
Est la commande illégale drapeau coincé? Devrais-je faire quelque chose après CMD8 pour effacer le drapeau?
SanDisk UltraII 256Meg
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send CMD8 [0x48000001AA87] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Because illegal command set local flag to indicate v1 or MMC card
Send CMD58 [0x7A00000000FD] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send 0xFF 4 times to read OCR
OCR = 0xFFFFFFFF
Send CMD55 [0x770000000065] (1st part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send CMD41 [0x6900000000E5] (2nd part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Because illegal command, assume card is MMC
Send CMD1 [0x4100000000F9] (for MMC) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command)
Repeat the CMD1 50 times (my arbitrary number to wait until idle clears)
Every R1 response is 0x05 (idle and illegal command)
Pourquoi est-OCR toutes les F? Ne semble pas bon du tout. Aussi, pourquoi ne ACMD41 et CMD1 répondre illégal de commande? Est CMD1 à défaut parce que la carte est en attente de la validité de l'ACMD après la CMD55 même avec la commande illégale réponse?
SanDisk ExtremeIII 2G:
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Send CMD8 [0x40000001AA87] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x7F (??? My loop shows the responses for each iteration and I got 0xFF 0xFF 0xC1 0x7F... is the card getting out of sync?)
Send CMD58 [0x7A00000000FD] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle and back in sync)
Send 0xFF 4 times to read OCR
OCR = 0x00FF80
Send CMD55 [0x770000000065] (1st part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x5F (??? loop responses are 0xFF 0xFF 0xF0 0x5F... again out of sync?)
Send CMD41 [0x6900000000E5] (2nd part of ACMD41) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x05 (idle and illegal command, but back in sync???)
Because illegal command, assume card is MMC
Send CMD1 [0x4100000000F9] (for MMC) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x7F (??? loop responses are 0xFF 0xFF 0xC1 0x7F... again out of sync?)
Repeat CMD1 and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (idle)
Repeat CMD1 and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x7F (??? loop responses are 0xFF 0xFF 0xC1 0x7F... again out of sync?)
Repeat CMD1 and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x00 (out of idle)
Send CMD9 [0x4900000000AF] (get CSD) and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x3F (??? loop responses are 0xFF 0xFF 0xC1 0x3F... again out of sync?)
Code craps out because Illegal command bit is high.
Ce qui sur Terre est le problème avec cette carte?
Parfois, il est dans la synchro, d'autres fois non. (Ci-dessus motif de est reproductible.) J'ai l'étendue de ça et je ne vois pas de toute voyous cycles d'horloge en passant par entre MOSI/MISO transferts.
Trouvé un bug dans votre liste de commandes pour "SanDisk ExtremeIII":
Send CMD8 [0x40000001AA87
-il doit être 0x48, pas 0x40.
OriginalL'auteur Sembazuru | 2010-03-02
Vous devez vous connecter pour publier un commentaire.
OK... j'ai trouvé mon problème. Pour quelqu'un d'autre qui s'exécute dans cette question, il est important de se rappeler d'envoyer un extra
0xFF
après l'obtention de réponses. Cela donne à la carte, un supplément de huit cycles d'horloge pour se préparer pour la prochaine commande. Certaines cartes ne semblent pas en avoir besoin (les Transcende que je suis en utilisant par exemple), mais d'autres exigent.J'ai, en fait une simple boucle au début de ma "commande d'écriture' de routine qui envoie
0xFF
jusqu'à ce qu'il obtient0xFF
comme une réponse juste si je n'ai pas à aller dans tous les endroits où j'ai lu les réponses afin de m'assurer de mettre un extra envoyer0xFF
. Parce que pour ce que la carte SD est (généralement) concerné en mode SPI, si il n'existe pas de cycles d'horloge à venir, le temps s'arrête.Une chose que j'ai remarqué et n'ai pas encore trouvé de réponse (mais pour l'instant il n'est pas mal n'importe quoi), après j'ai lu les 16 octets de la RSE, il semble y avoir un supplément de 2 octets de non-
0xFF
qui vient de l'extérieur... c'Est qu'un CRC16? Bizarre, car la RSE a un CRC construit en...Merci, vous me sauvez heures!!
Idem, cela a été très utile, spécialement de l'envoi jusqu'à 0xFF 0xFF est retourné. J'ai eu une Classe de 2 Transcend carte qui a bien fonctionné, mais quand je suis passé à une Class 4 Transcend carte, j'ai pu initialiser, mais de ne pas le lire. Maintenant, je peux. Merci.
J'ai eu un problème similaire et cette réponse a résolu mon problème, merci. J'ai eu 3 cartes SDHC, mon initialisation a travaillé pour le Toshiba et Panasonic, mais la carte SanDisk n'aurait tout simplement pas de travail. L'envoi de cycles d'horloge résolu que
OriginalL'auteur Sembazuru
Si vous avez activé la CRC (avec CMD59), alors oui, les blocs de données aura CRC16 ajouté.
Pour plus d'informations, voir "Couche Physique Simplifié de la Spécification de la Version 2.00", les chapitres "Transfert en Bus de la Protection" et "Lecture des Données".
OriginalL'auteur domen
C'est important: j'ai eu beaucoup de problèmes avec SD/MMC card, jusqu'à ce que j'ai découvert que j'avais à sélectionner une tension de fonctionnement.
Vous le faites, par l'envoi d'ACMD41 avec le bit pour la tension vous êtes à la fourniture de la carte.
Remarque: un seul bit peut être sélectionné.
Si vous ne sélectionnez pas de tension ou de sélectionner plus d'un, il va continuer boucle dans le vide-de l'état et de ne jamais quitter certaines cartes SD.
Qui est: Si votre ACMD41 maintient l'envoi de la réponse 0x01, vous n'avez pas sélectionné de tension.
La tension est ACMD41 32 bits paramètre bits 23...8.
Pour 3.2 V ... 3.3 V, c'est peu de 20, de sorte que par exemple, vous pourriez:
Que l'hex-valeur 0x10, de sorte que votre ACMD41 devrait ressembler à ceci...
0x69 0x40 0x10 0x00 0x00 0xCD
...ou si c'est un SDSC carte...
0x69 0x10 0x00 0x00 0x00 0x5F
Voici une courte (et incomplète) de la table de la plupart des valeurs communes:
Vous ne PAS avoir à changer de CS à haute à n'IMPORTE quel point dans le temps. Vous pouvez garder faible TOUT le temps.
En mode SD, cependant, que l'argument: "[...] l'hôte envoie le nécessaire tension VDD fenêtre de l'opérande de l' [SD_SEND_OP_COND (ACMD41)] commande. Les cartes SD ne peut pas effectuer des transferts de données dans la plage spécifiée doit se défausser d'eux-mêmes de la poursuite des opérations de bus et aller dans Inactifs État2. En omettant la plage de tension de la commande, l'hôte peut requête de chaque carte et de déterminer s'il y a des incompatibilités avant l'envoi-de-gamme de cartes dans un état inactif."
OriginalL'auteur