Пятница, 19.04.2024, 20:04
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Помоги сайту
Поддержи наш сайт
Через WebMoney
U222865683087
R391933670808
Z877043628365
E649133782052

или пополни нашу SMS копилку
SMS.копилка

Ссылки

 Каталог статей
Главная » Статьи » Учимся работать с AVR

ATmega8 + SD с поддержкой FAT
Долгожданная статья о FAT16 )))

Коротко о структуре карточки:

Block=Sector

Диск имеет плоскую структуру т.е. доступ от 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-ю, значит файл не содержит данных.
Директории - это те же файлы содержащие записи.

Файлы к статье для PROTEUS, CVAVR и также образ диска и документация FAT
Доступно только для пользователей

Исходники с комментариями, все вопросы на форум.

Категория: Учимся работать с AVR | Добавил: HiSER (15.06.2010) | Автор: Литвин Артём
Просмотров: 37792 | Комментарии: 55 | Теги: fat16, SD, ATmega8, MMC, fat | Рейтинг: 5.0/3 |
Всего комментариев: 551 2 3 4 »
55 Вова_Синяк  
0
короче забил на этот проэкт, мегу8 прицепил размер кода очень радует библиотека чена в 3 раза толще, но нехватило ног пытался передти на мегу 32 не смог переопределить ноги, да и из 4 флэшек тока на 256мб определилась и заработала, попался в сети проэкт http://avr-start.ru/?p=1849 чековек портирова либу чена в CVAVR и обозвал порты по понятному, итог сделал проэкт на меге8 и меге 32, и все 4 флэшки заработали и на фат 16 и на фат 32 и с кварцем на 16мгц

54 Вова_Синяк  
0
аааа, блин, походу я с питанием намудрил для экономии чтоб понизить питание поставил 6 диодов друг за другом, когда карта не вставлена там 3,5 вольта, а когда померил с вставленой картой там 2,8, оставил 4 диода с вставленной картой теперь 3,8, карта 256мб ЗАРАБОТАЛА, правда данные с файла еще не видел но светодиодики отморгали как положено, и на 8 мгц, и на 16мгц от внешнего кварца, остальные 3 карты по 16мб так и не запустились,  мега8 заполнена на 48%, но мне ног нехватает как портировать сие на 32мегу, HELP!!!!

53 Вова_Синяк  
0
зашил сие в мегу 8 и облом, не инициализирует ФАТ, а протеусе работает и на 8 мгц и на 16мгц а в железе нет, пробовал четыре карточки, только одна пронициализировалась а инициализация фат нет, куда копать

52 Вова_Синяк  
0
а как можно сие перебросить на 32 мегу там ножки на сходятся в spi с 8 мегой, пожалуйста очень надо на 8 меге мне под все ног не хватает

51 Вова_Синяк  
0
у меня тоже не инициализируется фат, помогите разобратся очень нужно, прочитать отдин файл в корне карточки, пробовал четыре карточки, только одна пронициализировалась а инициализация фат нет,
вот код который к себе перетянул в проэкт
Код
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мгц и от кварца

50 maslo  
0
Народ подскажите, пожалуйста, как создать и писать в файл?

49 Petrux@1795  
0
у меня со строкой while (sd_byte()!=0xfe); прога зацикливается, потому что в регистре SPDR сначала идут два байта отличных от 254 и 255, а все последующие = 255 и прога вешается здесь при инициализации ФАТ16, на карточке точно ФАТ16. Где должны быть текстовые файлы на флешке, в корне? файлы так и называются TXT1.TXT..., когда поставил в строке while (sd_byte()!=0xfe); 0хff, то выводит инициализацию карты и файла - ОК, но файлы не видит, а они там есть и в фрагменте кода получения инфы о FAT и отображении ее, выводит размер 0.00 Мб, что может быть не так, помогите

48 Petrux@1795  
0
не 245, а 254, имелось в виду, опечаточка вышла biggrin

47 Petrux@1795  
0
Подскажите, в коде нет ошибок?

void sd_read(lba addr) { //Отправляем комманду чтения
sd_write(0x51); //Read single block
sd_write(addr.s.a24);
sd_write(addr.s.a16);
sd_write(addr.s.a8);
sd_write(addr.s.a0);
sd_write(0xff);
sd_write(0xff);
while (sd_byte()!=0xfe); //Ждем Data Tocken
}

Меня смущает эта строка while (sd_byte()!=0xfe);, что за символ 245 мы ждем здесь? может должно быть 0xff?

46 Oljko  
0
Добрый день!
Помогите пожалуйста, мне нужно с карты прочитать содержимое ТХТ файла в ЕЕПРОМ меги 8! Размер файла 512б.

Спасибо!

1-10 11-20 21-30 31-38
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright My-AVR © 2024
Наша кнопка
У нас появилась кнопка, код кнопки:

Лаборатория самоделок на микроконтроллерах AVR

Форма входа
Наш опрос
Как вам материалы на сайте
Всего ответов: 863
Статистика/Друзья
CY-PR.com



Онлайн всего: 1
Гостей: 1
Пользователей: 0

РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум Сайт по радиоэлектронике. У нас все просто и интересно… ARV Reserch: Электроника — просто, полезно, увлекательно. Электронные устройства и программные средства для радиолюбителей и профессионалов, только авторские разработки, плагиата нет! Разработки на заказ. AVR projects Создание электронных роботов своими руками Схемы и программы на AVR http://ur5yfv.ucoz.ua/BANNER.gif Блог начинающего эмбеддера. Дай волю паяльнику! Самоделки на all-make.ru Принципиальные схемы Модулі автозапуску бензогенератора та системи АВР, електромонтажні роботи
Хостинг от uCoz