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需要FAT32而不是FAT16吗?
罗杰·罗兰

@RogerRowland我也尝试使用FAT16,但是它给了我同样的错误。
user2344158 2015年

在Microchip论坛上的相关帖子听起来类似。你看到了吗?
罗杰·罗兰

@RogerRowland是的,我认为也是一样。但这看起来好像不对劲...我将编辑我的问题
user2344158'7

1
我投票结束这个题为离题的问题,因为提问者放弃了这个问题,而没有采取解决方案长达四年。
克里斯·斯特拉顿

Answers:


1

您没有提供足够的代码来帮助调试它,但是对所发布的片段进行谷歌搜索显示它来自FAT16库的一部分。

查看您发布的分区表

000001c0 03 00 0b e7 39 ee 80 00 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

我前段时间尝试了类似的方法,发现Microchip的库很困难。有一个名为PetitFAT的FOSS FAT系统,我发现它很容易上手。(他的printf lib也适用于小型嵌入式平台。)希望能有所帮助。


0

首先,不要在FSINit()周围做一会儿。那只是懒惰。调用它并检查结果并相应地处理它,这样您的程序就不会陷入无限的未知循环中。

其次,您是否查看了“ FAT_GOOD_SIGN_0”和“ FAT_GOOD_SIGN_1”的定义,以确保它们期望的是0x55和0xAA?

第三,您是否检查了签名字节的顺序?FAT-32正在寻找0xAA55,而不是0x55AA。


这个问题是四年前提出的,被一个甚至两年后都没有回到该站点的用户放弃。实际上,“答案”并不是用来问问题的,因为您不太可能会得到答复-实际上,问题本身早就已经解决或被抛弃了。
克里斯·斯特拉顿

克里斯(Chris),实际上有点狭窄。人们仍在为嵌入式SD卡编写自定义驱动程序,而不是依赖于其他人可能有错误的库或其他库太大或由于某些其他原因而不足。文件系统知识是越来越难获得的东西之一,几乎所有的信息都是相关的。我张贴的内容可能对原始海报没有帮助,但可能对其他人有帮助。我不确定为什么你甚至发表评论,因为从技术上讲,您没有以任何有用的方式添加任何内容。
GSLI
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.