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".