FSInit () - “CE_BAD_PARTITION” [fermé]

9

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

user2344158
la source
2
Êtes-vous sûr que le PIC attend FAT32 et non FAT16?
Roger Rowland
@RogerRowland J'ai également essayé avec FAT16 mais cela m'a donné la même erreur.
user2344158
Cet article connexe sur les forums de Microchip semble similaire. Avez-vous vu cela?
Roger Rowland
@RogerRowland ouais c'est le même cas je pense. Mais il ne semble pas que quelque chose ne va pas ... Je vais modifier ma question
user2344158
1
Je vote pour clore cette question comme hors sujet car elle a été abandonnée par le demandeur sans suite vers une solution depuis quatre ans.
Chris Stratton

Réponses:

1

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

000001c0 03 00 0b e7 39 ee 80 00 00 00 00 90 3a 00 00 00 | .... 9 .......: ... |
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ |

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.

James
la source
0

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.

danmcb
la source
0

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.

GSLI
la source
Cela a été demandé il y a quatre ans et abandonné par un utilisateur qui n'est même pas revenu sur le site depuis deux ans. Les «réponses» ne sont pas vraiment censées être utilisées pour poser des questions de clarification, car il est peu probable que vous obteniez une réponse - en réalité, le problème lui-même a probablement été résolu ou abandonné depuis longtemps.
Chris Stratton
En fait Chris, c'est un peu étroit. Les gens écrivent toujours des pilotes personnalisés pour les cartes SD pour embarqués, ne se reposant pas sur la bibliothèque éventuellement buggée de quelqu'un d'autre ou d'autres bibliothèques trop grandes ou pour une autre raison inadéquates. La connaissance du système de fichiers est l'une de ces choses qui deviennent de plus en plus difficiles à trouver, et presque toutes les informations sont pertinentes. Ce que j'ai publié peut ne pas aider l'affiche originale, mais cela pourrait aider quelqu'un d'autre. Je ne sais pas pourquoi vous avez même commenté, car vous n'ajoutez rien à la conversation techniquement d'une manière utile.
GSLI