FSInit ()- "CE_BAD_PARTITION"[닫힘]


9

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"오류와 함께 반환됩니다.


2
PIC가 FAT16이 아닌 FAT32를 기대하고 있습니까?
Roger Rowland

@RogerRowland FAT16으로 시도했지만 같은 오류가 발생했습니다.
user2344158

Microchip의 포럼 관련 게시물 은 비슷하게 들립니다. 봤어?
Roger Rowland

@RogerRowland 네, 같은 생각입니다. 하지만 뭔가 잘못된 것 같지 않습니다 ... 질문을 편집하겠습니다
user2344158

1
나는이 질문을 4 년 동안 해결책에 대한 후속 조치없이 질문자에 의해 버려 졌기 때문에 주제를 벗어난 주제로 마무리하려고 투표하고있다.
Chris Stratton

답변:


1

디버깅에 도움이되는 충분한 코드를 제공하지는 않지만 게시 한 프래그먼트에 대한 인터넷 검색은 FAT16 라이브러리의 일부에서 온 것으로 표시됩니다.

게시 된 파티션 테이블을보고

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

0x00, CHS 0/3/0-CHS 238/231/57 LBA 128-3837952 및 0xb 유형의 플래그입니다.

유형 0xb는 FAT32 파티션을 나타내므로 내 추측은

1) 코드가 잘못된 파티션 유형을 가지고 있기 때문에 코드보기를 거부하고 있습니다.

2) 코드가 CHS 값이 LBA 값과 일치하지 않을 가능성이 높습니다.

해당 파티션 유형을 0x6 (FAT16)으로 설정하고 정상적인 CHS 값 (또는 더미 CHS 값)으로 파티션 테이블을 다시 쓰고 파티션을 FAT16으로 포맷하십시오.


0

나는 얼마 전에 이와 같은 것을 시도했고 Microchip의 라이브러리는 어렵다는 것을 알았습니다. 내가 가기가 매우 쉬운 FOSS FAT 시스템 호출 PetitFAT 가 있습니다. (그의 printf lib는 작은 임베디드 플랫폼에도 좋습니다.) 그것이 도움이 되길 바랍니다.


0

먼저 FSINit () 주위에 while ()을 수행하지 마십시오. 게으르다. 그것을 호출하고 결과를 확인하고 적절하게 처리하여 프로그램이 끝없는 알 수없는 루프에 걸리지 않도록하십시오.

둘째, 'FAT_GOOD_SIGN_0'및 'FAT_GOOD_SIGN_1'에 대한 정의에서 0x55 및 0xAA를 기대하는지 확인 했습니까?

셋째, 서명 바이트의 순서를 확인 했습니까? FAT-32는 0x55AA가 아닌 0xAA55를 찾고 있습니다.


이것은 4 년 전에 요청되었으며 2 년 내에 사이트를 다시 방문하지 않은 사용자에 의해 포기되었습니다. "답변"은 실제로 명확한 질문을하는 데 사용되지는 않습니다. 응답이 없을 것입니다. 현실적으로, 문제 자체는 해결되거나 포기 된 지 오래 된 것 같습니다.
Chris Stratton

실제로 크리스, 그것은 조금 좁습니다. 사람들은 여전히 ​​다른 사람의 버그가있는 라이브러리 또는 다른 라이브러리가 너무 크거나 다른 이유로 부적합하지 않은 임베디드 SD 카드 용 사용자 정의 드라이버를 작성하고 있습니다. 파일 시스템 지식은 점점 더 어려워지고있는 정보 중 하나이며 거의 모든 정보 스크랩이 관련이 있습니다. 내가 게시 한 내용은 원본 포스터에는 도움이되지 않지만 다른 사람에게는 도움이 될 수 있습니다. 대화에 기술적으로 유용한 방법을 추가하지 않기 때문에 왜 주석을 달았는지 잘 모르겠습니다.
GSLI
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.