FSInit () - "CE_BAD_PARTITION" [fechado]

9

Estou usando um PIC18F26K80 e um compilador XC8. Estou tentando inicializar um cartão SD e criar um arquivo. Simplesmente formatei o cartão SD no Windows para ter um sistema de arquivos "FAT32" e um "tamanho da unidade de alocação" de 512 bytes. A capacidade do cartão SD é de 2 GB. Estou usando a biblioteca MDD da versão MLA Legacy. Meu principal é o seguinte:

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);
} 

O programa fica preso dentro da função "FSInit ()" e o erro que recebo da função é "CE_BAD_PARTITION", o que significa "O registro de inicialização está ruim".

A função "initIO ()" é a seguinte:

//==============================================================================
// 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;
}

Os últimos dois bytes do setor 0 são a assinatura de inicialização e devem ser 0x55 e 0xAA, e a imagem que incluí confirma isso. No entanto, dentro da função "LoadMBR", é feita a seguinte verificação:

if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
    FSerrno = CE_BAD_PARTITION;
    error = CE_BAD_PARTITION;
}
else
{
    ...
}

e, embora os bytes sejam os mesmos, a primeira condição é atendida e retorna com o erro "CE_BAD_PARTITION".

user2344158
fonte
2
Você tem certeza de que o PIC está esperando FAT32 e não FAT16?
Roger Rowland
@RogerRowland Eu tentei com o FAT16 também, mas ele me deu o mesmo erro.
user2344158
Este post relacionado nos fóruns da Microchip parece semelhante. Você viu isso?
Roger Rowland
@RogerRowland sim, é o mesmo caso, eu acho. Mas não parece que algo está errado ... Vou editar minha pergunta #
user2344158
11
Estou votando para encerrar esta questão como fora de tópico, porque ela foi abandonada pelo solicitante sem acompanhamento de uma solução por quatro anos.
22419 Chris Stratton

Respostas:

1

Você não fornece o suficiente do seu código para ajudar a depurar isso, mas a pesquisa dos fragmentos que você postou mostra que ele vem de parte de uma biblioteca FAT16.

Olhando para sua tabela de partição publicada

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

são sinalizadores 0x00, CHS 0/3/0 - CHS 238/231/57 LBA 128 - 3837952 e digite 0xb

tipo 0xb indica uma partição FAT32, então meu palpite é

1) seu código está se recusando a analisá-lo porque possui o tipo de partição errado ou

2) improvável, seu código está chateado porque os valores CHS não correspondem aos valores LBA.

tente definir esse tipo de partição para 0x6 (FAT16), reescrevendo a tabela de partição com valores sãos de CHS (ou valores dummy de CHS) e formatando a partição como FAT16.

James
fonte
0

Eu tentei algo assim há algum tempo e achei as bibliotecas da Microchip difíceis. Existe um sistema FOSS FAT chamado PetitFAT que achei muito fácil de seguir. (Seu printf lib também é ótimo para pequenas plataformas incorporadas.) Espero que ajude.

danmcb
fonte
0

Primeiro, não faça um tempo () em torno de FSINit (). Isso é apenas preguiçoso. Ligue e verifique o resultado e manipule-o adequadamente para que seu programa não fique preso em um loop desconhecido sem fim.

Segundo, você analisou a definição de 'FAT_GOOD_SIGN_0' e 'FAT_GOOD_SIGN_1' para ter certeza de que eles estão esperando um 0x55 e 0xAA?

Terceiro, você verificou a ordem dos bytes da assinatura? O FAT-32 está procurando 0xAA55, não 0x55AA.

GSLI
fonte
Isso foi solicitado há quatro anos e abandonado por um usuário que nem volta ao site há dois anos. Na verdade, as "respostas" não devem ser usadas para fazer perguntas esclarecedoras; é improvável que você obtenha uma resposta - realisticamente, o problema em si provavelmente já está há muito tempo resolvido ou abandonado.
22819 Chris Stratton
Na verdade, Chris, isso é um pouco restrito. As pessoas ainda estão escrevendo drivers personalizados para cartões SD para serem incorporados, sem depender da biblioteca de bugs possivelmente de outra pessoa ou de outras bibliotecas que são muito grandes ou, por algum outro motivo, inadequadas. O conhecimento do sistema de arquivos é uma daquelas coisas que está ficando mais difícil de encontrar, e quase todo pedaço de informação é relevante. O que eu postei pode não ajudar o pôster original, mas pode ajudar outra pessoa. Não sei por que você sequer comentou, já que não está adicionando nada à conversa tecnicamente de nenhuma maneira útil.
GSLI 2/08/19