J'utilise un PIC18F26K80 et un compilateur XC8. J'essaie d'initialiser une carte SD et de créer un fichier. J'ai simplement formaté la carte SD sous Windows pour avoir un système de fichiers "FAT32" et une "taille d'unité d'allocation" de 512 octets. La capacité de la carte SD est de 2 Go. J'utilise la bibliothèque MDD de la version MLA Legacy. Ma principale est la suivante:
FSFILE * file;
char sendBuffer[22] = "This is test string 1";
//**************************************************
// main function
//**************************************************
int main()
{
initIO();
LATBbits.LATB0 = 0;
// Initialise SPI and SD-card
while ( !MDD_MediaDetect() );
// Initialize the device
while ( !FSInit() );
// Initialize
#ifdef ALLOW_WRITES
// Create a new file
file = FSfopenpgm ( "FILE.TXT", "w" );
if ( file == NULL )
while(1);
// Write 21 1-byte objects from sendBuffer into the file
if ( FSfwrite ( (void *) sendBuffer, 1, 21, file ) != 21 )
while(1);
// Close the file
if ( FSfclose ( file ) )
while(1);
#endif
LATBbits.LATB0 = 1; //LED
while(1) {}
return (0);
}
Le programme est bloqué dans la fonction "FSInit ()" et l'erreur que j'obtiens de la fonction est "CE_BAD_PARTITION", ce qui signifie "L'enregistrement de démarrage est mauvais".
La fonction "initIO ()" est la suivante:
//==============================================================================
// void initIO( void );
//==============================================================================
// Sets the pins on the PIC to input or output and determines the speed of the
// internal oscilaltor
// input: none
// return: none
//==============================================================================
void initIO()
{
OSCCON = 0x75; // Clock speed = 32MHz (4x8Mhz)
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISBbits.TRISB0 = 0; //LED
TRISCbits.TRISC3 = 0; // set SCL pin as output
TRISCbits.TRISC4 = 1; // set RC4 pin as input
TRISCbits.TRISC5 = 0;
TRISAbits.TRISA5 = 0;
}
Les deux derniers octets du secteur 0 sont la signature de démarrage et ils sont censés être 0x55 et 0xAA et l'image que j'ai incluse le confirme. Cependant, à l'intérieur de la fonction "LoadMBR", la vérification suivante est effectuée:
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
et bien que les octets soient les mêmes, la première condition est remplie et elle revient avec l'erreur "CE_BAD_PARTITION".
Réponses:
Vous ne fournissez pas suffisamment de votre code pour aider au débogage, mais la recherche sur Google pour les fragments que vous avez publiés montre qu'il provient d'une partie d'une bibliothèque FAT16.
Examen de votre table de partition publiée
c'est les drapeaux 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 et tapez 0xb
le type 0xb indique une partition FAT32, donc ma supposition est soit
1) votre code refuse de le regarder car il a le mauvais type de partition, ou
2) peu probable, votre code est contrarié par le fait que les valeurs CHS ne correspondent pas aux valeurs LBA.
essayez de définir ce type de partition sur 0x6 (FAT16), de réécrire la table de partition avec des valeurs CHS sensées (ou des valeurs CHS factices) et de formater la partition en FAT16.
la source
J'ai essayé quelque chose comme ça il y a quelque temps et j'ai trouvé les bibliothèques de Microchip difficiles. Il existe un système FOSS FAT appelé PetitFAT que j'ai trouvé très facile à utiliser. (Sa bibliothèque printf est également idéale pour les petites plates-formes intégrées.) J'espère que cela vous aidera.
la source
Tout d'abord, ne faites pas un moment () autour de FSINit (). C'est juste paresseux. Appelez-le et vérifiez le résultat et gérez-le en conséquence afin que votre programme ne reste pas coincé dans une boucle inconnue sans fin.
Deuxièmement, avez-vous examiné la définition de «FAT_GOOD_SIGN_0» et «FAT_GOOD_SIGN_1» pour être sûr qu'ils attendent un 0x55 et 0xAA?
Troisièmement, avez-vous vérifié l'ordre des octets de signature? FAT-32 recherche 0xAA55, pas 0x55AA.
la source