Bonjour à tous
Je suis débutant et j'ai besoin de votre aide pour repondre à mes questions.
Je dois écrire le programme de mon Pic18f252 lui permettant de stocker des données dans une mémoire MMC. J'ai donc cablé ma MMC en mode SPI avec le Pic.
J'ai effectué des recherches concernant les sources permettant cette communication notament sur ( http://www.microchipc.com/sourcecode/#mmc )mais je n'y comprend pas grand chose, de plus il est en code CCS alors que je travail sous MPLAB.
Tout d'abord, dans le programme, il faut initialiser la MMC par:
* !Cs à l'état haut
* 80 coups d'horloge
* !Cs à l'état bas
* envoie de la commande CMD0 qui permet le reset de la carte
* attent que la MMC reponde avec 01h
* si 01h alors on envoie la commande CMD1
* puis on attend qu'elle reponde 0h00
Si c'est bien le cas alors la carte est initialisée.
Ainsi on a:
OUTPUT_HIGH(PIN_C2); // set SS = 1 (off)
for(i=0;i<10;i++) // initialise the MMC card into SPI mode by sending clks on
{
SPI_WRITE(0xFF);
}
OUTPUT_LOW(PIN_C2); // set SS = 0 (on) tells card to go to spi mode when it receives reset
SPI_WRITE(0x40); // send reset command
SPI_WRITE(0x00); // all the arguments are 0x00 for the reset command
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x95); // precalculated checksum as we are still in MMC mode
puts("Sent go to SPI\n\r");
if(mmc_response(0x01)==1)
return 1; // if = 1 then there was a timeout waiting for 0x01 from the mmc
puts("Got response from MMC\n\r");
i = 0;
while((i < 255) && (mmc_response(0x00)==1)) // must keep sending command if response
{
SPI_WRITE(0x41); // send mmc command one to bring out of idle state
SPI_WRITE(0x00); // all the arguments are 0x00 for command one
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0x00);
SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF
i++;
}
if(i >= 254)
return 1; // if >= 254 then there was a timeout waiting for 0x00 from the mmc
************************** MMC get response ****************************** ********/
/**** Repeatedly reads the MMC until we get the response we want or timeout ****/
int mmc_response(unsigned char response)
{
unsigned long count = 0xFFFF; // 16bit repeat, it may be possible to shrink this to 8 bit but there is not much point
while(SPI_READ(0xFF) != response && --count > 0);
if(count==0)
return 1; // loop was exited due to timeout
else return 0; // loop was exited before timeout
}
Voila donc sous Mplab, j'ai remplacé la commande SPI_WRITE() par WriteSPI(). Par contre je ne sais pas comment remplacer la commande SPI_READ pour Mplab puisqu'on ne peut pas faire passer d'argument sous celui-ci.
Je voudrais savoir la signification des arguments passer sous ses fonctions.
Le fait que tu codes sous MPLAB, CCS, C18 ou n'importe quel autre compilateur de fait pas changer le langage, le langage C c'est du C point, peut importe le compilateur, ou la cible !
Ensuite lorsqu tu utilises les fonctions SPI_WRITE et READ, tu les as recuperer dans une bibliotheques j'imagine (un fichier .h), dans ce cas il doit y avoir une explication, meme succinte, sur le fonctionnement des fonctions/arguments de cette bibliotheque.
A+
27/05/2007 - 18h04
legos
Date d'inscription
avril 2007
Messages
11
Re : pic SPI et mémoire MMC
Ok merci
Je pense que j'y suis allé un peu vite concernant cette mémoire MMC.
Je nen sais même pas comment elle est organisée en interne? Lorsque je lis certaines doc on parle de "sector"?.
22/11/2007 - 18h26
asmodyne
Date d'inscription
novembre 2007
Messages
21
Re : pic SPI et mémoire MMC
Je répond un peu tard à ce post, mais quand bien même.
Tout d'abord, je réfute d'un bloc l'assertion de "marmotte"... Le fait de changer de compilateur C, pour ce qui est des microcontrolleurs PIC, modifie ENORMEMENT
le comportement du programme. Pour obtenir les mêmes résultats que le compilateur "x" avec un compilateur "y", les options à passer en ligne de commande (quand elle sont disponibles) ne sont pas évidentes aux débutants.
Deuxièmement, en ce qui concerne les cartes MMC ou SD accédées par l'interface SPI des PIC, sachez que:
A moins d'utiliser un µC de type P18 ou supérieur, le seul formatage décent reste la FAT16. Si vous cherchez à développer une application embarquant une MMC/SD que vous prévoyez de retirer régulièrement pour la modifier via un PC, le choix de ce type de partitionnement reste le meilleur (à moins d'ajouter de l'eeprom flash à votre circuit, ce qui non seulement augmente son coût mais également nuit au performances générale de votre projet). Je pourrais développer à ce sujet sur plusieur milliers de lignes....bref.
En ce qui concerne les méthode ReadSpi, SpiRead ou autre, gardez à l'esprit qu'elle ne font qu'administrer les fonctionnalité "Hardware" de votre µC.
Les résultats d'une lecture d'octet via le périphérique hardware d'un PIC16, par exemple, seront TOUJOURS disponible dans le registre SSPBUFF.
Cependant, ne confondez le SPI, qui est une interface physique, et la couche procotole requise par les cartes MMC. Une lecture SPI via la méthode Spi_Read() ne fait que récuperer un octet sur le bus SPI. Une lecture sur MMC, quand à elle, consiste à envoyer un paquet de commande (6 octets) à la carte, qui contient le code de l'instruction de lecture (0x51), les 32 bits de l'addresse DU BLOCK MEMOIRE à lire, puis un octet de vérification (code de redondance cyclique). ENSUITE, la carte répond en renvoyant LE BLOC de données...
Si vous utilisez la FAT16, la plus petite taille de bloc admise est 512 octets : d'où le choix d'un µC généreur en RAM, tel que le P18F2525 (3Ko).
Enfin, si l'approche d'une lecture par bloc vous semble rhédibitoire, sachez qu'il est possible, lors de l'initialisation d'une MMC, de spécifier la taille des blocs transférés. J'ai travaillé avec 64octets par blocs sur un P16F886... C'est gérable, mais la pile des appels en prend un coup, et il faut être assez sage lors de la programmation afin d'éviter un stupide débordement de pile.
10/12/2007 - 10h34
microtoad
Date d'inscription
décembre 2007
Âge
26
Messages
6
Re : pic SPI et mémoire MMC
Bonjour,
j'aurais quelques questions à ce sujet :
Si vous utilisez la FAT16, la plus petite taille de bloc admise est 512 octets : d'où le choix d'un µC généreur en RAM, tel que le P18F2525 (3Ko).
Est ce qu'on peut utiliser un pic 16F628 ou un pic 18F2550 pour pouvoir l'interfacer avec la sdcard ??
Est ce que l'on est vraiment obligé d'utiliser le format de fichier FAT16 pour écrire dans la sdcard? ne peut t'on pas y écrire à la facon d'une mémoire eeprom par exemple??
11/01/2008 - 01h19
asmodyne
Date d'inscription
novembre 2007
Messages
21
Re : pic SPI et mémoire MMC
Désolé pour cette réponse tardive.
Je suppose qu'en parlant de 18f2550 ou 4550, vous faite référence à des pic disposant d'un périphérique USB, et fonctionnant exclusivement sous 5V.
Eh bien oui, vous pouvez les interfacer avec une carte SD.
Je vous conseille de lire l'Application Note #1003 de microchip à ce sujet : créer un dispositif de stockage de masse usb. Il se base sur les 18f2550/4550. Les fichiers sdcard.h et sdcard.c comportent deux routines, ReadSector et WriteSector, qui vous permettent de lire des blocs mémoires depuis la SD/MMC. Les fichier msd.c et msd.h, quant à eux, exposent comment le PIC, se comportant en controlleur USB de disque plug&play, accède à la carte SD en utilisant ces routines.
Le plus petit bloc lisible est de 64 octets... Juste le double d'un échange en salve d'une bête eeprom flash 24C16...pour la même finalité. Par contre, si vous utiliser la carte mémoire à ces fins, elle ne sera certainement plus lisible sur un PC : si vous écrasez les deux copies du MBR de la carte SD, elle sera définivement condannée à rester une "eeprom" informatable... à mois de réecrire les deux MBR telles qu'elle étaient à l'origine, depuis le PIC de votre prototype.
Notez bien : plus de MBR, plus de formatage , même "bas niveau"... la MBR contient les informations de structure de la carte (taille, nombre de secteur, etc) essentielles au programmes de formatage (c'est assez logique qu'il ne puisse plus opérer si elle manquent).
Dernière modification par asmodyne ; 11/01/2008 à 01h23.
J'oubliais, cependant, que le CSD de la carte, ou, plus vulgairement, son registre, en mémoire morte (car la carte elle-même dispose de son propre controlleur) peut être lu par la plupart des nouveau lecteurs bon marché, et des systèmes d'exploitation comme Vista peuvent ainsi restaurer le MBR (je n'ai pas testé cela sous XP).
11/01/2008 - 23h41
RISC
Date d'inscription
novembre 2006
Messages
2 453
Re : pic SPI et mémoire MMC
Envoyé par marmotte
Le fait que tu codes sous MPLAB, CCS, C18 ou n'importe quel autre compilateur de fait pas changer le langage, le langage C c'est du C point, peut importe le compilateur, ou la cible !
Attention....
Le compilateur de CCS n'est pas compatible ANCI C !
Tout programme écrit pour ce compilateur demande donc des modifications substantielles...
Notez bien : plus de MBR, plus de formatage , même "bas niveau"... la MBR contient les informations de structure de la carte (taille, nombre de secteur, etc) essentielles au programmes de formatage (c'est assez logique qu'il ne puisse plus opérer si elle manquent).
C'est faux !!!!
Une carte mémoire SD peut etre formatée, même si absolument TOUS LES OCTETS y compris ceux du MBR ont été effacés.
Pour info le MBR contient, sur une carte SD/MMC UNIQUEMENT les informations relatives aux partitions de la carte. Il adresse en réalité au maximum 4 partitions, chacune des 4 entrées de ce secteur MBR (Master Boot Record) est composée de la maniere suivante (16 octets):
(les offsets suivants sont en octet parmi les 16 d'une entrée MBR)
Offset 0: (taille = 1 octet) Etat de la partition (active = 0x80 / inactive = 0x00)
Offset 1: (taille = 1 octet) Debut de la partition HEAD (inutile sur une carte flash, pas de découpage des zones de données comme sur un disque dur)
Offset 2: (taille = 2 octets) Début de partition CYLINDER/SECTOR (idem inutile)
Offset 4: (taille = 1 octet) Type de la partition (Unknown, FAT12, FAT16 inferieur a 32Mb, Extended DOS, FAT16 sup a 32Mb ou FAT32)
Offset 5: (taille = 1 octet) Fin de partition HEAD (inutile)
Offset 6: (taille = 2 octets) Fin de partition CYLINDER/SECOTR (inutile)
Offset 8: (taille = 4 octets) Nombre de secteur entre MBR et partition correspondante (= offset de la partition sur le volume ==> ceci peut etre programmé au moment du formatage)
Offset 12: (taille = 4 octets) Nombre de secteurs de la partition ( ==> programmé au moment du formatage de la carte, selon la taille de la partition désirée)
Comme on peut le voir, dans le tableau précédent, strictement rien n'empêche de formater une carte dont le MBR a été effacé ou remplacé puisque les 2 seuls champs qui nous interressent sont aux offsets 8 et 12, et ces derniers seront renseignés au moment du formatage de la carte. Les autres champs ne sont pas utilisés sur ce genre de volume, y compris le champs indiquant le type de partition, puisque windows détermine le type de partition a partir du secteur BPB (Bios Parameter Block)
Ensuite, concernant la taille d'un secteur, il ne peut pas etre plus petit que 512 octets (dans les notes microsoft, il est meme conseillé de laisser la taille d'un secteur a 512 octets!!!!)
Après rien n'empêche en local dans ton µC de diviser encore la taille d'un secteur si tu manques de RAM, mais la carte DOIT être configurée de façon a avoir un secteur de 512 octets afin de conserver une certaine compatibilité entre ta carte et tous les outils/soft WINDOWS.
Je viens de terminer le développement d'une librairie de gestion FAT16 ET FAT32 sur µC PIC18LF2520. Et ca marche nickel, écriture, lecture, copie sur la SD depuis un µC c'est assez jouissif
04/04/2008 - 12h24
marmotte
Date d'inscription
janvier 2004
Âge
30
Messages
331
Re : pic SPI et mémoire MMC
Envoyé par asmodyne
si vous écrasez les deux copies du MBR de la carte SD, elle sera définivement condannée à rester une "eeprom" informatable... à mois de réecrire les deux MBR telles qu'elle étaient à l'origine, depuis le PIC de votre prototype.
Notez bien : plus de MBR, plus de formatage , même "bas niveau"... la MBR contient les informations de structure de la carte (taille, nombre de secteur, etc) essentielles au programmes de formatage (c'est assez logique qu'il ne puisse plus opérer si elle manquent).
La aussi vous faites erreur, une carte mémoire, et meme n'importe quel volume formaté sous Windows ne contient QU'UN SEUL ET UNIQUE SECTEUR MBR.
Sur un volume, les secteurs sont découpés comme suis:
Secteur 0: MBR (contient les informations relatives aux partitions du volume)
Secteur X: BPB 1ere partition (le X etant l'offset que l'on peut trouver dans l'entrée correspondante a la premiere partition du secteur MBR)
Secteur X+1: FAT
Secteur X+1+taille fat en secteurs: FAT copy
Secteur X+1+2*taille fat en secteurs: Root directory (32 secteurs) sur une FAT16, ou alors 1er secteur de données sur une FAT32
Puis, le même schéma pour chaque partition du volume
Je pense que vous avez confondu avec les secteurs BPB et FSI d'un volume FAT32, qui quand à eux, possedent effectivement une copie pour les utilitaires de recouvrement en cas de probleme sur les secteurs originaux.
Je suis tombé par hasard sur ce post fort interessant bien que je ne travaille pas sur les PICs.
Je suis actuellement en train d'intégrer un "driver" de cartes SD / MMC sur ma carte électronique à base de ATMEL 91SAM7S.
Le SPI n'étant pas dispo sur les PINs qu'il me reste (routage mal pensé au depart). J'ai recodé un SPI maison.
Pour aider un petit peu Legos, les étapes d'initialisation des sD / MMC que j'ai pu trouver sont :
- Reveiller la carte : PIN CS et MOSI à 1 + 80 cycles d'horloge
- Passer en mode SPI : PIN CS à 0 + envoi CMD0 et attendre la réponse 0x01
- Initialiser la carte : Envoi CMD1 et attendre la réponse 0x00
- On peut ensuite demander le status de la carte : Envoi CMD13. La réponse doit être 0x00.
Je bloque sur l'étape suivante pour récupérer le CSD de la carte. J'ai trouvé un code en C sur le net qui après avoir envoyé CMD9, attend de recevoir la réponse 0xFE. Or cela ne fonctionne pas. J'ai regardé à l'oscilloscope et ma carte MMC me répond 0x6F. Dans la documentation "Symplified Physical Layer Spec" des cartes SD il est indiqué que la carte répond 0b00111111 en entête...
savez vous si le réponse R2 des MMC et des SD sont identiques et quel est la valeur du 1er octet d'entête de cette réponse ?
en vous remerciant.
10/04/2008 - 14h03
marmotte
Date d'inscription
janvier 2004
Âge
30
Messages
331
Re : pic SPI et mémoire MMC
Avant d'aller plus loin, quel est le niveau logique sur la pin DATA OUT que tu simules dans ton code lorsque tu attends un octet en provenance de ta carte mémoire?
Tu utilises une MMC??? ca existe encore ???
10/04/2008 - 14h16
marmotte
Date d'inscription
janvier 2004
Âge
30
Messages
331
Re : pic SPI et mémoire MMC
0x6F ne correspond a rien, a aucun entete, que ce soit MMC ou SD. Lorsque tu attends une réponse de ta carte mémoire suivant une requete de ton µC, le premier octet que tu dois attendre est l'un de ceux qui suivent (ils indiquent que la commande a bien été reçue), toute autre valeur indiquant un problème de communication, cet octet se nomme le RESPONSE TOKEN:
0x00 ==> no ERROR
0xFF ==> Bad response
0x01 ==> Card is in Idle State
0x04 ==> Illegal CMD
0x20 ==> Address error
0x40 ==> Parameter error
Ensuite, si le premier octet (RESPONSE TOKEN) reçu est 0x00 (commande comprise et sans erreur), alors l'octet suivant doit être 0xFE (DATA TOKEN), suivis des 16 octets du CSD.
Avant d'aller plus loin, quel est le niveau logique sur la pin DATA OUT que tu simules dans ton code lorsque tu attends un octet en provenance de ta carte mémoire?
Tu utilises une MMC??? ca existe encore ???
10/04/2008 - 16h57
Karl2mil1
Date d'inscription
avril 2008
Messages
7
Re : pic SPI et mémoire MMC
Merci pour ta réponse Marmotte !
L'état haut est à 3v3 et l'état bas est à 0V
Tout d'abord le plus simple : Lorsque j'attend une réponse de la carte voici ce que je fais :
- Mise à l'état haut de la PIN MOSI (patte 2 sur les SD / MMC)
- Mise à l'état bas de la PIN NPCS0 (patte 1 sur les SD / MMC)
- Génération de crénaux sur la PIN SPCK (patte 5 sur les SD / MMC)
Je génère les crénaux jusqu'à ce que je lise un état bas (bit de start) sur la PIN MISO (patte 7 sur les SD / MMC)
Une fois que j'ai récupéré mon bit de start je génère 7 crénaux d'horloge et je récupère les 7 valeurs sur la PIN MISO afin de compléter mon octet.
En ce qui conserne la réponse R2 de la carte je pense que je vais comprendre quelque chose !
Ce que tu me dis confirme le code que j'ai trouvé qui boucle tant qu'il n'a pas 0xFE comme réponse. En suite il sort de la boucle et récupère le CSD...
J'ai donc un problème. Je vais aprofondir et tanter de comprendre pourquoi je ne parviens pas à récupérer 0xFE.
Et pour répondre à ta dernière question (pertinente), j'utilise une MMC car ma carte SD me répond 0x02 à la commande CMD0 qui doit être l'erreur : "Erase reset". Je me dis que les deux étant compatible, si j'arrive à utiliser une MMC, je parviendrai sûrement à utiliser la SD