Давно меня берет зависть когда люди делают Wav плееры на Attinny2313, читают FAT и никаких трудностей при этом не испытывают.
Работа с FAT требует много ресурсов, но если нас интересует только чтение и если забить на фрагментацию то можно просто считывать данные с карточки и сразу пулять их в порт( как все и делают).
Вот что я смог понять про то как это сделать:
Данные с SD карты считываются блоками (секторами) по 512 байт. Т.е. нельзя обратиться к конкретной ячейке, а только к началу блока (сектора) и последовательно его считать. Блоки (сектора) организованы в кластеры, размер кластера задается при форматировании карты (если конечно вам предложат его указать) и прописан как и всё остальное в PBR.
НАЧИНАЕМ
Главная загрузочная запись MBR
Считываем первый байт. Если он равен EBh, то это PBR, если 0h то это MBR и надо искать адрес начала PBR.
Загрузочная запись разделов PBR
Адрес PBR находится в MBR в ячейках 1C6:1C9 (4 байта) (байты идут в обратном порядке, т.е. если вы видите 95 00 00 00 то значение будет 00 00 00 95h).
Переходим по этому адресу.
PBR самое основное место. Адрес PBR является точкой отсчета всех перемещений по SD карте.
Т.е. везде указывается смещение относительно PBR и если нужно получить конкретный адрес нужно к смещению прибавить адрес PBR
Считываем важную информацию из ячеек PBR
0Dh - количество секторов в кластере
0Eh,0Fh – количество зарезервированных секторов (фактически если к этому прибавить PBR то получим начало FAT)
16h,17h – количество секторов в FAT
10h – количество копий FAT (обычно 2)
Корневой катклог. В нем хранится список файлов. На каждый файл формата 8.3 отводится 32 байта.
0h -8 байт - имя
8h -3 байта - расширение
0Bh -1 байт – атрибуты
16h -2 байта – время
18h -2 байта – дата
1Ah -2 байта – адрес первого кластера начала файла
1Ch -4 байта – размер файла
Чтобы найти корневой каталог надо умножить количество копий FAT (10h) на число секторов в нём (16h) и прибавить к полученному значению число зарезервированных секторов (0Eh).
Далее находим размер корневого каталога. По смещению 11h в PBR (2 байта) указано количество записей в корневом каталоге (размер каждой записи 32 байта).
Переводим количество записей в количество секторов: умножим количество записей на 32 и поделим на количество байт в секторе 512. Получаем размер корневого каталога в секторах.
Область данных. В ней начинается размещение данных.
Размещение области данных найдём прибавляя, к вычисленному ранее адресу корневого каталога, его размер.
Чтобы найти в области данных файл нужно в корневом каталоге найти запись об этом файле, считать оттуда смещение начального кластера этого файла
прибавить к нему начало области данных и это и будет сам файл.
А теперь первые грабли, ну как грабли, об этом все знают но я попал.
Область данных начинается сразу со второго кластера
У меня получается так: из смещения указанном в записи файла в корневом каталоге надо вычесть 2
Например:
смещение 2 -2=0 => файл начинается в начале области данных
смещение 3 -2 =1 *64(64 размер кластера)*512(размер сектора)=32768+адрес начала области данных =>адрес начала файла
Проверяется так:
SD карта до 2ГБ, форматируем в FAT, записываем несколько текстовых файлов, открываем диск в редакторе WinHEX или HxD
И с калькулятором по каждому этапу.
Призываю интересующихся к участию!
Отредактировано Димон (2014-09-03 19:01:38)