begin process at 2012 05 28 21:59:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

communication entre microcontrolleur et CompactFlash avec libraire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

communication entre microcontrolleur et CompactFlash avec libraire

mercredi 7 mars 2007 à 22:01:18 | communication entre microcontrolleur et CompactFlash avec libraire

develdelphi


Bonjour,

En effet j'ai à ma disposition un circuit imprimé intégrant un microcontrolleur

AT89C51SNDC1 et qui dialogue avec une interface CompactFlash (cette carte est donc

destinée à stocker les fichiers mp3).

J'ai à ma dispostion la librairie d'Atmel (notamment le fichier snd1c-demo-ide-2_0_3)

pour le AT89C51SNDC1 et qui est très complet mais malheureusement il n'y a pas

d'exemple de code source avec une fonction main() qui demontre une lecture-ecriture

dans une CompactFlash.

Donc le problème est au niveau architecture du software et l'implementation des

fonctions cf_read_open(x,x) et cf_read_byte()
car en effet j'essaie de lire un secteur logique (à une addresse offset) de la carte

CompactFlash mais je ne parviens pas
je pense qu'il faut d'abord utiliser la fonction cf_read_open(x,x) et puis la

cf_read_byte(), dois-je ausi utiliser la fonction cf_read_sector() étant donné que dans

mon aplication je ne devrais pas transfere les fichiers mp3 sur le bus usb mais

simplement aller lire les fichiers mp3 de la carte CF vers le micro?

Avez vous un exemple de code (ou une architecture d'organigramme descriptif) afin

d'aller dans un premier temps lire sur une addresse logique de la CF et puis dans un

deuxième temps un code pour lire un fichier mp3 en mode fichier (FAT)?

En fait voila ce code vient d'une librairie et il s'agit d'une librairie qui interroge les

registres d'une CompactFlash (même fonctionnement qu'un disque dur IDE/ATA).
Je dispose d'un pcb contenant un microcontrolleur qui va aller lire dans la CF.

Definition selon la librairie:

/* IDE/ATA Definition */
/*  With LATCH
    A0        A0  P0_0
    A1        A1  P0_1
    A2        A2  P0_2
    CS0#      P5_2  P5_2   /Modifier
    CS1#      P5_3  P5_3   /Modifier

    For compact flash
    A0         A0  P0_0
    A1         A1  P0_1
    A2         A2  P0_2
    CS0#      P5_2  P5_2
    CS1#      P5_3  P5_3
                              CS1#  CS0#     A2      A1     A0
    Data                          1     0         0       0      0       0x10
    Error/features              1     0         0       0      1       0x11
    Sector count               1     0         0       1      0       0x12
    Sector No                   1     0         0       1      1       0x13
    Cyl. Low                     1     0        1        0      0       0x14
    Cyl. High                     1     0        1        0      1       0x15
    Select Card/Head         1     0         1        1     0       0x16
    Status/Command          1     0        1         1     1       0x17
    Alt stat/ dev ctrl           0     1        1        1     0       0x0E
    Drive address                0     1        1        1     1       0x0F
*/

voici la definition des adrresses des registres de la CF
[CODE]

xdata Byte volatile ide_data                  _at_ IDE_DATA_ADDRESS;     
xdata Byte volatile ide_error                _at_ IDE_ERROR_ADDRESS;       
xdata Byte volatile ide_sector_count   _at_ IDE_SECTOR_COUNT_ADDRESS;
xdata Byte volatile ide_sector_number  _at_ IDE_SECTOR_NUMBER_ADDRESS;
xdata Byte volatile ide_cylinder_low     _at_ IDE_CYLINDER_LOW_ADDRESS; 
xdata Byte volatile ide_cylinder_high    _at_ IDE_CYLINDER_HIGH_ADDRESS;
xdata Byte volatile ide_drive_head       _at_ IDE_DRIVE_HEAD_ADDRESS;   
xdata Byte volatile ide_status             _at_ IDE_STATUS_ADDRESS;       
xdata Byte volatile ide_alt_status        _at_ IDE_ALT_STATUS_ADDRESS;   



[/CODE]



Et voisi le détail le main et les fonctions de la librairie que j'utilise.

Le main():

[CODE]
/////////////////////////////::test
unsigned char testrd[512];  //testali220207
unsigned char tstok[512];     ///testali030307 //testali070307 mettre 512 sinon Warning L2
int rd;                     //testali220207
int rrd;                     //testali220207
//long int tstok=18;            ///testali030307
//long int tstok[];            ///testali030307
//unsigned char tstok[];     ///testali030307

unsigned char varilec;  //testali280207
unsigned char variaff;  //testali280207

/******************************************************************

****************
Function: CF_operations
Remarque: Cette fonction réprend ce qui est utile pour lire et écrire dans le CF
******************************************************************

*****************/



void CF_operations2 (void)  //testali050307

{

      if (cf_read_open (0,1))   //testali070307
        {
        printf ("\ncf_read_open is done\n");
     printf ("ide_status avant cf_read_byte() CF_operations:
                                        %X\n\r",ide_status); //test
        printf ("\n now call to cf_read_byte() and diplay of data\n");
        getchar();


       printf ("\n valeur de gl_ptr_mem avanr read byte (0): \n",gl_ptr_mem);   
       getchar();  
         for(rd=0;rd<512;rd++)
        {
        testrd[rd]=cf_read_byte();         
            }
        for(rrd = 0; rrd < 512; rrd++)
        {
     
        tstok[rrd]=testrd[rrd];  
          
        printf("%X",tstok[rrd]); 
        }
       
        data_lu = cf_read_byte();            //APPEL
        printf("\nDATA LU = %X\n",data_lu);  //re
        getchar();
        }
        else {printf ("\ncf_read_open is not done\n");}
       printf("ide_status fin CF_operations: %X\n\r",ide_status);

}


[/CODE]


Les fonctions: cf_read_open

[CODE]

/*F****************************************************************

**********
* NAME: cf_read_open
*----------------------------------------------------------------------------
* PARAMS:
*   sect: address of the logic sector to read (size 512 bytes)
*   size : number of sector
*   global: gl_ptr_mem
*
* return:
*   open status:  OK: open done
*                 KO: open not done
*----------------------------------------------------------------------------
* PURPOSE:
*   Open memory card in read mode (read block)
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   CF card are driven in LBA mode (not in CHS mode)
*   drive/head register     -> LBA 27-24
*   cylinder high register  -> LBA 23-16
*   cylinder low register   -> LBA 15-8
*   sector number register  -> LBA 7-0
*----------------------------------------------------------------------------
* REQUIREMENTS:
******************************************************************

*/

bit cf_read_open (Uint32 sect, Byte nb_sector)
{

 ide_status1 = ide_status;

  while (ide_status & IDE_BSY)
  {
    printf ("ide_status est occupé\n");  //testali260207    //testali280207 a ameliorer si

boucle continue
    if ( (Card_detect() == KO) )
    {
      gl_mem_failure = TRUE;
      lecture_cond = KO;
      return KO;
    }
  }

  /* Write device/head register */
  ide_alt_status;
  Ide_set_drive_head(ATA_LBA_MODE + (((Byte*)&sect)[0] & 0x0F));  /* LBA 27-24

*/
 
  BSY = 0;
  while ( Ide_notbsy_drdy() == KO)          /* Wait for BSY = 0  and DRDY = 1 */
  {
   
    if ((Card_detect() == KO) )
    {
      gl_mem_failure = TRUE;
      lecture_cond = KO;
      return KO;
    }
     printf ("ide_status value = %X\n", ide_status);
     printf ("ide_notsy_bsy \n");  //testali260207       probleme dans cette boucle infinie
     printf ("IDE_STATUS_ADDRESS = %X \n",IDE_STATUS_ADDRESS);
    if (BSY >=60)                //
    { //;                              //
   ide_status = IDE_DRDY; //testali260207         //         

    }                               //
    BSY++;                          //
  }
  printf ("ide_status dasn cf_read_open() CF_operations avant set:

%X\n\r",ide_status);  ///testali050307
  while (Ide_notbsy_notdrq() == KO);         /* Wait for BSY = 0  and DRQ = 0 */ //Le

boucle fonctionne en envers
  Ide_set_sector_count ( nb_sector );        /* sending parameters  */
  Ide_set_sector_number(((Byte*)&sect)[3]);  /* LBA 7-0    */
  Ide_set_cylinder_low (((Byte*)&sect)[2]);  /* LBA 15-8   */
  Ide_set_cylinder_high(((Byte*)&sect)[1]);  /* LBA 23-16  */
  Ide_send_command(ATA_CMD_READ_SECTOR);     /* send command */
  gl_ptr_mem = sect;                         /* Initialize the global byte counter */
  printf ("ide_status dasn cf_read_open() CF_operations apres set:

%X\n\r",ide_status);   ///testali050307

  while (ide_alt_status & IDE_BSY); //Fonctionnement à l'envers c à d sortie du boucle

lorsque la condition = 0

    if (ide_status & IDE_ERR)
  {

    lecture_cond = KO;
    return KO;
  }
 
  ide_alt_status;
  ide_status = IDE_DRQ;  //testali260207
%X\n\r",ide_status);  ///testali050307 si pqs cette ligne OK
  if (!(ide_status & IDE_DRQ))
    {
    lecture_cond = KO;
    return KO;
    }
    lecture_cond = OK;

  printf("ide_status fin cf_read_open de C_Flash: %X\n\r",ide_status); //testali280207
getchar();

  return OK; 

}


[/CODE]


cf_read_byte ()

[CODE]
*********
* NAME: cf_read_byte
*---------------------------------------------------------------------------
* PARAMS:
*   global: gl_ptr_mem
*
* return:
*   Data read from memory
*   gl_mem_failure set to TRUE if command failure (card removed)
*----------------------------------------------------------------------------
* PURPOSE:
*   Card byte read function
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*  
*----------------------------------------------------------------------------
* REQUIREMENTS:
******************************************************************

**********/

#define ide_read_8_databyte()                 ide_data


Byte cf_read_byte(void)
{

  printf("ide_status debut cf_read_byte de C_Flash: %X\n\r",ide_status);


 if ((Card_detect() == KO) )
  {
    gl_mem_failure = TRUE;
    return 0xFF;
  } 

  while (Ide_notbsy() == KO)                  /* Wait for bsy = 0 */
  {
    printf ("le registre est busy \n");
    if ((Card_detect() == KO) )
    {
      gl_mem_failure = TRUE;
      return 0xFF;
    } 
  }
  ide_status = 0x08;   //test  //test

 if (!(ide_status & IDE_DRQ))
  {
    //gl_ptr_mem++;
    printf ("Il incrémente car IDE_DRQ\n"); //testali070307
   // cf_read_open(gl_ptr_mem, 1);              /* open the next sector */
    //\ printf ("Lecture OK\n"); //testali0103
  }

  return  ide_read_8_databyte();

   printf("ide_status fin cf_read_byte de C_Flash: %X\n\r",ide_status); //test
   getchar();
}

 // /*   //test
void cf_read_byte1(void)
{
 if (cf_read_byte() == ide_data)
    {
     ide_data1 = ide_data;
     printf("\nide_data = %X\n",ide_data1);
    }
}


[/CODE]

Je n'arrive donc pas a avoir les resultats attendus je voudrais voir ce qui se trouve dans

le premier secteur de la CF qui est le boot secteur( et qui est semblable pour tous les

disques durs) mais je ne parviens à lire qu'un seul et mêm byte pour les 512 affichages

de l 'hyperterminal comme vous pouvez le voir:

Resultats capture:

[CODE]

Il incrémente car IDE_DRQ
ide_status debut cf_read_byte de C_Flash: 5100

Il incrémente car IDE_DRQ
ide_status debut cf_read_byte de C_Flash: 5100

Il incrémente car IDE_DRQ
ide_status debut cf_read_byte de C_Flash: 5100

Il incrémente car IDE_DRQ

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00

FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00i

Il incrémente car IDE_DRQ

DATA LU = FA00
 ide_status fin CF_operations: 5100


[/CODE]


Merci d'avance





Cette discussion est classée dans : ide, cf, status, read, fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00fa00


Répondre à ce message

Sujets en rapport avec ce message

turboc++ icones .exe??? [ par idk ] Comment faire pour plus avoir cette icone horrible, (carré blanc avec du bleu en haut!)Dans le makefile faut faire quoi!voici le makefile d'un program Vc++ Compil AAAAAAA [ par erasor ] Voila Je Travaille sur un lecteur de mp3 pour un jeu et voila les erreurs que Visual C++ me sort et ke je n'arrive pas a resourdre:client.obj : error I need help, please read this :( [ par bsmoh ] je suis pas arrive a trouver un code delphi ou C qui permet de creer une application qui permet de parcourir le PC et en extraire ts les fichiers (.ex I need help, please read this :( [ par bsmoh ] je suis pas arrive a trouver un code delphi ou C qui permet de creer une application qui permet de parcourir le PC et en extraire ts les fichiers (.ex Edit Read Only [ par TheRod23 ] Salut,je voudrais savoir comment on fait pour changer la couleur de fond d'une CEdit quand elle est en Read Only ne plus avoir se gris affreux Merci d Status Process d une application windows [ par Trinita16 ] est il possible de savoir le status d une application qui tourne en tache de fond sous windows ? je m explique, je voudrais savoir si mon application erreur "ne peut etre un read" [ par Sade ] Salut a tous le monde.Dans le programme que j'ai develoP, j'utilise le FileMapping pour pouvoir echange des données entre deux programme distinct fonc IDE C/C++ [ par Bricomix ] Salut, je suis un nouveau dans le C/C++. (J'en fait depuis 2 jours)Je voudrais savoir 2 trucs (ça paut paraitre bête) : - que choisir : VC++ ou Borlan Avis des PROS! [ par UnExPeCtEdSpy ] Bonjour,je suis plus familier du vb que du c++ alors j'vous d'mande de l'aide :J'utilise une Dll en c+ avec un prog en Vb qui manipule des fichiers.Qu CEdit de couleur en read only [ par gourouman ] J'arrive à changer la couleur d'un CEdit, mais lorsque j'active le mode read only il reprend la couleur par défaut, et la couleur du texte aussi chang


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,296 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales