Диск имеет плоскую структуру т.е. доступ от 0-я до N байта, но читается блоками по 512 байт. Для чтения с карточки адрес задается не в блоках, а в байтах. Можно указать адрес, например 4-е, но карточка выдаст ошибку и чтения не будет. Адрес должен быть кратен 512 (0,512,1024...block0,block1,block2), после чтения 512 байт нужно еще прочитать 2-а байт - это CRC (контрольная сумма).
Разметка карточки:
MBR (Master Boot Record) занимает 1 блок. В MBR описывается 4-е логических диска (Partirion), в каждом логическом диске Может также находится MBR и разбивать его, например: еще на 2-а диска. Карточки обычно разбиты на один логический. В MBR описывается тип файловой системы, смещение диска, размер диска и тд.
Самое главное, разметка FAT:
BPB (BIOS Parameter Block или Boot block) занимает 1 блок RS (Reserved Sectros) может занимать несколько блоков FAT таблица FAT здесь хранятся номера кластеров, может быть несколько FAT таблиц друг за другом, обычно 2-е и зеркальные. ROOT здесь записи корневой директории, файлы, папки и т.д. DATA тута сами данные файлов, папок
В FAT16 размер номера кластера составляет 2-а байта, значит адресация в FAT таблицы будет такова: возьмем относительно с 0-я, адрес - кластер 0 - 0 2 - 1 4 - 2 6 - 3 и тд.
Данные размечаются на кластеры, кластер это как блок определенного размер (размер описан в BPB). Данные размечаются со 2-ого кластера, также возьмем относительно 0-я: кластер - адрес блока данных (пускай кластер равен 2048) 2 - 0 3 - 2048 4 - 4096 5 - 6144 и тд.
Для чтения файла, нужно узнать первый кластер из записи в ROOT. В FAT таблице по этому номеру будет следующий кластер этого файла и тд. Пока не встретится 0xffff - это последний кластер. Если первый кластер равен 0-ю, значит файл не содержит данных. Директории - это те же файлы содержащие записи.
короче забил на этот проэкт, мегу8 прицепил размер кода очень радует библиотека чена в 3 раза толще, но нехватило ног пытался передти на мегу 32 не смог переопределить ноги, да и из 4 флэшек тока на 256мб определилась и заработала, попался в сети проэкт http://avr-start.ru/?p=1849 чековек портирова либу чена в CVAVR и обозвал порты по понятному, итог сделал проэкт на меге8 и меге 32, и все 4 флэшки заработали и на фат 16 и на фат 32 и с кварцем на 16мгц
аааа, блин, походу я с питанием намудрил для экономии чтоб понизить питание поставил 6 диодов друг за другом, когда карта не вставлена там 3,5 вольта, а когда померил с вставленой картой там 2,8, оставил 4 диода с вставленной картой теперь 3,8, карта 256мб ЗАРАБОТАЛА, правда данные с файла еще не видел но светодиодики отморгали как положено, и на 8 мгц, и на 16мгц от внешнего кварца, остальные 3 карты по 16мб так и не запустились, мега8 заполнена на 48%, но мне ног нехватает как портировать сие на 32мегу, HELP!!!!
зашил сие в мегу 8 и облом, не инициализирует ФАТ, а протеусе работает и на 8 мгц и на 16мгц а в железе нет, пробовал четыре карточки, только одна пронициализировалась а инициализация фат нет, куда копать
у меня тоже не инициализируется фат, помогите разобратся очень нужно, прочитать отдин файл в корне карточки, пробовал четыре карточки, только одна пронициализировалась а инициализация фат нет, вот код который к себе перетянул в проэкт
Код
byte ok; led2(1);//первый этап моргаем первым светиком led (0); ok=sd_init(); //Инициализируем карточку switch(ok) { case SD_ERR_SUSSED: {errr();led (6);}; break;//"OK - SD INIT" //Нет ошибки case SD_ERR_IDLE: {errr();led (1);}; break; //"ERROR - SD IDLE //Карточка не перешла в IDLE case SD_ERR_INIT: {errr();led (2);}; break; //"ERROR - SD INIT" //Карточка не инициализировалась } while (ok!=0);
delay_ms(2000); //для индиации ошибки led2(2);//первый этап моргаем вторым светиком led (0);
ok=fat_init(); //Инициализируем FAT switch(ok) { case FAT_ERR_SUSSED: {errr();led (6);}; break; //"OK - FAT16 INIT" //Нет ошибки case FAT_ERR_PART: {errr();led (3);}; break; //"ERROR - PARTITION" //Ошибка Partition case FAT_ERR_ROOT: {errr();led (4);}; break; //"ERROR - ROOT ENTRY" //Ошибка Root Entry case FAT_ERR_SIZE: {errr();led (5);}; break; //"ERROR - SIZE" //Ошибка в количестве кластеров } while (ok!=0);
delay_ms(2000); //для индикации ошибки led2(3);//первый этап моргаем третим светиком led (0);
и еще у меня кварц на 16мгц, но я и от внутреннего пробовал 8мгц и от кварца
у меня со строкой while (sd_byte()!=0xfe); прога зацикливается, потому что в регистре SPDR сначала идут два байта отличных от 254 и 255, а все последующие = 255 и прога вешается здесь при инициализации ФАТ16, на карточке точно ФАТ16. Где должны быть текстовые файлы на флешке, в корне? файлы так и называются TXT1.TXT..., когда поставил в строке while (sd_byte()!=0xfe); 0хff, то выводит инициализацию карты и файла - ОК, но файлы не видит, а они там есть и в фрагменте кода получения инфы о FAT и отображении ее, выводит размер 0.00 Мб, что может быть не так, помогите