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の最後の2バイトはブート署名であり、それらは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を期待していますか?
ロジャーローランド2015

@RogerRowland FAT16でも試しましたが、同じエラーが発生しました。
user2344158

マイクロチップのフォーラムに関するこの関連記事も同様に聞こえます。見た?
ロジャーローランド2015

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

それはフラグ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

しばらく前にこのようなものを試しましたが、マイクロチップのライブラリは難しいと感じました。FOSS FATシステムコールPetitFATがあります。(彼のprintf libは、小さな組み込みプラットフォームにも最適です。)お役に立てば幸いです。


0

まず、FSINit()の周りにwhile()を実行しないでください。それは単に怠惰です。それを呼び出して結果を確認し、それに応じて処理することで、プログラムが無限の不明なループでスタックしないようにします。

次に、 'FAT_GOOD_SIGN_0'と 'FAT_GOOD_SIGN_1'の定義を見て、それらが0x55と0xAAを期待していることを確認しましたか?

3番目に、署名バイトの順序を確認しましたか?FAT-32は0x55AAではなく0xAA55を探しています。


これは4年前に尋ねられ、2年間サイトに戻っていないユーザーによって中止されました。「回答」は、明確な質問をするために実際に使用することを想定していません。実際に回答が得られる可能性は低いです。現実的には、問題自体が解決または放棄されてからずっと長い間です。
Chris Stratton、

実際にはクリス、それは少し狭いです。組み込み用のSDカード用のカスタムドライバーをまだ作成しています。他の誰かのバグのあるライブラリに依存したり、他のライブラリが大きすぎたり、その他の理由で不十分だったりします。ファイルシステムの知識は、入手が困難になっているものの1つであり、ほとんどすべての情報のスクラップが関連しています。私が投稿したものは元のポスターには役立たないかもしれませんが、他の誰かに役立つかもしれません。あなたが技術的に有用な方法で会話に何も追加していないので、なぜあなたがコメントしたのかはわかりません。
GSLI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.