FatFS - повторно не открывается файл на запись. Стандартный пример из Cube_MX: FatFs + FreeRTOS + USB_HOST. Для многих МК он аналогичный (с без ОС).
void vTaskUSB(void *pvParameters) {
osEvent event;
if(FATFS_LinkDriver(&USBH_Driver, USBDISKPath) == 0) { // Link the USB Host disk I/O driver
USBH_Init(&hUSB_Host, USBH_UserProcess, 0); // Init Host Library
USBH_RegisterClass(&hUSB_Host, USBH_MSC_CLASS); // Add Supported Class
USBH_Start(&hUSB_Host); // Start Host Process
for( ;; ) {
event = osMessageGet(AppliEvent, osWaitForever);
if(event.status == osEventMessage) {
switch(event.value.v) {
case CONNECTION_EVENT:
MSC_Application();
break;
case DISCONNECTION_EVENT:
f_mount(NULL, (TCHAR const*)"", 0);
break;
default:
break;
}
}
}
}
}
// Main routine for Mass Storage Class.
static void MSC_Application(void)
{
FRESULT res; // FatFs function common result code
uint32_t byteswritten, bytesread; // File write/read counts
uint8_t wtext[] = "Test (Пример) USB-HOST + FatFs"; // File write buffer
char const FaleName[] = "Test_USB.txt"; // File write buffer
uint8_t rtext[100]; // File read buffer
// Register the file system object to the FatFs module
if(f_mount(&USBDISKFatFs, (TCHAR const*)USBDISKPath, 0) != FR_OK) {
Error_Handler(); // FatFs Initialization Error
}
else {
// FATFS_LinkDriver(Diskio_drvTypeDef *drv, USBDISKPath);
// Create and Open a new text file object with write access
if(f_open(&MyFile, FaleName, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK) {
Error_Handler(); // 'STM32.TXT' file Open for write Error
}
else {
res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten); // Write data to the text file
if((byteswritten == 0) || (res != FR_OK)) {
Error_Handler(); // 'STM32.TXT' file Write or EOF Error
}
else {
f_close(&MyFile); // Close the open text file
// Open the text file object with read access
if(f_open(&MyFile, FaleName, FA_READ) != FR_OK) {
Error_Handler(); // 'STM32.TXT' file Open for read Error
}
else {
res = f_read(&MyFile, rtext, sizeof(rtext), (void *)&bytesread); // Read data from the text file
if((bytesread == 0) || (res != FR_OK)) {
Error_Handler(); // 'STM32.TXT' file Read or EOF Error
}
else {
f_close(&MyFile); // Close the open text file
// Compare read data with the expected data
if((bytesread != byteswritten)) {
Error_Handler(); // Read data is different from the expected data
}
else {
// BSP_LED_On(LED1); // Success of the demo: no error occurrence
}
}
}
}
}
}
FATFS_UnLinkDriver(USBDISKPath); // Unlink the USB disk I/O driver
}
При первом втыкании Flash-ки файл открывается и в него записываются данные, причем не важно был уже такой файл на Flash-ке или нет. При повторном втыкании Flash-ки (не важно существует такой файл или нет) в функции проверки файловой системы check_fs() возникает проблема ("ff.c")...
вначале идет строка
if (move_window(fs, sect) != FR_OK) return 3;
читает нулевой сектор на диске, если удачно, возвращает 0. Читает.
Далее идет проверка подписи сектора.
if (LD_WORD(&fs->win.d8[BS_55AA]) != 0xAA55) return 2;
которая не проходит, смотрю в дампе действительно со смещением 510 считываются другие
значения.
Что это может быть?
static BYTE check_fs ( /* 0:FAT boor sector, 1:Valid boor sector but not FAT, 2:Not a boot
sector, 3:Disk error */
FATFS* fs, /* File system object */
DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */
)
{
fs->wflag = 0; fs->winsect = 0xFFFFFFFF; /* Invaidate window */
if (move_window(fs, sect) != FR_OK) /* Load boot record */
return 3;
if (LD_WORD(&fs->win.d8[BS_55AA]) != 0xAA55) /* Check boot record signature
(always placed at offset 510 even if the sector size is >512) */
return 2;
if ((LD_DWORD(&fs->win.d8[BS_FilSysType]) & 0xFFFFFF) == 0x544146)
/* Check "FAT" string */
return 0;
if ((LD_DWORD(&fs->win.d8[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) /* Check
"FAT" string */
return 0;
return 1;
}