ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
620726
pav256 (22.09.2015 19:30, просмотров: 3504)
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; }