Était-ce utile?

La solution

Il me semble avoir trouvé le problème. Lorsque je calcule le CRC correct pour CMD55 et envoie qu'au lieu d'un CRC factice, 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 est dit explicitement que:

  

L'interface SPI est initialisé en mode CRC OFF en 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 outre, en cas d'une erreur CRC doit être 0x09 la réponse au lieu de 0x05. J'ai essayé de désactiver explicitement le contrôle CRC avec CMD59, mais cela ne semble pas aider.

=> Calcul du CRC correct pour (tous?) Des commandes rend le travail de la carte.

Je suis en contact avec le support Transcend à ce sujet. Si j'apprends quelque chose d'utile, je vous connais ici.

Notez que je autres 2 Go cartes Transcend avant, mais ils ont été fabriqués à Taïwan, alors que la nouvelle est faite en Corée (et semble être une carte Samsung (MMAGR02GUDCA)).

Autres conseils

J'ai eu presque la même question. Lors de l'envoi ACMD41, j'ai envoyé CMD55 suivi par CMD41. La réponse pour CMD55 était 0x01, ce qui indique l'état de repos et l'exécution du processus d'initialisation (ce qui est normal, je crois). CMD41 réagirait avec 0x05, ce qui indique la commande illégale. Il se trouve que ma carte particulière effectue la vérification CRC par défaut, même en mode SPI, et misreports erreurs CRC comme les commandes illégales (à savoir, il ne suit pas la spécification SD). Lorsque je calcule le bon CRC, cela fonctionne très bien. Voici le code de calcul de CRC7 je, il a bien fonctionné pour moi:

https://github.com/hazelnusse/crc7

Sauf si vous avez pris soin de désactiver le contrôle CRC, je pense qu'il est probablement préférable de supposer que ce n'est pas désactivé et assurez-vous de calculer le bon CRC pour chaque trame de commande. D'après ce que je peux dire, certaines cartes le désactiver par défaut en mode SPI et d'autres permettent, même si la spécification SD indique qu'il doit être désactivé par défaut en mode SPI, sauf pour CMD8.

Vous avez dit que vous avez utilisé CRC 0 pour la commande à défaut. Je suppose que vous vouliez dire que vous avez envoyé le tout dernier octet comme 0x00. Notez que le CRC7 est que les 7 premiers bits du dernier octet - le dernier bit appelé end bit doit toujours être 1. Donc, si vous envoyez 0x00 comme le dernier octet, avec 0 que le dernier bit, l'échec serait compréhensible, et même le code d'erreur serait logique. Si vous envoyez 1 comme le dernier bit, il devrait fonctionner, à savoir. utiliser quelque chose comme 0x01 ou 0xFF comme le dernier octet.

Il est normal, il est probable que la charge interne pompe utilisée pour assurer que la tension d'effacement qui prend plus de temps que d'habitude pour être prêt ... vous devez insister sur le combo CMD55 + ACMD41 jusqu'à ce que se termine l'initialisation.

Le CMD58 peut également vous aider à vérifier si vous fournir des niveaux de tension correcte (parfois prises ont des problèmes de contact).

Envoi CMD0 avec sélection de puce (0) ne suffit pas initialiser la carte en mode SPI. Ceci définit uniquement le mode SPI. Card n'est pas initialisé avant le retour de ACMD41 accepté. Ensuite CRC est désactivé par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top