communication entre microcontrolleur et CF avec librairie
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:
1 2 3 4 5 6 7 8 9 10 11
|
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; |
Et voisi le détail le main et les fonctions de la librairie que j'utilise.
Le main():
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
/////////////////////////////::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);
} |
Les fonctions: cf_read_open
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
/*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*)§)[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*)§)[3]); /* LBA 7-0 */
Ide_set_cylinder_low (((Byte*)§)[2]); /* LBA 15-8 */
Ide_set_cylinder_high(((Byte*)§)[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;
} |
cf_read_byte ()
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
*********
* 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);
}
} |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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
FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00FA00i
Il incrémente car IDE_DRQ
DATA LU = FA00
ide_status fin CF_operations: 5100 |
Merci d'avance