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

lire/écrire 1 secteur dans une carte SD



  1. #1
    fofo2007

    lire/écrire 1 secteur dans une carte SD


    ------

    Bonjour à tous,

    dans le cadre de mon projet de fin d'année, je dois etre capable de gérer une carte SD (lire, ecrire, etc)... Tout est ok appart la lecture et l'écriture d'un secteur dans la carte... J'utilise le compilateur CCS. J'ai pu récupérer la lecture et l'écriture d'un secteur d' une compact flash :

    [I]// ATA DRIVE REGISTER ADDRESSES

    xdata byte data_reg _at_ 0x8000;
    xdata byte feature_reg _at_ 0x8001;
    xdata byte err_reg _at_ 0x8001;
    xdata byte sec_cnt_reg _at_ 0x8002;
    xdata byte sec_num_reg _at_ 0x8003;
    xdata byte cyl_low_reg _at_ 0x8004;
    xdata byte cyl_high_reg _at_ 0x8005;
    xdata byte drv_hd_reg _at_ 0x8006;
    xdata byte command_reg _at_ 0x8007;
    xdata byte status_reg _at_ 0x8007;


    /****************************** ****************************** **************
    ****************************** ****************************** ***************
    Lecture de 512 octets (1 secteur) sur carte CompactFlash.
    ---------------------------------------------------------------------------
    ----------------------------------
    Return : /
    IN : LBA
    OUT : buf_cf[512]
    ****************************** ****************************** ***************/

    void read_sector(UI32 LBA)
    {
    UI16 i;
    reset_watchdog();
    led=0;
    wait_ready();
    sec_cnt_reg=0x01; // Nombre de secteur.
    sec_num_reg=(byte)(LBA) ; // Numéro du secteur, LBA 7-0
    cyl_low_reg=(byte)(LBA >> 8); // Numéro du cylindre (LSB),LBA 15-8
    cyl_high_reg=(byte)(LBA >> 16); // Numéro du cylindre (MSB),LBA 23-16
    drv_hd_reg=0x0E0; // drv_hd, LBA 27-24 Set LBA bit
    command_reg=0x20; // Commande

    wait_drq();
    for (i=0; i<512;i++)
    {
    // delms(1);
    buf_cf[i]=data_reg;
    }
    led=1;
    //printf("%u",i);
    }
    UI16 make16(UI8 hi, UI8 low)
    {
    UI16 val;
    val=(hi*0x100) + low;
    return(val);
    }
    UI32 make32(UI8 val1, UI8 val2, UI8 val3, UI8 val4)
    {
    UI32 val;
    val=(val1*0x1000000) +(val2*0x10000) +(val3*0x100) + val4;
    return(val);
    }
    // Lecture des caractéristique de la CF 10/2008
    void read_id()
    {
    UI16 i;
    reset_watchdog();
    led=0;
    wait_ready();
    sec_cnt_reg=0x01; // Nombre de secteur.
    sec_num_reg=(0) ; // Numéro du secteur, LBA 7-0
    cyl_low_reg=(0); // Numéro du cylindre (LSB),LBA 15-8
    cyl_high_reg=(0); // Numéro du cylindre (MSB),LBA 23-16
    drv_hd_reg=0x0E0; // drv_hd, LBA 27-24 Set LBA bit
    command_reg=0xEC; // Commande

    wait_drq();
    for (i=0; i<512;i++)
    {
    // delms(1);
    buf_cf[i]=data_reg;
    }
    led=1;

    printf("\r\nDefaullt nb of cylindre %u",make16(buf_cf[3],buf_cf[2]));
    printf("\r\nCurrent capacity in sectors %lu",make32(buf_cf[117],buf_cf[116],buf_cf[115],buf_cf[114]));
    }
    /****************************** ****************************** **************
    ****************************** ****************************** ***************
    Ecriture de 512 octets (1 secteur) sur carte CompactFlash.
    ---------------------------------------------------------------------------
    Return : /
    IN : LBA, buf_cf[512]
    OUT : /
    ****************************** ****************************** ***************/

    void write_sector(UI32 LBA)
    {
    UI16 i;
    reset_watchdog();
    led=0;
    wait_ready();
    sec_cnt_reg=0x01; // Nombre de secteur.
    sec_num_reg=(byte)(LBA) ; // Numéro du secteur, LBA 7-0
    cyl_low_reg=(byte)(LBA >> 8); // Numéro du cylindre (LSB),LBA 15-8
    cyl_high_reg=(byte)(LBA >> 16); // Numéro du cylindre (MSB),LBA 23-16
    drv_hd_reg=0x0E0; // drv_hd, LBA 27-24 Set LBA bit
    command_reg=0x30; // Commande

    wait_drq();
    for (i=0; i<512; i++)
    data_reg=buf_cf;
    led=1;

    }


    Mon maitre de stage a dit qu'il fallait le modifier et que ca fonctionnerais... Quelqu'un pourrait m'aider svp ? j'ai lu le datasheet mais je ne comprend pas trop ce qu'il faut faire pour mon problemme ... Evidemment si quelqu'un a un source pour lire/ecrire un secteur ca serait aussi le bienvenue ^^. Merci d'avance.

    -----

  2. 📣 Nouveau projet éditorial de Futura
    🔥🧠 Le Mag Futura est lancé, découvrez notre 1er magazine papier

    Une belle revue de plus de 200 pages et 4 dossiers scientifiques pour tout comprendre à la science qui fera le futur. Nous avons besoin de vous 🙏 pour nous aider à le lancer...

    👉 Je découvre le projet

    Quatre questions à explorer en 2022 :
    → Quels mystères nous cache encore la Lune 🌙 ?
    → Pourra-t-on bientôt tout guérir grâce aux gènes 👩‍⚕️?
    → Comment nourrir le monde sans le détruire 🌍 ?
    → L’intelligence artificielle peut-elle devenir vraiment intelligente 🤖 ?

Discussions similaires

  1. Lire ou écrire sur une carte MMC/SD avec un pic
    Par GwadaBoug dans le forum Électronique
    Réponses: 14
    Dernier message: 22/03/2012, 22h39
  2. lire un fichier audio stocké dans une carte SD avec un pic
    Par Sebastien1010 dans le forum Électronique
    Réponses: 0
    Dernier message: 28/11/2008, 11h59
  3. Réponses: 0
    Dernier message: 21/11/2008, 07h20
  4. Lire & écrire dans un EEPROM 24CL64
    Par mti9er dans le forum Électronique
    Réponses: 2
    Dernier message: 12/05/2007, 20h46
  5. lire et ecrire dans une eeprom externe par un pic en C
    Par spilz dans le forum Électronique
    Réponses: 47
    Dernier message: 26/08/2006, 23h52
Découvrez nos comparatifs produits sur l'informatique et les technologies.