Introduction

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:

Permet de connecter une carte SD à un micro 5V

Je parle à une carte SD

Savoir à qui on parle

La procédure

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:

SDCard Initialisation
Source : https://www.sdcard.org/downloads/pls/

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.

Les Arguments et les réponses

Une fois que la commande est envoyée, il faut généralement envoyer des arguments à la carte SD. La carte SD, retourne aussi des résultats à la commande. Comme ce code à pour but d’être très économe en ressource RAM, on utilise la même variable. C’est un emplacement mémoire de 4 octets qui sera soit un tableau de char soit un entier de 32 bits. On le définit par :

La carte SD retourne aussi 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

Dans le PIC18, j’initialise un registre de 8 bits pour indiquer l’état de la carte. Il est construit tel que:

Bon, j’utilise pas tous les flags mais ils sont disponibles.

Activer / désactiver le bus SPI

Pour activer à la demande le bus SPI :

Selectionner et déselctionner la carte SD sur le bus SPI

Avant de communiquer, il faut sélectionner la carte SD sur le bus. J’ai préféré faire une désélection puis une sélection sur le bus de ce que j’ai compris de la documentation. Voici les fonctions

Dans ce code, j’utilise un timeout basé sur un timer interne. Mais vous pouvez le remplacer par un compteur.

Envoyer une commande

C’est une des fonctions les plus importante pour commencer. Envoyer une commande!

La séquence est relativement simple. La carte est sélectionnée sur le bus, on envoie la commande, les arguments, le CRC et on récupère les données s’il y en a.

On initialise!

Allez, maintenant qu’on connait les différentes fonctions, on peut initialiser et savoir quelle type de carte est dans le lecteur. Pour cela, on va initialiser les flags et on va partir du principe que la carte est FAILED. Ensuite, si les conditions sont OK, on dira que la carte est READY.

La fonction d’initialisation a aussi pour but d’indiquer à la carte SD que l’on veut accéder à la mémoire par blocs. Les blocs pouvant être de différentes tailles, on va les forcer à 512 octets.

 

Voila, maintenant la carte est prète à être utilisée.

Connecter une carte SD à un PIC tuto complet
Étiqueté avec :                                

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *