PIC18F26K80과 XC8 컴파일러를 사용하고 있습니다. SD 카드를 초기화하고 파일을 만들려고합니다. Windows에서 SD 카드를 "FAT32"파일 시스템과 "할당 단위 크기"512 바이트로 포맷했습니다. SD 카드의 용량은 2GB입니다. MLA 레거시 버전의 MDD 라이브러리를 사용하고 있습니다. 내 주요 내용은 다음과 같습니다.
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);
}
프로그램이 "FSInit ()"함수에 멈춰 있고 함수에서 발생하는 오류는 "CE_BAD_PARTITION"이며 "부팅 레코드가 잘못되었습니다"를 의미합니다.
"initIO ()"함수는 다음과 같습니다.
//==============================================================================
// 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;
}
섹터 0의 마지막 두 바이트는 부팅 서명이며 0x55와 0xAA로되어 있으며 포함 된 그림에서이를 확인합니다. 그러나 "LoadMBR"기능 내에서 다음 점검이 수행됩니다.
if((Partition->Signature0 != FAT_GOOD_SIGN_0) || (Partition->Signature1 != FAT_GOOD_SIGN_1))
{
FSerrno = CE_BAD_PARTITION;
error = CE_BAD_PARTITION;
}
else
{
...
}
바이트는 동일하지만 첫 번째 조건이 충족되고 "CE_BAD_PARTITION"오류와 함께 반환됩니다.