This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SIMPLELINK-MSP432-SDK:使用 FatFs 库的 F_OPEN 返回在未插入断点的情况下执行的 FR_DISK_ERR

Guru**** 2589280 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/623377/simplelink-msp432-sdk-f_open-using-fatfs-library-returns-fr_disk_err-in-executed-without-inserting-break-points

器件型号:SIMPLELINK-MSP432-SDK

大家好、

我编写了一个示例代码、在该代码中、我将在 SD 卡的写入模式下打开文件、并根据按键事件连续将数据写入该文件。

问题如下:

如果在 f_close 函数中插入了断点并且执行了示例、则会针对每个按键事件将文件正确写入 SD 卡。

序列是按键-> f_open 被调用、文件被写入 SD 卡文件->写入完整文件后、f_close 被调用->再次创建并关闭新文件。

因此、下次只要按键、数据就会立即写入创建的新文件中、并执行上述序列。

现在、如果我没有在 f_close 语句中放置断点、并且在下一次固件打开第二个文件以将数据写入其中时在写入第一个文件后执行固件、则 f_open 函数返回"FR_disk_error"

这种情况每次都重复。 因此、在第一个文件成功写入后、不会写入其他文件。

但是、如果在 f_close 处插入了断点、则 f_open 不会返回 FR_disk_error。

我甚至尝试在 f_close 和 f_open 函数之间插入延迟、但即使这样也无法解决 issue.e2e.ti.com/.../Demo-example-for-TI-review.zip 问题

我随附了代码供您参考。

请告诉我它有什么问题。

提前感谢您。

Vikram

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vikram、

    让我在我这边运行几个测试、然后我会给您回复。

    谢谢、

    David
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、David。

    我将等待您的回复。

    我还进行了一些故障排除、发现了与此问题相关的两件事。

    首先、在 f_open 函数中执行函数"foll_path (&dj、path)"后会发生此问题。 在这里、如果我在不插入断点的情况下运行目录路径、则第二次找不到目录路径。

    其次、我尝试在每个 f_close 和 f_open 之间插入100ms 的延迟、但令人惊讶的是、我没有收到此错误。 但插入100ms 的延迟对于我的项目是不可行的。

    Vikram

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vikram、

    对延迟答复表示歉意。 我运行了一些测试、但很遗憾、我无法重现此行为。 我使用了 SDK 中的 fatsDraw 示例。 请在下面查找我的代码:

    void * mainThread (void * arg0)
    {
    FRESULT 结果;
    SDSPI_Handle sdspiHandle;
    SDSPI_Params sdspiParams;
    uint16_t locCounter = 0;
    
    
    /*用于跟踪文件复制进度的变量*/
    unsigned int bytesRead = 0;
    unsigned int bytesWritten=0;
    unsigned int 文件大小;
    unsigned int totalBytesCopied = 0;
    
    /*调用驱动程序初始化函数*/
    GPIO_init();
    display_init();
    SDSPI_init();
    
    /*打开输出的显示屏*/
    Display = Display_open (Display_Type_UART、NULL);
    if (display =NULL){
    /*无法打开显示驱动程序*/
    while (1);
    }
    
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    
    /*打开用户 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
    
    display_printf (display、0、0、"启动 FatSD Raw 示例\n");
    
    /*安装并注册 SD 卡*/
    SDSPI_Params_init (sdspiParams);
    sdspiHandle = SDSPI_open (Board_SDSPI1、drive_NUM、&sdspiParams);
    if (sdspiHandle == NULL){
    Display_printf (display、0、0、"启动 SD 卡时出错\n"SD 卡);
    while (1);
    }
    否则{
    display_printf (display、0、0、"已安装驱动器%u "、drive_NUM);
    }
    
    while (1)
    {
    /*为文件副本创建新的文件对象*/
    fresult = f_open (&dst、outputfile、/*fa_create_always|*/fa_write|fa_open_always);
    if (fresult!= FR_OK){
    display_printf (display、0、0、"打开\"%s\"\n"、outputfile 时出错);
    Display_printf (display、0、0、"Aborting...\n"\});
    while (1);
    }
    
    /*移动内部文件指针*/
    f_lseek (&dst、locCounter*4);
    
    /*获取源文件的文件大小*/
    filesize = f_size (&dst);
    display_printf (display、0、0、"%d\n"之前的文件大小、filesize);
    
    locCounter++;
    sprintf ((char *) locString、"%d"、locCounter);
    
    /*写入 src 文件*/
    fresult = f_write (&dst、locString、4、bytesWritten);
    
    if (fresult || bytesWritten < 4){
    display_printf (display、0、0、"磁盘已满\n");
    while (1);
    }
    
    /*获取源文件的文件大小*/
    filesize = f_size (&dst);
    display_printf (display、0、0、"%d\n"后的文件大小、filesize);
    
    // f_sync (&dst);
    f_close (&dst);
    
    // usleep (100000);
    // usleep(50000);
    }
    } 

    如果您能够重现此问题、请您在您的一侧运行此代码。

     谢谢、

       David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 David:

    感谢您尝试使用示例代码。

    我尝试了提供的相同代码、它工作正常。

    但这里有一个问题、我们要始终保持 SDSPI 句柄打开、但对于我的应用、由于我只有一个 SPI 主器件、我必须运行2个 SPI 从器件、我无法始终保持 SDSPI 句柄打开。

    因此、我在关闭文件后尝试关闭 SDSPI 句柄、并在打开下一个新文件时出错。

    Vikram

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vikram、

     如果关闭手柄、则需要重新打开手柄。 那么、这就是我所做的:

    void * mainThread (void * arg0)
    {
    FRESULT 结果;
    SDSPI_Handle sdspiHandle;
    SDSPI_Params sdspiParams;
    uint16_t locCounter = 0;
    
    
    /*用于跟踪文件复制进度的变量*/
    unsigned int bytesRead = 0;
    unsigned int bytesWritten=0;
    unsigned int 文件大小;
    unsigned int totalBytesCopied = 0;
    
    /*调用驱动程序初始化函数*/
    GPIO_init();
    display_init();
    SDSPI_init();
    
    /*打开输出的显示屏*/
    Display = Display_open (Display_Type_UART、NULL);
    if (display =NULL){
    /*无法打开显示驱动程序*/
    while (1);
    }
    
    /*初始化实时时钟*/
    Clock_settime (clock_realtime、&ts);
    
    /*打开用户 LED */
    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);
    
    display_printf (display、0、0、"启动 FatSD Raw 示例\n");
    
    /*安装并注册 SD 卡*/
    SDSPI_Params_init (sdspiParams);
    sdspiHandle = SDSPI_open (Board_SDSPI1、drive_NUM、&sdspiParams);
    if (sdspiHandle == NULL){
    Display_printf (display、0、0、"启动 SD 卡时出错\n"SD 卡);
    while (1);
    }
    否则{
    display_printf (display、0、0、"已安装驱动器%u "、drive_NUM);
    }
    
    while (1)
    { 
           /*检查 SDSPI 句柄是否已关闭,是否已重新打开*/ if (sdspiHandle == NULL) { sdspiHandle = SDSPI_open (Board_SDSPI1、drive_NUM、&sdspiParams); if (sdspiHandle == NULL) { Display_printf (display、0、0、"启动 SD 卡时出错\n"SD 卡); while (1); } } /*为文件副本创建新的文件对象*/ fresult = f_open (&dst、outputfile、/*fa_create_always|*/fa_write|fa_open_always); if (fresult!= FR_OK){ display_printf (display、0、0、"打开\"%s\"\n"、outputfile 时出错); Display_printf (display、0、0、"Aborting...\n"\}); while (1); } /*移动内部文件指针*/ f_lseek (&dst、locCounter*4); /*获取源文件的文件大小*/ filesize = f_size (&dst); display_printf (display、0、0、"%d\n"之前的文件大小、filesize); locCounter++; sprintf ((char *) locString、"%d"、locCounter); /*写入 src 文件*/ fresult = f_write (&dst、locString、4、bytesWritten); if (fresult || bytesWritten < 4){ display_printf (display、0、0、"磁盘已满\n"); while (1); } /*获取源文件的文件大小*/ filesize = f_size (&dst); display_printf (display、0、0、"%d\n"后的文件大小、filesize); f_close (&dst);

    /*关闭 SDSPI 句柄*/ SDSPI_Close (sdspiHandle); sdspiHandle = NULL; } }

    请查看代码、并告诉我这是否可以解决您的问题。

      此致、

        David

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 David。

    是的、您答对了、问题与 FatFS 库无关、但我没有提供足够的时间关闭和打开 SDSPI 驱动程序。 现在、我添加了大约10毫秒的延迟、以解决问题。