develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009
-
10 mars 2007 à 19:43
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009
-
13 mars 2007 à 22:27
Bonjour,
Voila j'ai un programme qui gere une communication avec un microcontrolleur de la famille
Atmel AT89C51SNDC1 ( a base de lecteur mp3) et une carte CompactFlash, ces deux elements sont presents dans mon PCB qui est un systeme qui gere des signaux audio en provenances de micro et switch ses signaux audio en sortie en fonction des priorites.
Le systeme communique avec la CF en bus de 16 bits physique mais j'ai du configurer mon microcontrolleur de maniere a ce qu'il travaille en 8 bits de donnees car la librairie que j'utilise et fait pour le 8 bits et la CF est en mode True Ide Mode.
Mon probleme est le suivant, je lis bien du debut du secteur d'une adresse de la carteCompactFlash mais je ne lis que 1 byte sur 2, c'est comme ci les données étaient tronquées.
Car l'affichage du contenu de l'adresse (ici 6300) secteur physique de ma CF par Winhex
me donne se resultat:
Voici mon code de test de communication avec la CF:
void CF_operations2 (void) //testali050307
{
// cf_read_open (0,1);
printf ("ide_status avant cf_read_open() CF_operations: %X\n\r",ide_status);
if (cf_read_open (6300,1))
{
printf ("\ncf_read_open is done\n");
printf ("ide_status avant cf_read_byte() CF_operations: %X\n\r",ide_status);
printf ("\n now call to cf_read_byte() and diplay of data\n");
getchar();
//for(rrd = 0; rrd < 200; rrd++); //delay
data_lu = cf_read_byte(); //APPEL APRES BOUCLE
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); //test</wbr>
}
Pour la communication avec la CF j'ai utulise la librairie d'Atmel que j'ai implemente dans le programme, je sais pas si je l'ai bien implementer mais, comme vous l'avez vu ci-dessus, je communique réellement avec la CF car j'ai pu lire à une adresse secteur de la CF.
Je pense que l'erreur provient du fait de l'insertion de 2 carateres aleatoires a la suite de la valeur affichee par exemple lorsque je faits un printf en hexadecimal (%X) pour voir l'etat du registre de la carte CF on voit la presence de deux valeurs hexadecimals aleatoires derriere les valeurs reellement lues, comme vous avez pu constater dans la capture de mon programme ci-dessus (ici c'est "00"):
A quoi est-ce du la presence de ces deux caracteres hexadecimal est-ce un probleme de formatage de donnees lie a ma programmation en C ou est-ce que c'est un probleme lie a la communication entre le micro et la carte CF qui ferait apparaitre des signaux aleatoires, bits de parite, bits stop ou autres?
Ou bien le probleme vient de la CompactFlash de sa configuration est-elle reelement en True Ide Mode ?
Merci de m'aider.
A voir également:
Communication entre microcontrolleur et carte CompactFlash lecture erronee?
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009 13 mars 2007 à 22:27
Oui, mais en fait j'y suis arrive en passant le unsigned char a un int puis j'affichais avec le printf le
int et la il n'y a plus les deux caracteres parasites qui apparaissaient pour les chars.
Il s'agissait sans doute d'un probleme lie au printf ou au compilateur mais bref le probleme d'origine n'est toujours pas resoud. Malgres cette modif, la lecture des 512 bytes d'une adresse d'un secteur de la CF ne faite apparaitre que un byte sur deux. C'est comme ci la lecture se fesait en 16 bits?
La librairie que j'utilise est en 8 bits mais au niveau hardware je suis en 16 bits mais bien sur mon microcontrolleur Atmel (AT89C51SNDC1) me permet de passer en mode 8 bits par configuration du registre AUXR.
Du cote de la carte CF, j'envoi une commande pour etre aussi en 8 bits :
Ide_set_feature(IDE_ENABLE_8_BIT_TRANSFERT);
Ide_send_command(ATA_CMD_SET_FEATURES); /* Set Features */
Je pense plutot qu'il s'agit d'un probleme de software mais sinon ce serait du cote de la CompactFlash, le True Ide Mode qui ne s'active pas?
gl_ptr_mem =
sect;
/* Initialize the global byte counter */
printf ("ide_status dasn cf_read_open() apres set C_Flash.c: %X\n\r",ide_status); ///test
getchar();
// printf("***\n");
while (ide_alt_status & IDE_BSY); //Fonctionnement à l'envers c à d sortie du boucle lorsque la condition = 0
// printf("****\n");
if (ide_status & IDE_ERR)
{
printf ("ide_status dans cf_read_open() dans if IDE
ERROR C_Flash.c: %X\n\r",ide_status);
//testali0308
getchar();
// printf("*****f\n");
lecture_cond = KO;
return KO;
}
printf ("ide_status dans cf_read_open() av idealtstatus et avant
forcage drq C_Flash.c: %X\n\r",ide_status); //test
getchar();
ide_alt_status;
// ide_status = IDE_DRQ; //testali260207 //test
printf ("ide_status dans cf_read_open() ap idealtstatus et ap
forcage drq C_Flash.c: %X\n\r",ide_status); //test
getchar();
// printf ("ide_status dasn cf_read_open() CF_operations apres
DRQ: %X\n\r",ide_status); ///test 7 si pqs cette ligne OK
if (!(ide_status & IDE_DRQ))
{
printf ("ide_status dans cf_read_open() dans
if pas drq C_Flash.c: %X\n\r",ide_status); //test
getchar();
lecture_cond = KO;
return KO;
}
lecture_cond = OK;
printf("ide_status fin cf_read_open de C_Flash: %X\n\r",ide_status); //test
getchar();
return OK;
}
Voila en detail les 2 fonctions concernées.
En revenant au probleme de l'affichage erronée pour moi c'est due au
fait que le printf en "%X" affiche en plus des deux caractères
hexadecimaux du byte deux caratctères supplementaires '00' alors peut
être l'accu se charge et saute la lecture du byte suivant?
Exemple:
Au niveau de mon code, l'affichage des registres en %X, oon voit la presence
de 2 caracteres aleatoires ici '03':
Resultats:
ide_status avent read_8_data: 5803
ide_status pendant read_8_data: 5803
ide_status apres read_8_data et memsze: 5803
INSTL_CF2_OK
ide_status dans ata.c (CF2) : D803
ide_status dans CF_oper;c (fonction cf_init) : 5003
J'ai fait un test avec de variables declarees interne,
on a generalement apparition de '00':
declaration:
unsigned char testrd[512];
extern unsigned int A_O;
extern unsigned int A_1;
extern unsigned int A_2;
extern unsigned int PIO_WR;
unsigned char CHR1;
Byte CHR2 ;
fonction:
printf("testrd 0 a: %X\n",testrd[0]);
printf("testrd 1 a: %X\n",testrd[1]);
testrd[1] =0x3F;
printf("testrd 1 aprs affect a: %X\n",testrd[1]);
A_O = P0_0;
A_1 = P0_1;
A_2 = P0_2;
PIO_WR = P5_0;
printf("AO %X\n", A_O);
printf("A1 %X\n", A_1);
printf("A2 %X\n", A_2);
printf("PIO_PWR %X\n", PIO_WR);
printf("CHR1 %X\n",CHR1);
printf("CHR2 %X\n",CHR2);
Resultats:
testrd 0 a: 5000
testrd 1 a: 0
testrd 1 aprs affect a: 3F00
AO 1
A1 1
A2 1
PIO_PWR 0
CHR1 4000
CHR2 400
Donc Je pense qu'il faudra un algorithme qui puisse lire le contenu de
la variable qu'on souhaite affichée et enlever les deux derniers 00,
mais somment ?