Я использую 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. Что это значит? Там написано / * окно недействительно, если считанные данные недействительны * /, но я не читаю никаких данных