我正在使用 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, file_name, 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 上的 LED 亮起)。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。这是什么意思?它说 /* 如果读取的数据无效,则窗口无效 */,但我没有读取任何数据