Initialisation d'une carte microSD à l'aide d'une interface SPI
j'utilise un microSD carte dans un design intégré. La carte est connectée à un microcontrôleur via L'interface SPI. Cela a bien fonctionné pour toutes les cartes que j'ai utilisées avant, mais maintenant ma nouvelle carte ne sera pas initialiser. La carte est une carte de microSD Transcend 2 Go (TS2GUSD).
Après l'envoi de la première horloge train de basculer en mode SPI, je ne les suivants:
CMD0 (Argument 0, CRC 0x95) - > réponse 0x01 - > OK
CMD8 (Argument 0x000001AA, CRC 0x87) - > Response 0x01 0x000001AA - > Means it's SDC V2+ card, the voltage range 2.7 V - 3.6 V is supported -> OK
alors je devrais envoyer la commande ACMD41, mais quand j'envoie le CMD55 (argument 0, CRC 0) qui doit précéder le CMD41, j'obtiens la réponse 0x05 -> commande illégale. J'ai aussi essayé D'envoyer CMD1 (pour les cartes MMC), mais il donne un illégal de la commande réponse. Le code fonctionne bien avec ma carte Sandisk 2 Go microSD.
Comment puis-je résoudre ce problème?
5 réponses
il semble que j'ai trouvé le problème. Quand je calcule le CRC correct pour CMD55 et que je l'envoie au lieu d'un CRC fictif, la commande est acceptée (résultat 0x01). Si vous regardez la spécification de la couche physique dans la section 7.2.2, il dit explicitement que:
l'interface SPI est initialisée dans le mode CRC OFF par défaut. (sauf pour les commandes CMD0 et CMD8).
Cela ne semble pas être le cas avec cette série de cartes Transcend, violant ainsi la spécification. En cas d'erreur CRC, la réponse doit être 0x09 au lieu de 0x05. J'ai essayé de désactiver explicitement la vérification du CRC avec CMD59, mais cela ne semble pas aider.
=> calculer le CRC correct pour (tous?) les commandes font fonctionner la carte.
Je suis en contact avec Transcend support à ce sujet. Si j'apprends quelque chose d'utile, vous le saurez ici.
notez que j'ai utilisé d'autres cartes transcendantales de 2 Go avant, mais elles ont été faites à Taiwan, alors que le nouveau est fabriqué en Corée (et semble être une carte Samsung (MMAGR02GUDCA)).
j'ai eu presque le même problème. En envoyant ACMD41, J'ai envoyé CMD55 suivi de CMD41. La réponse pour CMD55 était 0x01, indiquant l'état inactif et exécutant le processus d'initialisation (c'est normal, je pense). CMD41 répondrait avec 0x05, indiquant un commandement illégal. Il s'avère que ma carte particulière vérifie le CRC par défaut, même en mode SPI, et qu'elle signale des erreurs CRC comme des commandes illégales (c.-à-d. qu'elle ne suit pas les spécifications du SD). Quand je calcule le CRC approprié, ça marche très bien. Voici le code de calcul CRC7 que j'ai utilisé, il a bien fonctionné pour moi:
https://github.com/hazelnusse/crc7
a moins que vous n'ayez pris soin de désactiver la vérification du CRC, je pense qu'il est probablement préférable de supposer qu'elle n'est pas désactivée et de vous assurer que vous calculez le CRC approprié pour chaque cadre de commande. De ce que je peux dire, certaines cartes le désactivent par défaut en mode SPI et d'autres l'activent, même si la spécification SD stipule qu'il devrait être désactivé par défaut en mode SPI mode sauf pour CMD8.
Vous avez dit que vous avez utilisé CRC 0
pour la commande défaillante. Je suppose que vous vouliez dire que vous avez envoyé le tout dernier octet 0x00
. Notez que le CRC7 n'est que les 7 premiers bits du dernier octet - le dernier bit appelé end bit
doit toujours être 1
. Donc, si vous envoyiez 0x00
comme dernier octet, avec 0
comme le dernier morceau, l'échec serait compréhensible, et même le code d'erreur aurait du sens. Si vous envoyez 1
comme le dernier morceau, il doit travailler, c'est à dire. utilisez quelque chose comme 0x01
ou 0xFF
comme dernier octet.
c'est normal, c'est probablement la pompe de charge interne utilisée pour faire de la tension d'effacement qui prend plus de temps que d'habitude pour être prête... vous devez insister sur le combo CMD55+ACMD41 jusqu'à la fin de l'initialisation.
le CMD58 peut également vous aider à vérifier si vous fournissez les niveaux de tension corrects (parfois les prises ont des problèmes de contact).
envoyer CMD0 avec chip select(0) seul n'initialise pas la carte en mode SPI. Cela ne définit que le mode SPI. La carte N'est pas initialisée tant que ACMD41 n'est pas acceptée. Alors le CRC est désactivé par défaut.