Драйвер SD-карт и файловая система MIK32FAT

Общая информация

Репозиторий проекта: https://github.com/Barsy-Barsevich/SDxMIK32

Формат проекта: PlatformIO IDE Фреймворк: framework-mik32v2-sdk

Структура репозитория

main.c       - примеры работы с файлами
sd-spi.c     - примеры SPI-взаимодействия
mik32fat.h/c - реализация файловой системы
sd.h/c       - драйвер SD-карт

Драйвер SD-карт

Реализовано взаимодействие по SPI с поддержкой:

  • Инициализации карты с определением типа

  • Отправки команд

  • Операций с секторами (512 байт):

  • Чтение

  • Запись

  • Стирание

Файловая система MIK32FAT

Особенности

  • Поддержка FAT32

  • Ограничения:

  • Только 8.3 имена (8 символов + 3 расширение)

  • Только заглавные латинские буквы и цифры

  • Без поддержки длинных имен (LFN)

Инициализация

FAT_Descriptor_t fs;
if (MIK32FAT_Init(&fs) == FAT_OK) {
    printf("FS initialized successfully\n");
}

При инициализации:

  1. Читается boot-сектор

  2. Открывается первый том

  3. Загружаются параметры:

    • Начальные сектора данных

    • Позиции FAT-таблиц

Работа с файлами

Открытие файлов

FAT_File_t file;
FAT_Status_t status = MIK32FAT_FileOpen(&file, &fs, "FOLDER/FILE.TXT", 'W');

Режимы:

  • 'R' - чтение

  • 'W' - дозапись (создает файл если не существует)

  • 'A' - перезапись (удаляет и создает заново)

Пути должны использовать / как разделитель! Пример: "DIR/SUBDIR/FILE.TXT"

Чтение файлов

char buffer[256];
uint32_t bytes_read = MIK32FAT_ReadFile(&file, buffer, sizeof(buffer));

Возвращает: количество прочитанных байт

Запись файлов

const char* data = "Hello World";
uint32_t bytes_written = MIK32FAT_WriteFile(&file, data, strlen(data));

Возвращает: количество записанных байт

Закрытие файлов

MIK32FAT_FileClose(&file);

Всегда закрывайте файлы после работы! * Гарантирует запись всех данных * Освобождает ресурсы

Управление файловой структурой

Создание объектов

// Создание файла
MIK32FAT_Create(&fs, "NEWFILE.TXT", false);

// Создание директории
MIK32FAT_Create(&fs, "NEWDIR", true);

Удаление объектов

MIK32FAT_Delete(&fs, "OLD_FILE.TXT");

Удаление происходит сразу без корзины! Данные невозможно восстановить после удаления.

Примеры использования

Полный цикл работы

FAT_Descriptor_t fs;
FAT_File_t file;

// Инициализация
if (MIK32FAT_Init(&fs) != FAT_OK) {
    printf("FS init failed\n");
    return;
}

// Создание и запись
if (MIK32FAT_FileOpen(&file, &fs, "TEST.TXT", 'W') == FAT_OK) {
    MIK32FAT_WriteFile(&file, "Test data", 9);
    MIK32FAT_FileClose(&file);
}

// Чтение
if (MIK32FAT_FileOpen(&file, &fs, "TEST.TXT", 'R') == FAT_OK) {
    char buf[10];
    MIK32FAT_ReadFile(&file, buf, 9);
    buf[9] = '\0';
    printf("Read: %s\n", buf);
    MIK32FAT_FileClose(&file);
}