Bien réussir la gestion d’une carte micro-SD dans les systèmes embarqués : le matériel

Une option pratique et peu chère pour équiper son objet de mémoire

Pour les DIYers comme les professionnels, la carte micro-SD est indéniablement un support de stockage avantageux. Faible coût, faible facteur de forme, large espace de stockage, et amovible. Même les plus petits microcontrôleurs peuvent lire et écrire sur une carte SD ou micro-SD : elles peuvent communiquer à l’aide du bus SPI. Pour ceux possédant un peu plus de ressources, le bus SDIO offre une communication bien plus rapide grâce à un protocole qui peut supporter jusqu’à 4 lignes de données simultanées et ainsi atteindre des débits en lecture et écriture frôlant la centaine de méga-octets par seconde.

On trouve depuis plus d’une dizaine d’années des schémas de références, des listings de codes ici et là qui montrent que l’implémentation d’une carte micro-SD dans un système embarqué n’est plus un mystère, et pourtant… Il suffit de survoler les fils de conversation des forums amateurs, ou de fabricant de microcontrôleurs, pour se rendre compte, au vu de la variété des problèmes rencontrés, que cette petite carte mémoire donne du fil à retordre. Alors quelles sont les bonnes pratiques pour une implémentation réussie, Piwio vous propose quelques pistes de réflexions et des astuces à suivre pour faire les bons choix.

SDIO ou SPI ?

Les cartes micro-SD utilisent les mêmes pattes physiques pour dialoguer sur un bus SPI ou SDIO. Pourquoi favoriser l’un ou l’autre ? C’est du ressort de votre microcontrôleur. Si vous avez opté pour un composant qui possède un périphérique hardware SDIO accompagné de son pilote, alors n’hésitez pas et utilisez-le. Plus fiable, plus rapide, c’est le mode natif que supportent toutes les cartes SD. Il est néanmoins peu commun de le retrouver dans les microcontrôleurs les plus petits, les moins énergivores, ou simplement les moins chers. Vous pouvez alors vous tourner vers le bus SPI, et il est probable que ce soit pour ces raisons qu’on retrouve une si grande quantité d’informations à son propos sur internet.

Le choix du bus de communication aura un impact sur votre hardware puisque le routage du bus SPI ou bien des bus SDIO 1 bit et 4 bits diffèrent. En plus de la connexion directe des entrées/sorties dédiées de votre microcontrôleur au connecteur, il peut s’avérer crucial d’y adjoindre des résistances de rappel ou de tirage (communément pull-down ou pull-up) pour s’assurer du bon fonctionnement de la carte.

A savoir que notre document de référence (« SD Specifications Part 1 : Physical Layer Simplified Specification », vous l’aurez compris) ne fait aucunement mention d’une quelconque résistance pull-up ou pull-down à ajouter au circuit. Néanmoins, de notre expérience, elles peuvent être requises en supplément par certains fabricants de cartes. Pour maximiser la compatibilité de votre interface avec les innombrables modèles de cartes présents sur le marché, il est donc de bonne pratique d’ajouter ces résistances sur les lignes du bus SPI ou SDIO. A minima pour éviter de les laisser flottantes lorsqu’elles ne sont pas utilisées dans votre montage (ou bien que votre microcontrôleur les laissent dans un état haute-impédance, comme lors du boot, et nous reviendrons sur cet aspect dans la gestion avancée de la consommation énergétique de la carte). Le choix d’utiliser des résistances en pull-up ou en pull-down est guidé par l’état au repos du signal (état haut pour DAT0/DO, DAT1, DAT2, DAT3/CS et CMD/DI, état bas pour l’horloge SCLK/CLK), pour lesquelles des valeurs de 10 kOhms à 100 kOhms conviendront. De plus en plus de cartes récentes possèdent des résistances de pull-up internes, mais encore une fois l’objectif ici est de maximiser la compatibilité avec le plus grand nombre de modèles. Si votre budget et votre place sur le circuit sont si restreints que vous devez vous contenter du minimum, nous vous conseillons de conserver au moins celles sur les lignes DAT3/CS et DAT0/DO. A noter que l’ajout d’une pull-up sur la ligne DAT3/CS vous prive de sa fonction secondaire de détection de présence de carte. Dans ce cas il est possible d’utiliser un connecteur qui possède une fonction mécanique de détection (avec une pull-up, encore !).

La problématique de la consommation

Sur des systèmes à très faible consommation (nous parlons ici d’un courant actif de l’ordre du milliampère, et de courants de repos de l’ordre du microampère), l’utilisation d’une carte SD (et de manière générale d’une mémoire flash NAND de grande capacité) est un élément qui rend le design des étages d’alimentation et du calcul de la consommation énergétique plus complexes. En effet, les pics de courant lors des opérations d’écriture de la mémoire flash atteignent au moins quelques dizaines de milliampères, et généralement plus d’une centaine. Il faut alors que votre étage d’alimentation soit capable d’encaisser cette demande, sans pour autant que sa propre consommation ne devienne non négligeable lorsque la carte SD est éteinte ; l’idée n’étant pas de multiplier non plus le nombre de circuits intégrés de gestion de l’alimentation.

Une possibilité simple consiste à se tourner vers des régulateurs LDO à très faible consommation (quiescent current) et délivrant un courant maximum d’au moins 150 mA pour assurer le bon fonctionnement de la carte SD, par exemple l’AP7350 (Diodes Incorporated) qui permet de délivrer un courant de 150 mA, et présente une consommation propre de 25 µA et un courant de standby de 20 nA (le tout dans un package de 0,64 mm × 0,64 mm, difficile de faire plus petit). Il sera donc suffisamment polyvalent pour les applications qui doivent absolument réduire au maximum la consommation en fonctionnement « normal » et au repos tout en étant capable de fournir le courant nécessaire lors des accès (que l’on imagine le moins fréquents possibles) à la carte SD.

La réelle difficulté ici est en fait l’évaluation de la consommation globale de votre système. En effet les nombreux modèles de cartes SD sont extrêmement inégaux en termes de consommation. Celle-ci peut allègrement passer de 80 mA à 150 mA en écriture, même pour des cartes SD de même capacité et de même classe. Si vous souhaitez maîtriser la consommation de votre système, vous n’aurez pas d’autre choix que de cibler certains modèles de cartes qui offriront un courant à la fois suffisamment faible, mais aussi reproductible d’un échantillon à l’autre. Le problème est que le courant de consommation de la carte n’est pas toujours spécifié, et nous faisons allusion notamment aux modèles grand public. Il s’agit donc de tester plusieurs marques et modèles de cartes pour trouver celui qui vous conviendra le mieux. Les cartes de grade industriel ont des consommations qui sont plus précisément décrites et reproductibles et permettent donc une alimentation mieux maîtrisée, néanmoins leur coût peut s’avérer rédhibitoire (environ 10 fois le prix d’un modèle grand public).

Du fait des larges variations de courant dans le circuit, liées aux accès à la carte, un filtre LC limitera leur impact sur l’alimentation, notamment si le circuit contient des sections analogiques qui peuvent y être plus sensibles. Ce filtre aura l’avantage notable de permettre aussi l’insertion « à chaud » d’une carte SD, qui est une opération très sollicitante pour l’étage d’alimentation lorsque les capacités internes de la carte se charge, en plus de la mise en route du contrôleur. La chute de la tension engendrée peut suffire à déclencher un redémarrage du microcontrôleur (brown out / low voltage detector).

Le second aspect concernant la consommation est le courant de repos de la carte. Dans le cas où le pilote permet un retour « sain » de la carte à son état de repos, le contrôleur de la carte va voir sa consommation être largement diminuée. Mais encore une fois, ce courant est largement dépendant du modèle utilisé. Il peut à nouveau varier d’un facteur 10 ! Certaines cartes vont consommer quelques dixièmes de milliampères quand d’autre maintiendront un courant de repos de plusieurs milliampères. C’est à nouveau un aspect pour lequel il faut être vigilant lors de la sélection d’un modèle de carte pour les systèmes à très faible consommation. En particulier si la carte n’est utilisée que ponctuellement ou pendant des périodes définies, il est intéressant de s’affranchir complètement du courant de repos de la carte en coupant son alimentation. Cela implique que la phase d’initialisation doit être reproduite à chaque mise sous tension de la carte, néanmoins en fonction du rapport cyclique de son utilisation, cela peut faire pencher favorablement le bilan énergétique du système. Pour cela, une solution consiste alors à insérer un transistor CMOS à canal P qui jouera le rôle d’interrupteur pour la carte. Cette solution est efficace si les résistances de pull up ont été ajoutées au circuit : dans ce cas les pattes de la carte SD sont flottantes, et celles du microcontrôleur aussi si le périphérique SDIO ou SPI est coupé (les sorties du microcontrôleur peuvent être mises en haute impédance).

Piwio peut vous aider à intégrer une carte SD à votre projet, et nous détaillerons dans un prochain article les aspects logiciels à prendre en compte.