Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

ecriture sd card avec 18f4550 en spi sans fat



  1. #1
    EmKa69

    ecriture sd card avec 18f4550 en spi sans fat


    ------

    Bonjour,
    j'essaie d'écrire et de lire une carte SD avec un 18f4550.
    J'ai fait l'init; je pense que c'est ok puisque la carte m'a bien renvoyé les reponses que j'attendait.
    J'en suis a l'ecriture.
    La commande passe bien.
    ensuite j'envoie 0xFE.
    puis les 512 char
    puis deux fois 0xFF
    Puis je ne reçoit jamais l'octet finissant par 5.
    En fait je reçoit FF a l'infini
    Voila mon code d'ecriture.

    void EcritureSDCARD(void)
    {
    int iii;
    cmd_ecriture_recu=0;
    reponse=0;
    if (Command(0x58,0x0,0x0,0x04,0x0 ,0xFF)==0x00)//commande ecriture CMD24
    {cmd_ecriture_recu=1;
    SPI(0xFE); //octet a transmettre avant les 512 octets de donnée
    for (iii=0;iii<512;iii++)
    {
    reponse=SPI(iii%64); // données a ecrire
    }
    while (reponse==0xff)
    {
    reponse=SPI(0xFF);}

    if (reponse&0x0F==0x05) {cmd_ecriture_recu=3;}
    if (reponse&0x0F==0x0b) {cmd_ecriture_recu=4;}

    }
    }
    qu'en pensez-vous?

    -----

  2. Publicité
  3. #2
    EmKa69

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Bon, pas de reponse?
    Voila mon code complet

    char SPI(char d) // Envoie un caractère sur le SPI
    {SSPBUF = d; // Envoie du caractère
    while (!PIR1bits.SSPIF);
    PIR1bits.SSPIF=0;
    return SSPBUF;} // Retourne le caractère reçu

    char Command(char CMD,char ARG1,char ARG2,char ARG3,char ARG4,char CRC) // Envoie une commande à la carte SD
    {SPI(0xFF);
    SPI(0xFF);
    SPI(CMD);
    SPI(ARG1);
    SPI(ARG2);
    SPI(ARG3);
    SPI(ARG4);
    SPI(CRC);
    SPI(0xFF);
    return SPI(0xFF); // Retourne le dernier caractère reçu
    }

    init du port et de la carte
    char initSDCARD(void)
    {int iii;
    reponse=0;
    mode_spi_ok=0;
    TRISCbits.TRISC7=0; // SDO declarer en sortie
    TRISBbits.TRISB1=0; //SCK est declarer en sortie sur le maitre
    SS_SDCARD=0;
    SSPSTAT = SSPSTAT & 0b00111111; // registre port spi mode 11 osc/64
    SSPCON1 = 0b00110010; //clock middle

    SS_SDCARD=1;
    for(iii=0;iii<20;iii++) {SPI(0xAA);}// initialise the MMC card into SPI mode by sending clks on
    SS_SDCARD=0;
    for(iii=0;iii<20;iii++) {SPI(0xFF);}// initialise the MMC card into SPI mode by sending clks on
    if (Command(0x40,0,0,0,0,0x95) ==1) {mode_spi_ok=1;}
    else
    {while (SPI(0xff)!=1);
    mode_spi_ok=2;}
    SPI(0xff);
    SPI(0xff);
    while (Command(0x41,0,0,0,0,0xFF) !=0);
    mode_spi_ok=3;
    }

    ecriture d'un bloc de 512 caracteres
    char EcritureSDCARD(void)
    {
    int iii;
    SS_SDCARD=0; // on prend RB4 comme SS car RA5 est utilisé en AN
    cmd_ecriture_recu=0;
    if (Command(0x58,0x0,0x0,0x02,0x0 ,0xFF)==0x00) {cmd_ecriture_recu=1;}//commande ecriture CMD24
    else {while (SPI(0xff)!=0x00);}
    cmd_ecriture_recu=2;
    //SPI(0xFF);
    //SPI(0xFF);
    SPI(0xFE);
    for (iii=0;iii<512;iii++) {SPI(0x33);} // données a ecrire
    SPI(0xff);
    SPI(0xff);
    while ((SPI(0xff)&0x0F)!=0x05);
    cmd_ecriture_recu=3;
    while(SPI(0xFF) != 0xFF); // wait until MMC is not busy anymore
    cmd_ecriture_recu=4;
    SS_SDCARD=1;
    }

    lecture d'un bloc de 512 caracteres
    char LectureSDCARD(void)
    {
    int iii;
    SS_SDCARD=0;
    cmd_lecture_recu=0;
    if (Command(0x51,0x0,0x0,0x2,0x0, 0xFF)!=0x00) {cmd_lecture_recu=1;}//commande lecture CMD17
    else {while (SPI(0xff)!=0x00);}
    cmd_lecture_recu=2;
    while(SPI(0xFF)!=0xFE);
    cmd_lecture_recu=3;
    for (iii=0;iii<512;iii++)
    {
    reponse=SPI(0xff);
    if (iii=11) {case11=reponse;}
    if (iii=23) {case23=reponse;}
    }
    cmd_lecture_recu=4;
    SPI(0xFF); // checksum
    SPI(0xFF); // checksum
    }

    L'init se deroule normalement tous les retours sont ok
    L'ecriture se deroule bien tous les retours sont ok

    Par contre la fonction de lecture est tres longues a executé (1mn) et renvoi tout les caractères à 0xFF.
    Je ne vois pas d'ou ça peut venir.
    Est-ce que j'ecrit mal? ou est-ce que je lit mal?
    Est que vous voyez quelques chose qui va pas?

  4. #3
    EmKa69

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Bon finalement ça marche

  5. #4
    Monney25

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Bonjour,
    Je suis étudiant et me suis lancé dans un projet qui nécessite l'utilisation d'une carte SD. J'utilise est 18f4455, et en utilisant différent programme, y compris le tiens, j'ai quelque problème .
    Qu'a tu fais pour que ca marche ?

    lecture d'un bloc de 512 caracteres
    char LectureSDCARD(void)
    {
    int iii;
    SS_SDCARD=0;
    cmd_lecture_recu=0;
    if (Command(0x51,0x0,0x0,0x2,0x0, 0xFF)!=0x00) {cmd_lecture_recu=1;}//commande lecture CMD17
    else {while (SPI(0xff)!=0x00);} //je reste bloqué a cette instruction !!!!!
    cmd_lecture_recu=2;
    while(SPI(0xFF)!=0xFE);
    cmd_lecture_recu=3;
    for (iii=0;iii<512;iii++)
    {
    reponse=SPI(0xff);
    if (iii=11) {case11=reponse;}
    if (iii=23) {case23=reponse;}
    }
    cmd_lecture_recu=4;
    SPI(0xFF); // checksum
    SPI(0xFF); // checksum
    }


    En même temps, j'ai pas vraiment put vérifier si l'écriture se passe bien.

  6. #5
    EmKa69

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Salut,
    J'utilise bien la meme fonction et ça marche bien.

    char LectureSDCARD(char ad3,char ad2,char ad1,char ad0)
    {
    int iii;
    char reponse;
    SPI(0xff);
    SPI(0xff);
    SD_Enable();
    SPI(0xff);
    SPI(0xff);
    cmd_lecture_recu=0;
    if (Command(0x51,ad3,ad2,ad1,ad0, 0xFF)==0x00) {cmd_lecture_recu=1;}//commande lecture CMD17
    else {while (SPI(0xff)!=0x00);}
    cmd_lecture_recu=2;
    while(SPI(0xFF)!=0xFE);
    cmd_lecture_recu=3;
    for (iii=0;iii<512;iii++)
    {bloc_sd[iii]=SPI(0xff);}
    cmd_lecture_recu=4;
    SPI(0xFF); // checksum
    SPI(0xFF); // checksum
    SD_Disable();
    }
    Meme si l'ecriture n'a pas marché tu dois lire qq chose.

    Es tu bien sure que l'init c'est bien passé?
    Tu n'utilises pas la rs232 en meme temps?

  7. A voir en vidéo sur Futura
  8. #6
    Monney25

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Merci, ça marche plutôt pas mal.

    Par contre je n'arrive pas a changé la vitesse de l'horloge SPI. Que je mette 0xA2 ou 0xA0 dans le registre SSPCON1, le bus SPI est cadencé a 620kHZ, avec une Fosc de 48MHz.

  9. Publicité
  10. #7
    EmKa69

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Salut,
    Pour l'instant.
    je n'ai pas fait le changement de cadence.
    Si tu trouves la marche à suivre je suis intéressé.
    @+

  11. #8
    Monney25

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Pour changer la fréquence d'horloge, il s'agit bien de changé les bits "SSPM3:SSPM0" du registre "SSPCON1".
    J'ai donc accéléré cette fréquence au alentour de 1.5MHz, mais au delà, 12MHz en théorie, ma carte SD ne répond plus correctement, alors que la fréquence maximale des cartes SD est annoncée à 25MHz.
    Pour mon application, cela risque d'être un peu juste mais je vais essayer de faire avec.

    a+

  12. #9
    EmKa69

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Salut,
    tu peux nous en dire plus sur ton application.

  13. #10
    jum0034

    Re : ecriture sd card avec 18f4550 en spi sans fat

    SS_SDCARD=1;
    for(iii=0;iii<20;iii++) {SPI(0xAA);}// initialise the MMC card into SPI mode by sending clks on
    SS_SDCARD=0;
    for(iii=0;iii<20;iii++) {SPI(0xFF);}// initialise the MMC card into SPI mode by sending clks on
    Salut, j'aimerai savoir pourquoi tu initialise la SD 2 fois , 1fois avec 0XAA et apres 0xFF

  14. #11
    jum0034

    Re : ecriture sd card avec 18f4550 en spi sans fat

    A quel adresse fais tu tes lectures ?, car la sd card me renvoie que des FF jusqu'au 255 eme octet et que des 00.

  15. #12
    jum0034

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Personne n'a déjà utilisé une SDCARD avec un pic

  16. Publicité
  17. #13
    mich35

    Re : ecriture sd card avec 18f4550 en spi sans fat

    Bonjour,
    Je relance le sujet (si c'est permit?).
    J'ecris aussi sur une microSD avec un microcontroleur en essayant de faire un system de fat16.
    J'arrive a "créer" des fichiers par le microcontroleur, tout me semble ok lorsque je verifie les données hexa avec le PC, windows vois les fichiers mais n'arrive pas a les ouvrir.
    Est-ce que quelqu'un a deja rencontrer ce genre de probleme?
    J'ai remarqué aussi que si je crée un fichier avec windows, il utilise le LFN (Long Fat Name) alors que j'utilise le format 8.3 pour les noms de fichiers.
    Est-ce que vous savez si windows (vista et XP) lisent toujours les formats 8.3 ?

    Note je me suis inspiré de la doc de l'université de Michigan pour une fat16 avec un MSP430.

    Merci
    Michel

Discussions similaires

  1. Ecriture fichier TXT sur SD Card en FAT32 avec un PIC.
    Par Romain2 dans le forum Électronique
    Réponses: 17
    Dernier message: 08/06/2011, 09h51
  2. 18f4550 et sd card
    Par EmKa69 dans le forum Électronique
    Réponses: 1
    Dernier message: 12/01/2009, 23h10
  3. Liaison Usb -> Spi avec un pic 18f4550
    Par chang-tout-puissant dans le forum Électronique
    Réponses: 3
    Dernier message: 28/08/2008, 22h12
  4. Réponses: 14
    Dernier message: 01/04/2008, 12h32
  5. plus de cd d'installation pc card 3154G sans fil
    Par amorgos dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 12/10/2006, 21h50
Découvrez nos comparatifs produits sur l'informatique et les technologies.