Votre question

Communication en C entre microcontrolleur et carte CompactFlash

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
14 Mars 2007 04:50:06

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:

C711344AC9E11349FF32849C367295C3E0401D80465C37A7D3FF83D7E2EC4DACE4
FDF331C111299BC17BF3A2727276014422F5DCE8499F368E93019CA41943B4B3BC7
968652FC1BBF403E69E6BF2CC458D40D9D04C04164E1187D8705836056951BD61D3
8B4878A4DC09F878117BA6C0090745A95AF3FFB492D44567BDE42484C0E989ABAC
9CF36526C188ED764D9936ED56F90A9DB1BE41AF684968B87CB853E598147BE6A0
D821DE51BA90D257BDFF4E81FBE9460CBCE26723AA2D530A5AB889996724FBFCD
20F77D575C57E40AC0628519392290866971FDBF248B94C28295A2F2EDB508D9079C
85B64C5FA6188CB5B014DA1BCDA2D759F596D1A3BB7C3AFE80E5728F063C5BE0A
E8F89FE8C7F562AA42F90A1CEE85A5135A2EDB4F7353E9A96214E788C42851DC71
643310361A74BB38AD1308E2E9650B8E0A978D598009F5C8DC48692774B940E29E36
5B21A33B1B7BC056E488D5047C9B9A2DB1FC79D30C526AD08A3A68919C1A6333D8
B3C0873816CFC1B8E7CAE8BE1B3C509D9DF0A30C87BB5884DDC787BAEC3286BB
C926BD658BBB98303B4C8A8C9A118754341A66FC60120B9524585FC9204F615AF50
CD5DACDA86F9AF0E6760899FF2E016EB29DC54DF7699E58E5F05B70C0C92F7C2E
59B344FE32ECAA234DB68DAF75EFA9F65F352E324826F63E23658B5297DA58CC6B
EDCC6A1FBC4095C57CE08F5E8FFAA855

Alors que mon programme pour l'affichage du contenu de la CF a cette meme addresse:
me renvoi le résultat de la capture Hyperterminal suivant:

11004A00E100490032009C007200C300400080005C00A700FF00D700EC00AC00FD00
310011009B007B00A20072001002200DC004900360093009C001900B400BC0068002F00
BB003009E00F20045004000D0004004E008700700036006900BD00D3004800A4009007800
7B00C000700A900F300B400D4006700E4008400E900AB009C006500C100ED004D003600
5600A00B1004100680068007C00530098007B00A0002100510090005700FF008100E900
C00E20023002D00A00B80099002400FC00F00D500C5004000600510092008009700DB00
48004C0029002F00DB008D0079005B00C5006100CB00100A100DA00750059001A00B700
AF00E0028006300BE00E8009F00C70062004200A00EE00A5005A00DB007300E9006200
E700C4005100710033003600740038001300E20065008E0097005900900C80048002700B900
E200360021003B007B00560088004009B002D00FC00D3005200D0003A0091001A003300
B30087001600C100E700E8001B0050009D00A30087005800DD008700EC008600C900BD00
8B0098003B008A009A008700340066006000B0024005F0020006100F500D500CD006F00
F000760099002E006E009D004D0069005800F0007000C9007C00590044003200AA004D00
8D007500A9005F002E004800F60023008B00970058006B00CC001F004000C500E0005E00
FA005500C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700C700
C700C700C700

Voici mon code de test de communication avec la CF:
  1. if (cf_read_open (6300,1))
  2. {
  3. printf ("\ncf_read_open is done\n");
  4. printf ("ide_status avant cf_read_byte() CF_operations: %X\n\r",ide_status);
  5. printf ("\n now call to cf_read_byte() and diplay of data\n");
  6. getchar();
  7. //for(rrd = 0; rrd < 200; rrd++); //delay
  8.  
  9. printf ("\n valeur de gl_ptr_mem avanr read byte (0): \n",gl_ptr_mem); ///testali030307
  10.  
  11. for(rd=0;rd<512;rd++)
  12. {
  13. testrd[rd]=cf_read_byte(); //APPELAPPEL
  14. // for(rrd = 0; rrd < 10; rrd++);
  15. }
  16.  
  17. for(rrd = 0; rrd < 512; rrd++)
  18. {
  19. // tstok=testrd[rrd]; ///test
  20. // tstok[rrd]=testrd[rrd]; ///test
  21. printf("%X",testrd[rrd]); //test AFFICHAGE OK
  22. // printf("%X",tstok); ///test
  23. //getch(); //testali230207
  24. // for(rd = 0; rd < 100; rd++);
  25. // printf("%X",tstok[rrd]); ///test
  26. }
  27.  
  28. data_lu = cf_read_byte(); //APPEL APRES BOUCLE
  29. printf("\nDATA LU = %X\n",data_lu); //re
  30. getchar();
  31. }
  32. else {printf ("\ncf_read_open is not done\n");}
  33. printf("ide_status fin CF_operations: %X\n\r",ide_status); //test
  34.  
  35. }



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 reellement en True Ide Mode ?

Merci de m'aider.

Autres pages sur : communication microcontrolleur carte compactflash

a b L Programmation
14 Mars 2007 19:43:17

  1. C7 11 34 4A C9 E1
  2. 00 11 00 4A 00 E1

Apparemment, tu lis 1 octet sur 2, arrivé à la moitié.
A mon avis c'est juste un problème d'adressage.
En supposant que ça commence à l'adresse 0, et que les adresses sont numérotés en mots, l'adresse 1 correspond au second mot, soit le mot 34 4A, et comme tu ne récupère que 8 bits, ça fait 4A.

Tu n'as vraiment pas de "cf_read_word" ?
Ou regarde si tu ne peux pas passer en mode d'adressage par octet et pas par mot.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS