Поиск по сайту: |
|
По базе: |
|
Главная страница > Применения |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Дёшево и сердито! Азы работы с MMCMMC карты имеют достаточно простое управление. Память разбита на сектора по 512 байт. Карты форматируются так же, как обычные винчестеры под DOS: с 1 разделом, файловая система - FAT16. Чтение возможно как отдельными байтами, так и блоками. Напряжение питания карты должно быть в пределах +2.7В...+3.6В, скорость обмена до 20 мбит/с. При простое более 5мс карточка переводится в sleep режим с малым энергопотреблением, и выходит из него автоматически при возобновлении обмена. Интерфейс карты MMC карты могут работать в двух режимах обмена - MultiMediaCard protocol и SPI protocol.Первый более скоростной, а в пользу второго говорит то, что много контроллеров имеют встроенный SPI интерфейс. Ниже приведена разводка MMC именно для работы в режиме SPI:
Cигнал выборки имеет "0" активный уровень. SPI порт в управляющем контроллере (далее МК) должен быть настроен так, чтобы активным был передний фронт SCLK: Сразу же напомню о том, что фактически передача байта из контроллера (DO) осуществляется параллельно с приёмом по другой линии (DI). Чтобы начать приём/передачу через SPI в PICе (в Master mode), в буффер приёмопередатчика SSPBUF нужно что-то записать, а после окончания пересылки из SSPBUF считать принятое. В простейшем случае обмен с картой имеет вид "команда - ответ": Обозначения:
Внимание! Рисунки поясняют принцип обмена, поэтому масштабы не соблюдены. Обмен начинается с того, что МК выставляет сигнал 0 на xCS. Сначала посылаем 6 байт команды - последовательно пишем в вышеуказанный SSPBUF нужные байты, не забывая перед записью очередного дожидаться окончания передачи предыдущего (бит SSPSTAT,BF). Далее нужно дождаться ответа карты: пишем в SPI байт 0xFF и по окончании каждой передачи (контролируем SSPSTAT,BF) читаем принятое в SSPBUF. Первый байт, отличный от 0xFF, будет первым байтом ответа карточки (а для рассматриваемых ниже команд ответ всегда состоит из 1 байта). Данные, если требуется, передаются после ответа блоком заданной ранее длины: Начало блока данных "ловится" также: его первый байт отличен от 0xff (см. ниже).После окончания обмена нужно подать 1 на xCS. Команды и ответы Команда имеет длину 6 байт, передача всегда начинается со старшего бита. Пакет команды имеет следующий формат:
При работе MMC в режиме SPI доступно около 15 команд, позволяющих во-первых получить полную информацию о типе и текущем состоянии карты, во-вторых производить запись и чтение данных. Рассмотрим всего лишь 4 команды, с помощью которых можно лишь читать данные с MMC блоками размером 1x512 байт (мне для плеера вполне хватает):
Обратите внимание: все числа, аргументы и т.п. передаются начиная со старшего бита, а адрес блока - адрес первого байта блока. Ответ на любую из вышеприведённых команд состоит из одного байта, старший байт всегда равен 0. Другие биты - флаги ошибок:
Ошибки №2,4,5 нам встречаться не должны. Для операции чтения CMD17 считываемый блок должен быть в пределах одного физического сектора: его размер не должен превышать 512 байт, а начало и конец располагаться в одном и том же секторе. Если это не выполнено, то появится ошибка №6. Блок данных имеет длину от 4 до N+3 байт, где N - число, указанное в аргументе CMD16. Первый байт при передаче от MMC к МК равен 0xFE, далее следуют N байт запрашиваемой информации, а в конце - 2 байта CRC (их содержимое можно игнорировать, но прочесть нужно обязательно!). Если же при чтении произошёл сбой и карта не может предоставить данные, то вместо указанного блока передаётся 1 байт с флагом ошибки:
Инициализация карты Перед работой карту необходимо правильно проинициализировать. Спустя несколько мс после подачи питания по SPI нужно отправить 0xFF 74 раза и подождать ещё 1мс. Всё это время на xCS должна быть лог. "1". Теперь карта готова к приёму команд. После включения карта находится в режиме MultimediaCard protocol. Для перевода её в режим SPI надо отправить команду Сброс (CMD0) (не забывайте про xCS). В режиме SPI проверка CRC отключена по умолчанию, поэтому содержимое поля CRC7 игнорируется. Однако для CMD0 поле CRC7 нужно указать правильно. Поскольку команда не имеет меняющихся в процессе работы аргументов, то и специально вычислять это поле не обязательно: правильная CMD0 имеет вид: 0x40, 0x0, 0x0, 0x0, 0x0, 0x95. Далее карту необходимо проинициализировать. Для этого посылаем команду CMD1 до тех пор, пока в ответе карты бит0 (в спящем режиме) не сменится с 1 на 0. Это будет означать, что карта готова к работе. Теперь можно посылать прочие команды (у нас это CMD16 и CMD17). Файловая cистема Самое интересное - это работа с файловой системой. Не буду сильно распространяться, т.к. в инете итак навалом информации о том, что такое FAT16 и с чем её едят. Кратенько расскажу о том, как использовать содержимое некоторых секторов в своих личных целях. Структура диска:
MBR находится в нулевом секторе диска, позиции остальных частей будем вычислять. Стоит отметить, что если карточка была переформатирована Windows, структура диска могла измениться: Windows стирает MBR, и в нулевом секторе сразу начинается PBR. Чтобы различить содержимое нулевого сектора нужно считать его первые неск. байт. Если байты нулевые - это MBR, иначе - PBR. Нулевой сектор, он же Master Boot Record диска, выглядит примерно так:
Нам нужно описание первого раздела (то, что по смещению 0x1BE).Что там есть:
Это, конечно, не всё, но этого вполне хватит. Как пример привожу то, что написано в моей карточке:
Здесь позиция PBR - сектор номер 0x00000020, а число секторов 0x0003D3E0 (все длинные числа записаны с младшего байта), Offset - смещение байта от начала диска. Не стоит забывать, что физический адрес PBR равен pbr_adr = 0x00000020 * 0x200 =0x00004000 (0x200 - число байт на сектор). Идём в Partition Boot Record раздела:
Опять-же здесь в помощь моя карточка:
Мы видим 0x04 сектора на кластер, 0x00F5 секторов на каждую FAT, под PBR отведён 1 сектор, 512 записей в корневом каталоге. Этих четырёх чисел хватит, чтобы вычислить 3 важных смещения:
Fat_base - адрес нулевого байта FAT, Root_base - адрес нулевого байта корневого каталога, Cluster_base - адрес нулевого (не 002!!!) кластера (нулевого кластера нет, но так удобнее, см. ниже). В скобках - числа для моей MMC, root_entry_size - размер записи в корневом каталоге, равен 32 байта. Все смещения есть, осталось совсем немного. Разберёмся с FAT. Во первых всё пространство диска (после Root Dir) поделено на т.н. кластеры по "Sectors_per_Cluster" секторов в каждом. Во вторых 2 копии FAT идентичны, поэтому будем работать с первой. А FAT состоит из последовательности 2-х байтных слов (МЛАДШИЙ байт впереди). N-ое слово соответствует N-ому кластеру (N>1), и может содержать следующую информацию:
Исходя из разбиения диска на кластеры файл, будь он больше размера одного кластера, естественно содержит их несколько штук. Последовательность номеров кластеров, в которых записан файл, образует цепочку кластеров. Цепочка строится так: номер первого читается из записи в каталоге; в соответствующем слове FAT при этом указан следующий кластер. В слове для следующего - номер третьего и т.д. пока не достигается конец цепочки. Маленький организационный момент: первые 4 байта FAT - обязательная подпись, означает, что это начало FAT. Поэтому Нет нулевого и первого слова, Нет нулевого и первого кластеров, сразу за RootDir сидит кластер номер 0002. И снова от теории к практике - придуманное мной для примера начало FAT:
Первые 4 байта - подпись. Допустим, файл начинается со 2 кластера, Num = 2. Тогда адрес этого кластера adr = Cluster_base + Num * Sectors_per_cluster * 0x200. Кластер мы прочитали, а дальше читаем слово в FAT для этого кластера, 2 байта начиная с адреса adr = Fat_base + Num * 2 (0x4204). В нашем случае это 0003 - номер следующего кластера (см. таблицу). Расшифроывая таким образом содержимое Fat получим цепочку: 0002 - первый,0003,0005,0004,0006,0007 - последний. Если разобраться - достаточно просто. Наконец заглянем в корневой каталог - там кроме имени файла, даты, времени, атрибутов, указан первый кластер файла и его размер в байтах. Каждая запись в корневом каталоге состоит из 32 байт. Нам нужно прочитать байты со смещением 0x00,0x02,0x1A-0x1B,0x1C-0x1F. Если нулевой байт не равен 0xE5, второй не равен 0x00 или 0x04, то 0x1B:0x1A - первый кластер файла, а 0x1F:0x1E:0x1D:0x1C - его размер в байтах. Пока плеер без экрана, имя файла получать не обязательно... P.S.: Как выяснилось, SD карты полностью совместимы с карточками MMC, в т.ч. в режиме SPI. "Лишние" выводы в этом режиме не используются:
Единственно что стоит сделать - поставить подтягивающие сопротивления на выв. 8 и 9 (в р-не неск. деятков кОм). По материалам сайта SanDisk Катичев А. Кино афиша Москвы на InOut.ru
Главная - Микросхемы - DOC - ЖКИ - Источники питания - Электромеханика - Интерфейсы - Программы - Применения - Статьи |
|
Впервые? | Реклама на сайте | О проекте | Карта портала тел. редакции: +7 (995) 900 6254. e-mail:info@eust.ru ©1998-2023 Рынок Микроэлектроники |
|