Ecriture sur une carte SD avec un microcontrôleur PIC24J
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Ecriture sur une carte SD avec un microcontrôleur PIC24J



  1. #1
    Evoxz

    Ecriture sur une carte SD avec un microcontrôleur PIC24J


    ------

    Bonjour,

    Je suis un jeune étudiant de secondaire qui réalise un premier projet électronique... (Je maîtrise les langage C et C++, pour ceux qui auraient des exemples dans ce dernier langage). En fait, nous avons une carte électronique avec un microcontroleur Microchip PIC24J*****, ainsi qu'un capteur photo, capteur de pression, magnétomètre,..., et nous aimerions enregistrer nos données sur une carte SD (le montage s'envolera à 1km de haut et redescendra en parachute, nous prenons des mesurs durant la descente) durant le vol. Pour ce faire, nous avons formaté une carte µSD, écrit dessus un fichier vide de 2GO rempli de 0xFF afin de mettre tous les bits à 1, et nous voudrions écrire dans ce fichier les données recueillies, de façon a ne pas devoir gérer la table d'allocation. Seulement, en lisant les Datasheets Transcend sur les SD, je n'ai RIEN trouvé qui permettait de savoir comment écrire telle donnée à telle addresse.
    J'ai également cherché sur internet, mais les liens qui le disaient menaient tous sur des pages Microchip vides...

    Quelqu'un aurait-il des bouts de code à me proposer?

    Un grand merci d'avance!

    -----

  2. #2
    RISC

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Salut,
    quelle carte électronique utilises-tu ? La carte EXPLORER16 ?
    La référence précise du PIC est PIC24FJ128GA010 ?
    La gestion d'une carte SD n'est pas si simple que cela...car il faut un File System (généralement FAT, FAT12/FAT16).
    Si tu utilises la carte EXPLORER16 avec la carte d'extension SD card Pictail Plus, tu trouveras des exemples de code dans les librairies MLA : http://www.microchip.com/MLA
    Je recommande d'utiliser la version juin 2013 des MLA qui est aussi appelée "Legacy" car c'est la plus riche en exemples.
    Tu peux aussi utiliser des librairies Open Source comme FatFS
    a+

  3. #3
    Evoxz

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    En fait, nous n'utilisons pas une carte préconçue, nous avons dessiné notre carte nous-même... Nous avons juste (pour le module SD) un connecteur SD relié en direct à des pins RP positionnées sur SPI3
    La référence exacte est PIC24FJ64GB106
    La carte SD est actuellement formattée en FAT32 en utilisant les utilitaires Windows.
    Dernière modification par Evoxz ; 19/04/2015 à 13h09.

  4. #4
    paulfjujo

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    bonjour


    voir lien google avec "Petite FAT"
    testée ICI avec un PIC18F carte SD 2go FAT32 sector 512bytes formatée sous windows..

    En cours d'evalutaion sur une autre appli
    stocke de trame de 128 octets dans un fichier texte ,toutes les minutes.

  5. A voir en vidéo sur Futura
  6. #5
    Evoxz

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Bonjour,
    Dans l'exemple, PetitFat est utilisé avec l'UART non? Auriez-vous un exemple d'utilisation avec le SPI?

    Merci

  7. #6
    adipie

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Bonjour,
    J'ai réalisé un Data Logger qui stocke toute les 2 s. 8 températures et l'état de 8 entrées Tor sur un fichier TXT d'une carte SD de 2Mo avec un PIC18F2420
    J'utilise un lecteur SD-COM (Lextronique) en liaison série avec le PIC

  8. #7
    Evoxz

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Bonjour,

    Utilisez vous le SPI? Si oui, pensez vous que nos situations soient équivalentes même si je n'utilise qu'un connecteur µSD et pas une carte préfabriquée?
    Pourriez-vous me donner votre code source?

    Merci,

    Evoxz

  9. #8
    adipie

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    J'utilise SPI pour la RTC et l'UART1 pour le lecteur de carte SD

    Mon code en Mikrobasic:
    Code:
    'Init carte SD__________________________________________________________________
    Sub procedure InitCarte()
      Dt ="init"
      strAppendSuf(Dt,13)
      strAppendSuf(Dt,10)
      UART1_Write_Text(Dt)
      delay_ms(200)
      end sub
    'Prepare carte SD et crée fichier_______________________________________________
    Sub procedure PrepareFichier()
    if P0 = 0 then
          Lcd_Cmd(_LCD_CLEAR)
           Lcd_Out(1,1,"Creation nouveau")
           Lcd_Out(2,1,"    Fichier     ")
           Delay_ms(4000)
          Ds= "Del f1.txt "
           strAppendSuf(Ds,13)
           strAppendSuf(Ds,10)
           UART1_Write_Text(Ds)
           delay_ms(200)
          'Création fichier
           Dt="fcreate f1.txt"          'Nom du fichier f1.txt
           strAppendSuf(Dt,13)
           strAppendSuf(Dt,10)
           UART1_Write_Text(Dt)
           delay_ms(1000)
           Lcd_Cmd(_LCD_CLEAR)
           P0 = 1
        end if
        Lcd_Cmd(_LCD_CLEAR)            'Clear Lcd display
       Lcd_Out(1,1,"Nouv. fichier OK ")
       Delay_ms(2000)
       Lcd_Cmd(_LCD_CLEAR)
    end sub
    'Ecriture sur carte SD__________________________________________________________
    Sub procedure EcritureCarte()
      Af1 = ""
        Af1 ="fputs f1.txt /a "
        Strcat(Af1, TimeStamp)   'Date heure
        strAppendSuf(Af1,44)
        strcat(af1,Tt1)               'Sonde1 Ballon bas
        strAppendSuf(Af1,44)
        strcat(af1,Tt2)               'Sonde2 Circulateur ballon
        strAppendSuf(Af1,44)
        strcat(af1,Tt3)               'Sonde3 Ballon haut
        strAppendSuf(Af1,44)'
        strcat(af1,Tt4)               'Sonde4 Circulateur Ecs
        strAppendSuf(Af1,44)
        strcat(af1,Tt5)               'Sonde5 Arrivé d'eau
        strAppendSuf(Af1,44)
        strcat(af1,Tt6)               'Sonde6 Rejet d'eau
        strAppendSuf(Af1,44)
        strcat(af1,Tt7)               'Sonde7 Ecs
        strAppendSuf(Af1,44)
        strcat(af1,Tt8)               'Sonde8 Reserve
        strAppendSuf(Af1,44)
        strcat(af1,AfTor)             'TOR
        strAppendSuf(Af1,44)
        strcat(af1,CptRc0Txt)         'Compteur d'energie
        strAppendSuf(Af1,13)
        strAppendSuf(Af1,10)
        delay_ms(150)
        Uart1_Write_Text(Af1)         'Usart envoi la trame
        delay_ms(150)
        'Fermeture fichier
        Ds="fclose"
        strAppendSuf(Ds,13)
        strAppendSuf(Ds,10)
        UART1_Write_Text(Ds)
        delay_ms(150)
    end sub

  10. #9
    adipie

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Citation Envoyé par Evoxz Voir le message
    Utilisez vous le SPI? Si oui, pensez vous que nos situations soient équivalentes même si je n'utilise qu'un connecteur µSD et pas une carte préfabriquée?
    Evoxz
    C'est quoi un connecteur µSD ?

  11. #10
    adipie

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Voici ce que j'utilise: http://www.lextronic.fr/P1557-module...el-sd-com.html
    http://www.comfiletech.com/content/c...UserManual.pdf
    Branchement:
    +5V, GND, TX du PIC et RX du PIC

  12. #11
    Evoxz

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    En disant un connecteur, je voulais dire un "truc" dans lequel on insère la carte µSD, avec les 9 Pins (Vdd, SPI_CLK,SDO, SDI,..)

  13. #12
    paulfjujo

    Re : Ecriture sur une carte SD avec un microcontrôleur PIC24J

    Citation Envoyé par Evoxz Voir le message
    Bonjour,
    Dans l'exemple, PetitFat est utilisé avec l'UART non? Auriez-vous un exemple d'utilisation avec le SPI?

    Merci
    L'exemple pointé par le lien "ici" (post #4) utilise le SPI !
    l'uart ne sert qu'à visualiser le contenu des fichiers..

  14. #13
    Evoxz

    Problème CMD24 carte SD (Single block write) avec un PIC24

    Bonjour,
    Je programme actuellement une carte SD formatée en FAT32 (mais je n'utilise pas le système de fichier), j'ai réussi a l'initialiser,... J'ai envoyé la commande CMD16 avec comme paramètres 512 pour setBlockSize to 512 bytes.
    MAIS, lorsque je tente l'écriture, j'envoie CMD24, qui me répond correctement, j'envoie un byte vide comme je l'ai vu sur un schéma, ensuite j'envoie le token 0b11111110 pour CMD24, 512 bytes et enfin 2* 0xFF pour les bytes de CRC ignorés. Mais je ne reçois jamais la réponse data, et MISO ne descend jamais LOW, alors qu'il devrait l'être pour montrer que la carte est occupée.
    Voici mon code (Dégueulasse je l'admets, les Nop() sont des instructions de débogages elles ne servent pas vraiment à qqch). Je travaille avec un PIC24F, Enhanced Buffer mode (Buffers 8 niveaux SPI), SPI à 16MHz, comme la clock interne

    Code:
    void SDWrite (UINT32_VAL address, unsigned char* toSend, int nbToSend) {
    	//Check if the card is busy
    	unsigned char rep;
    	SD_En = 0;
    	if (nbToSend <= 512) {
    		SPI2BUF = 0b01011000; //CMD 24
    		SPI2BUF = address.byte.MB; //Bits 31-24
    		SPI2BUF = address.byte.UB; //Bits 23-16
    		SPI2BUF = address.byte.HB; //Bits 15-8
    		SPI2BUF = address.byte.LB; //Bits 7-0
    		SPI2BUF = 0xFF; //CRC+StopBit
    		Nop();Nop();Nop();
    		while(!SPI2STATbits.SRMPT); //Attendre que le Shift register soit vide
    		int n;
    		unsigned char tmpToRead;
    		while (!SPI2STATbits.SRXMPT) { //Attendre que le FIFO de lecture soit vide
    			tmpToRead = SPI2BUF;
    		
    		//While jusque la réponse et la checker
    		 do {
         		 SPI2BUF = 0xFF;
         		 while(!SPI2STATbits.SRMPT);
         		 rep = SPI2BUF; 
     		} while (rep != 0);
    		
    
    		SPI2BUF = 0xFF; //Byte vide avant l'envoi des datas
    		SPI2BUF = 0b11111110; //Data Token
    		while(!SPI2STATbits.SRMPT);
    		tmpToRead = SPI2BUF;
    		tmpToRead = SPI2BUF;
    		int i;
    		for (i = 0; i < nbToSend; i++) {
    			if (i+1%8 == 0) {
    				while(!SPI2STATbits.SRMPT);
    				for (n = 0; n < 8; n++) {
    					tmpToRead = SPI2BUF;
    				}
    			}
    			SPI2BUF = toSend[i];
    		}
    		__delay_ms (1);
    		Nop();Nop();Nop();
    		while(!SPI2STATbits.SRMPT);
    		for (n = 0; n < 8; n++) {
    			tmpToRead = SPI2BUF;
    		}
    		int k = 512-nbToSend, j;
    		for (j = 0; j < k; j++) {
    			if (i+1%8 == 0) {
    				while(!SPI2STATbits.SRMPT);
    				for (n = 0; n < 8; n++) {
    					tmpToRead = SPI2BUF;
    				}
    			} 
    			SPI2BUF = 0xFF; //Bytes vides
    		}
    		while(!SPI2STATbits.SRMPT);
    		for (n = 0; n < 8; n++) {
    			tmpToRead = SPI2BUF;
    		}
    
    		SPI2BUF = 0xFF;
    		SPI2BUF = 0xFF; //2 Bytes de CRC
    		SPI2BUF = 0xFF; //Byte pour avoir la réponse
    		while(!SPI2STATbits.SRMPT);
    		tmpToRead = SPI2BUF;
    		if (tmpToRead != 0);
    		Nop(); Nop();Nop();
    		tmpToRead = SPI2BUF;
    		Nop(); Nop();Nop();
    		rep = SPI2BUF; //Check the response
    		
    		while (rep == 0xFF){ /*** PROLEME ICI , rep ne vaut jamais autre chose que 0xFF***/////////////////////////////////////////////////
         		 SPI2BUF = 0xFF;
         		 while(!SPI2STATbits.SRMPT);
         		 rep = SPI2BUF; 
       		} 	
    
    		if (!((rep|0b11110001)== 0b11110101)) //ERROR
    			while (1) {
    				LED_V = !LED_V;
    				LED_J = !LED_V;
    				__delay_ms (50);
    			}
    		
    		SPI2BUF = 0xFF; //Clock pulses to begin the writing;
    		while(!SPI2STATbits.SRMPT);
    		tmpToRead = SPI2BUF;
    		
    		do  { //Attendre tant que la carte est "Busy"
    			SPI2BUF = 0xFF;
    			while(!SPI2STATbits.SRMPT);
    			rep = SPI2BUF;
    		} while (rep == 0x00);
    	Nop (); Nop(); Nop();
    	}
    	
    	SD_En = 1;
    }
    Merci d'avance!

Discussions similaires

  1. probleme ecriture carte sd
    Par guillaume83 dans le forum Électronique
    Réponses: 0
    Dernier message: 28/09/2014, 15h46
  2. Choix d'un microcontroleur / carte à microcontroleur
    Par bisou10 dans le forum Électronique
    Réponses: 29
    Dernier message: 25/10/2013, 15h33
  3. Problème ecriture/lecture carte SD
    Par invite14627f30 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 18/04/2011, 22h22
  4. Ecriture carte SD
    Par heldorhn dans le forum Électronique
    Réponses: 0
    Dernier message: 07/04/2011, 13h33
  5. Protocole de lecture/ecriture Carte MMC...
    Par synapsium dans le forum Électronique
    Réponses: 3
    Dernier message: 04/11/2008, 20h18
Découvrez nos comparatifs produits sur l'informatique et les technologies.