FATFS возвращает FR_DISK_ERR во второй раз, когда я использую идентичную строку кода - PullRequest
0 голосов
/ 04 января 2019

Я использую FATFS для записи данных на SD-карту. Это частично работает, и я могу записать данные EEPROM на SD-карту. Но когда я позже использую другую функцию в коде, она возвращает 'FR_DISK_ERR', хотя я использую ту же строку кода.

Первая попытка записи на SD-карту происходит следующим образом (на данный момент я уже инициализировал SD-карту и создал файл, что не является проблемой):

        //write EEPROM to EEPROM file
        fr = f_open(&File, file_name, FA_OPEN_APPEND | FA_WRITE);

        if (fr == FR_OK) 
        {
            //I write some data here, for company privacy purposes I have deleted this. I mainly use f_printf(&file,"data");  functions here


            /* Close the file */
            f_close(&File);
        }



        if(bEEPROMCollected && bEEPROMDataReady)
        {       
                                //stop collecting data
                bCollectEEPROM = false;                 
        }

        bEEPROMDataReady = false;

Функция fr = f_open (& File, имя_файла, FA_OPEN_APPEND | FA_WRITE); возвращает FR_OK и правильно записывает данные на SD-карту. Эта функция вызывается всякий раз, когда данные готовы, и останавливается после сбора данных.

Во второй раз, когда я вызываю функцию, она запрограммирована так:

if(bWriteSDOK == true && (/*some other values are true*/)
        {
            //get current time
            RTC_GetDateTime(&rtcCurrentTime);

            fr = f_open(&File, file_name, FA_OPEN_APPEND | FA_WRITE);

            if (fr == FR_OK) 
            {
                //print the current date and time to the SD card
                f_printf(&File, "%02x/", rtcCurrentTime.date);
                f_printf(&File, "%02x/", rtcCurrentTime.month);
                f_printf(&File, "%02x ", rtcCurrentTime.year);
                f_printf(&File, "%02x:", rtcCurrentTime.hour);
                f_printf(&File, "%02x:", rtcCurrentTime.min);
                f_printf(&File, "%02x,", rtcCurrentTime.sec);


                f_printf (&File, "\r\n");                       /* Put a formatted string to the file */

                /* Close the file */
                f_close(&File);


            }
            else if(fr == FR_DISK_ERR)
            {
                PORTD |= (1 << 6);
                f_close(&File);
            }


            bWriteSDOK = false;

Я не могу полностью отобразить мой код. Я не думаю, что это имеет значение. Что меня смущает, так это то, что второй (не совсем второй, просто еще одна функция) вызов функции open_append для файла возвращает ошибку (светодиод на PB6 включается). Сайт FATFS не полностью объясняет ошибку. кто-нибудь знает, почему это произошло?

Я знаю, что вторая часть кода уже работала и полностью проверила это на том же оборудовании. Каким-то образом первая часть программного обеспечения создала ошибку во второй части, которая не изменилась.

Я ожидаю, что первый фрагмент кода будет записывать 16 строк по 16 байт EEPROM. В следующий раз он должен показать другие данные, такие как текущая дата / время и т. Д.

EDIT: Я проследил его до следующей функции:

static FRESULT move_window (    /* Returns FR_OK or FR_DISK_ERR */
    FATFS* fs,          /* Filesystem object */
    DWORD sector        /* Sector number to make appearance in the fs->win[] */
)
{
    FRESULT res = FR_OK;


     if (sector != fs->winsect) {   /* Window offset changed? */
#if !FF_FS_READONLY
        res = sync_window(fs);      /* Write-back changes */
#endif
        if (res == FR_OK) {         /* Fill sector window with new data */
            if (disk_read(fs->pdrv, fs->win, sector, 1) != RES_OK) {
                sector = 0xFFFFFFFF;    /* Invalidate window if read data is not valid */
                res = FR_DISK_ERR;
            }
            fs->winsect = sector;
        }
    }
    return res;
}

функция 'if (disk_read (fs-> pdrv, fs-> win, sector, 1)! = RES_OK)' генерирует FR_DISK_ERR. Что это значит? Там написано / * окно недействительно, если считанные данные недействительны * /, но я не читаю никаких данных

...