FSInit () - “CE_BAD_PARTITION” [kapalı]


9

Bir PIC18F26K80 ve bir XC8 derleyicisi kullanıyorum. Bir SD kart başlatmak ve bir dosya oluşturmak çalışıyorum. Ben sadece SD kartını "FAT32" dosya sistemine ve 512 baytlık bir "Ayırma birimi boyutu" olacak şekilde biçimlendirdim. SD kartın kapasitesi 2 GB'dir. MLA Legacy sürümünden MDD kütüphanesini kullanıyorum. Benim ana şudur:

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

Program "FSInit ()" fonksiyonu içinde sıkışıp kalır ve fonksiyondan aldığım hata "CE_BAD_PARTITION", yani "önyükleme kaydı kötü" anlamına gelir.

"İnitIO ()" işlevi şu şekildedir:

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

Sektör 0'ın son iki baytı önyükleme imzasıdır ve 0x55 ve 0xAA olması amaçlanmıştır ve dahil ettiğim resim bunu doğrulamaktadır. Ancak, "LoadMBR" fonksiyonunun içinde aşağıdaki kontrol yapılır:

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

ve baytlar aynı olmasına rağmen ilk koşul karşılanır ve "CE_BAD_PARTITION" hatasıyla döner.


2
PIC'nin FAT16 yerine FAT32 beklediğinden emin misiniz?
Roger Rowland

@RogerRowland FAT16 ile de denedim ama bana aynı hatayı verdi.
user2344158

Microchip'in forumlarındaki bu yazı benzer. Şunu gördün mü?
Roger Rowland

@RogerRowland evet sanırım aynı durum bu. Ama bir şeyler yanlış gibi görünmüyor ...
Sorumu

1
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü dört yıldır bir çözüm yolunda takip etmeden asker tarafından terk edildi.
Chris Stratton

Yanıtlar:


1

Kodunuzu bu hata ayıklamaya yardımcı olacak kadar sağlamazsınız, ancak yayınladığınız parçalara yönelik googling, FAT16 kitaplığının bir bölümünden geldiğini gösterir.

Gönderilmiş bölüm tablonuza bakma

000001c0 03 00 0b e7 39 ee 80 00 00 00 00 90 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 bayrakları ve 0xb türü

0xb tipi bir FAT32 bölümünü gösterir, bu yüzden tahminim ya

1) kodunuz yanlış bölüm türüne sahip olduğu için ona bakmayı reddediyor veya

2), kodunuz CHS değerlerinin LBA değerleriyle eşleşmemesi nedeniyle üzgün.

bu bölüm türünü 0x6 (FAT16) olarak ayarlamayı, bölüm tablosunu aklı başında CHS değerleri (veya kukla CHS değerleri) ile yeniden yazmayı ve bölümü FAT16 olarak biçimlendirmeyi deneyin.


0

Bir süre önce böyle bir şey denedim ve Microchip'in kütüphanelerini zor buldum. Gitmek çok kolay bulduğum PetitFAT bir FOSS FAT sistemi çağrısı var . (Onun printf lib küçük gömülü platformlar için de harika.) Umarım yardımcı olur.


0

İlk olarak, FSINit () etrafında bir süre () yapmayın. Bu sadece tembel. Onu arayın ve sonucu kontrol edin ve buna göre işlem yapın, böylece programınız bilinmeyen sonsuz bir döngüde sıkışmaz.

İkinci olarak, 0x55 ve 0xAA beklediklerinden emin olmak için 'FAT_GOOD_SIGN_0' ve 'FAT_GOOD_SIGN_1' tanımına baktınız mı?

Üçüncü olarak, imza baytlarının sırasını kontrol ettiniz mi? FAT-32, 0x55AA değil 0xAA55 arıyor.


Bu dört yıl önce sorulmuş ve iki yıl içinde siteye geri dönmemiş bir kullanıcı tarafından terk edilmiştir. "Yanıtlar" ın netleştirici sorular sormak için gerçekten kullanılması gerekmemektedir, bir yanıt almanız pek olası değildir - gerçekçi olarak, sorunun kendisi çözüldüğünden veya terk edildiğinden beri uzun zamandır olmuştur.
Chris Stratton

Aslında Chris, bu biraz dar. İnsanlar hala SD kartlar için gömülü olarak özel sürücüler yazıyor, başka birinin muhtemelen buggy kütüphanesine dayanmıyor veya diğer kütüphaneler çok büyük veya başka bir nedenden dolayı yetersiz. Dosya sistemi bilgisi, gittikçe zorlaşan şeylerden biridir ve neredeyse her bilgi notu ilgilidir. Gönderdiğim şey orijinal postere yardımcı olmayabilir, ancak başka birine yardımcı olabilir. Konuşmaya teknik olarak herhangi bir yararlı şekilde hiçbir şey eklemediğiniz için neden yorum yaptığınızdan emin değilim.
GSLI
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.