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".
Respostas:
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
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.
fonte
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.
fonte
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.
fonte