Une carte SD en mode SPI respecte-t-elle la sélection de puce / sélection d'esclave? Semble être réinitialisé dans ma demande


9

J'ai une application où j'ai un microcontrôleur (NXP LPC1343 ) qui est connecté à un FPGA via SPI 16 bits. Il existe également une carte SD utilisant le même port SPI (MISO / MOSI) mais avec une broche CS / SS différente (les deux sont actives à l'état bas, conformément à la spécification SPI). L'une des choses que je dois faire est d'écrire des données du FPGA sur un fichier sur la carte SD en utilisant FAT32 , et c'est le travail du microcontrôleur. Le microcontrôleur exécute FatFS , que j'ai réussi à utiliser de manière fiable par lui-même.

Étant donné que le microcontrôleur ne dispose que d'une petite quantité de RAM, seule une petite quantité de données peut être mise en mémoire tampon à la fois. Par conséquent, le micro doit lire un tampon du FPGA, changer le mode SPI en 8 bits, puis écrire ces données dans le FATFS. Rappelons que pour configurer la carte SD en mode SPI, une commande doit être envoyée pendant que le bus SPI fonctionne à 400 kHz, et une certaine attente doit se produire. Par conséquent, je voudrais avoir à effectuer l'initialisation une seule fois.

Cependant, effectuer des transactions sur le FPGA même en maintenant CS haut sur la carte SD semble mettre la carte SD dans un état étrange au point de devoir à nouveau passer par l'initialisation. Bien sûr, cela n'est pas souhaitable, car l'initialisation peut prendre plusieurs millisecondes, afin d'écrire seulement 4 Ko environ de données (encore une fois limité par la petite capacité RAM de mon micro). Comme j'ai besoin d'écrire plusieurs mégaoctets le plus rapidement possible, cela réduit les performances d'environ 500 ko / s à moins de 100 ko / s.

Je suis conscient que les cartes SD ne sont pas techniquement entièrement conformes SPI, mais comment résoudre ce problème?


Il devrait l'honorer, pour autant que je sache. Essayez peut-être une autre carte SD?
Marko

c'est une excellente question. Merci de l'avoir demandé (et d'y avoir répondu).
markrages

Réponses:


7

D'accord, je l'ai compris en fait. J'aurais dû googler un peu plus profondément. Il s'avère que les cartes SD n'agissent pas exactement comme les appareils SPI lors du partage d'un bus selon Comment utiliser MMC / SDC :

Dans le bus SPI, chaque périphérique esclave est sélectionné avec des signaux CS séparés, et plusieurs périphériques peuvent être connectés à un bus SPI. Le périphérique esclave SPI générique pilote / libère son signal DO par le signal CS de manière asynchrone pour partager un bus SPI.

Cependant, MMC / SDC entraîne / libère le signal DO lors de la synchronisation avec le SCLK. Cela signifie qu'il existe un risque de conflit de bus avec MMC / SDC et tout autre esclave SPI attaché à un bus SPI. L'image de droite montre la synchronisation d'entraînement / libération du MMC / SDC (le signal DO est tiré à 1/2 V cc pour voir l'état du bus). Par conséquent, pour que le MMC / SDC libère le signal DO, le dispositif maître doit envoyer un octet une fois le signal CS désactivé.

La carte SD et le FPGA essayaient probablement de conduire DO et la carte SD a été perdue, donc elle s'est réinitialisée. L'envoi d'un octet supplémentaire semble l'avoir corrigé.


Cela vous permet d'alterner entre le FPGA et la carte, non? Avez-vous également constaté que vous pouviez interrompre le transfert de données et reprendre? D'après ce qu'il dit sur elm-chan, il semble que ce ne soit pas possible, mais je serais intéressé de savoir si vous l'avez confirmé ou infirmé.
krs013

1
Oui, cela fonctionne comme prévu pour alterner entre FPGA et SD, mais vous ne pouvez pas interrompre le transfert entre les appels vers FatFS. Au moins, je n'ai pas pu faire fonctionner ça. Cela signifie que vous ne pouvez pas (par exemple) répondre à une interruption pendant une écriture de fichier et lire à partir d'un capteur à l'aide du bus SPI partagé.
Zuofu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.