Tutoriel : connecter une carte SD à un microcontrôleur part 1

Tutoriel : connecter une carte SD à un microcontrôleur part 1

  • Post author:
  • Post category:Blog

Je ne vais pas refaire toute la documentation d’une carte SD mais je vous présente tout de suite comment faire pour connecter une carte SD à un microcontroleur. Les codes sont utilisables directement avec XC8 de Microchip.

Cette article portera sur le hardware pour connecter physiquement la carte au micro et sur la partie software. A ce propose, c’est une libraire extra-light que je vous propose car elle a besoin d’environ 600 octets de RAM.

Le Hardware

La carte SD fonctionne sous une tension max de 3.3V et utilise un port SPI. Il arrive que le PIC (ou le micro) soit alimenté en 5V (si si ça arrive encore) et que du coup, ça marche pas bien. Soit vous mettez un convertisseur de niveau (level shiffter) soit on le fait simple.

Si on le fait simple, ça donne:

Parler à une carte SD

Et oui, c’est comme pour nous. Avant de se lancer dans un dialogue, il faut connaitre le modèle de carte SD. Et à ce jour il y en a trois (la MMC, la V1 et la V2). Pour le savoir il faut lui poser des questions et en fonction des réponses on le découvre. La séquence est la suivante:

Note : la documentation allégée est dispo ici

Normalement à la fin de cette séquence, la carte est disponible pour demander une lecture ou une écriture (ou tout autre commande mais c’est pas le sujet)

 

Passons au code

Oui la procédure c’est bien, le code c’est mieux. Je ne vais pas présenter le bus SPI, wikipedia l’a déjà fait. Mais avant de présenter tout le code (qui est plus bas) il faut expliquer un peu le fonctionnement. Pour dialoguer avec la carte SD, il faut lui envoyer des commandes et observer si elle est disponible. Pour cela on a besoin de quelques fonctions et quelques paramètres.

Les commandes

Il y a toute une série de commande qu’on peut envoyer pour effectuer des actions sur la carte SD. Je me suis inspiré de l’article de LUCKY RESISTOR pour l’énumération. Voici la liste des commandes qu’on utilise le plus souvent:

Il y en a d’autre mais déjà là on ne les utilise pas toutes.

Arguments et réponses

Certaines commandes vont nécessiter l’envoi d’arguments et une fois que la carte SD a effectuée son traitement, elle va nous renvoyer les données. Tout cela nécessite 32 bits. Dans cette application, j’ai besoin d’optimiser la place en RAM et je vais donc utiliser la même variable pour les arguments et les données en réponses. Pour me simplifier l’utilisation je vais également construire une structure qui me permettra d’avoir soit un mot de 32bits soit un tableau de 4 octets. La déclaration est faite par:

Quand on envoie des commandes, la carte SD retourne également un octet de status. Ce status indique s’il y a eut des erreurs d’adresse, de CRC, de séquences ou si la carte en est attente. Cet octet est stocké dans la variable SDResponse.

Etat de la carte

La carte peut être dans différents états et de différents types. Pour que que le code soit un peu structuré, je vais créer un registre qui contiendra les différents flag

Activer et désactiver le bus SPI

Pour que le code soit un peu plus lisible, je vais créer une fonction SPI_SWITCH() qui va permettre d’activer ou de désactiver le bus SPI