FATFS возвращает FR_DISK_ERR во второй раз, когда я использую идентичную строку кода
Я использую 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. В следующий раз он должен показать другие данные, такие как текущая дата / время и т. Д.
РЕДАКТИРОВАТЬ: я проследил его до следующей функции:
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. Что это значит? Там написано /* Неверное окно, если прочитанные данные недействительны */, но я не читаю никаких данных