Музыкальный звонок с картой ММС
Карта памяти ММС может обмениваться информацией с устройством, к которому она подключена, в двух режимах. Первый носит название MulttMediaCard protocol, он более скоростной, а в пользу второго (SPI protocol) свидетельствует то, что встроенный интерфейс SPI имеют многие микроконтроллеры, соединить карту с одним из них не представляет никаких трудностей. В табл. 1 приведено назначение контактов карты ММС именно при работе в режиме SPI.
А их расположение показано на рис. 1, там же изображена карта памяти SD (Secure Digital), в режиме SPI совместимая с ММС. Контакты 8 и 9 карты SD в этом режиме не используются, их необходимо соединить с цепью питания (VDD) через резисторы номиналом около 4,7 кОм.
Сигнал CS имеет активный низкий уровень. Интерфейс SPI управляющего картой микроконтроллера должен быть настроен таким образом, чтобы активным был нарастающий перепад сигнала SCLK. В микроконтроллерах AVR для этого нужно занести в регистр SPCR код 0x50 (здесь и далее имена регистров и значения кодов относятся к микроконтроллерам семейства AVR).
Прием байта из карты происходит одновременно с загрузкой в нее другого байта, как показано на рис- 2.
Чтобы произвести такой обмен через контроллер интерфейса SPI микроконтроллера, работающий в режиме ведущего (master mode), в буферный регистр приемопередатчика SPDR нужно записать байт, предназначенный для пересылки в карту, а по завершении операции прочитать в том же регистре принятый из карты байт. Импульсы синхронизации SCLK ведущий формирует автоматически.
В простейшем случае обмен информацией происходит в формате «команда микроконтроллера — ответ карты». Команда (табл. 2) всегда состоит из шести байтов — 48 двоичных разрядов, передаваемых в порядке от старшего (D47) к младшему (DO).
Обмен начинается с установки низкого уровня сигнала CS. Затем отправляют шесть байтов команды: их поочередно записывают в регистр SPDR, не забывая каждый раз дожидаться окончания передачи предыдущего байта (контролируя его по состоянию разряда SPIF в регистре SPSR). Далее следует получить ответ карты. Для этого, многократно передавая коды OxFF, анализируют принятые байты. Первый из них, отличный от OxFF, и будет ответом на поданную команду. На все рассматриваемые далее команды карта отвечает одним байтом. Блок информации заданной длины, если он требуется, она передает вслед за байтом ответа.
Карта ММС, работая в режиме SPI, воспринимает около 20 команд, позволяющих, во-первых, получить полную информацию о типе и текущем состоянии карты, во-вторых, производить запись и чтение информации. Мы рассмотрим только четыре команды (табл. 3), которых достаточно, чтобы прочитать хранящуюся в ММС информацию.
Старший разряд (D7) ответа карты на любую из этих команд всегда равен нулю, единицы в других разрядах означают, что при приеме и исполнении команды допущены следующие ошибки:
D0=1 — карта находится в спящем режиме, процесс инициализации не завершен;
D1-1 — операция стирания прервана до ее завершения;
D2=1 принята недопустимая команда;
D3=1 — принятый контрольный код CRC7 не совпал с вычисленным;
D4=1 — ошибка в команде стирания; D5=1 — ошибка адреса, блок пере
секает физическую границу сектора;
D6=1 — аргумент команды вне допустимых пределов.
Передаваемый картой по команде CMD17 информационный блок может быть длиной от 4 до N+3 байт, где N — значение аргумента последней принятой картой команды CMD16 или 512, если таких команд не было. Первый байт этого блока — всегда OxFE, далее следуют N байтов информации, а за ними — два байта контрольного кода CRC16. Его правильность можно не проверять, но прочитать — обязательно. Если в карте произошел сбой, вместо информационного блока она передает один байт с признаками ошибки:
D0=1 — сбой по неизвестной причине; D1=1 — сбой внутреннего контроллера;
D2=1 — процедура коррекции ошибок не смогла восстановить поврежденную информацию;
D3-1 — аргумент команды вне допустимых пределов;
D4—1 — карта заблокирована (например, защищена паролем).
Значения разрядов D5—D7 всегда нулевые.
Чтобы подготовить карту к работе, необходимо через несколько миллисекунд после включения питания 74 раза послать ей по интерфейсу SPI код OxFF, затем выдержать паузу 1 мс. Все это время на выводе CS должен быть установлен высокий уровень. Теперь карта готова к работе в режиме Multimedia-Card protocol. Для перевода ее в режим SPI необходима команда CMD0. Хотя в этом режиме проверка контрольного кода по умолчанию отключена, в команде CMD0 значение CRC7 должно быть указано правильно. Поскольку эта команда не имеет меняющегося в процессе работы аргумента, каждый раз вычислять ее CRC7 заново не обязательно: команда всегда представляет собой последовательность байтов 0x40 0x0. 0x0,0x0, 0x0, 0x95.
Далее карту необходимо инициализировать. Для этого повторяют команду CMD1 (0x41, 0x0, 0x0, 0x0, 0x0, OxFF) до тех пор, пока единичное значение разряда D0 в ответе карты не сменится нулевым. Теперь карта готова к работе в режиме SPI и ей можно подавать другие команды. В нашем случае — CMD16 (0x50, ОхХХ, ОхХХ, ОхХХ, ОхХХ, OxFF) и CMD17 (0x51, ОхХХ, ОхХХ, ОхХХ, ОхХХ, OxFF). Здесь XX — значения аргументов этих команд, а их последние байты (OxFF) подменяют ненужные в режиме SPI контрольные коды.
Чтобы организовать в самодельном микроконтроллерном устройстве чтение записанных на карте файлов, необходимо разобраться в организованной на ней компьютером при форматировании информационной структуре.
Как правило, это файловая система FAT16 — такая же, как на гибких и жестких магнитных дисках, ее варианты известны и применяются со времен операционных систем DOS до настоящего времени.
Физические единицы хранения информации на диске или на карте — секторы обьемом по 512 байт. Они объединяются в более крупные кластеры, каждый из которых содержит целое число секторов. В самом первом секторе обычно содержится так называемая главная загрузочная запись (Master Boot Record, MBR), структура которой показана в табл. 4. Ее первые 446 байтов отведены информации, требующейся для «холодного» старта компьютера с данного носителя информации (диска или карты). Если такой старт невозможен, они остаются нулевыми. В конце MBR находятся описания (табл. 5) от одного до четырех логических разделов, которые могут быть организованы на данном носителе, причем каждый — со своей файловой системой.
В табл. 6 приведен пример содержимого завершающего фрагмента MBR с описанием только одного раздела. Цифры, выделенные красным цветом, означают, что раздел имеет формат FAT16, начинается с адреса 0х00000065х х512 = ОхСАОО и может содержать до 0x00079F9B = 499614 секторов (приблизительно 244 Мбайт информации).
Обратите внимание, что все многобайтные значения параметров здесь и далее записаны в памяти карты в принятом для совместимых с IBM PC компьютеров порядке: младший байт числа (кода) всегда находится по меньшему адресу, чем старший. Например, четырехбайтное число 0x00079F9B выглядит как 9В 9F 07 00. По начальному адресу раздела находится его загрузочная запись (Partition Boot Record, PBR). Если на карте всего один раздел, его PBR может начинаться с нулевого адреса, занимая место отсутствующей MBR. Назначение полей PBR, представляющих для нас интерес, приведено в табл. 7. FAT — это таблица расположения файлов (File Allocation Table). Две ее копии абсолютно одинаковы, но обычно работают только с первой, обращаясь ко второй лишь при подозрении, что первая повреждена.
Пример содержимого PBR показан в табл. 8. По имеющейся в нем информации необходимо вычислить три важных адреса.
Первый из них — FAT base, адрес начала первой копии FAT. Он равен числу секторов от начала PBR до начала FAT, умноженному на число байтов в секторе, плюс начальный адрес раздела:
FAT.base = 2*512+OxCAOO=OxDAOO.
Второй — Root_base, адрес начала корневого каталога файлов. Он следует за двумя копиями FAT, каждой из которых отведено по два сектора. Этот адрес на 2x2x512 больше FATbase и равен 0х4АА00.
Третий — Clusterbase, начало первого информационного кластера раздела. Он следует непосредственно за корневым каталогом, длину которого можно определить, зная максимальное число записей в нем и длину записи (32 байта для FAT 16). После несложных вычислений получаем
Cluster_base = 0х4СА00.
Корневой каталог состоит из записей длиной по 32 байта, каждая описывает один хранящийся файл и имеет структуру, показанную в табл. 9. При удалении файла все его содержимое фактически остается неизменным, лишь первый символ имени файла в каталоге заменяется кодом 0хЕ8, который просто разрешает операционной системе повторно использовать данную каталожную запись и всю отведенную «удаленному» файлу память. Пока новая запись не производилась, файл можно восстановить, вернув на свое место первую букву его имени. Кроме имени файла, его атрибутов (только чтение, скрытый и т. п.), здесь находится номер первого кластера, занятого файлом, который не может быть меньше двух, поскольку нулевой и первый кластеры носителя заняты служебной информацией. Второй кластер начинается сразу после корневого каталога максимального обьема.
В табл. 10 приведен пример описания файла ММС.ТХТ. Файл начинается со второго кластера (расположенного по адресу Clusterbase). Длина этого файла ОхООООбАЗЗ = 27187 байт. За номерами следующих кластеров файла следует обращаться в FAT, состоящую из ячеек, число которых равно числу кластеров на носителе. Ячейки — шестнадцатиразрядные, именно по этой причине система названа FAT 16 {есть ее варианты — FAT 12 и FAT32).
Чтобы найти номер следующего кластера файла, необходимо прочитать ячейку FAT, номер которой совпадает с уже известным номером предыдущего кластера. Если содержимое ячейки лежит в пределах 0x3—OxFFEF, это— номер следующего кластера, в соответствующей ему ячейке таблицы будет записан номер еще одного кластера и так далее. Образуется их цепочка, хранящая всю информацию данного файла. В ячейке последнего кластера цепочки вместо номера следующего записан код из интервала 0xFFF8—OxFFFF.
Если файл создан на чистом диске или карте, цепочка принадлежащих ему кластеров бывает, как правило, непрерывной. Например, из табл. 11 следует, что файл, начинающийся с кластера 2, занимает последовательно кластеры с третьего по восьмой, которым и заканчивается. Однако при неоднократном удалении файлов и записи на их место новых последовательность может быть нарушена, так как операционная система компьютера использует для размещения новой информации первые же встреченные свободные кластеры.
Обратите внимание, что нулевая и первая ячейки FAT, соответствующие никогда не используемым кластерам, также содержат коды «последнего кластера». Кодами 0xFFF7 помечают дефектные кластеры. Программа записи файлов должна уметь их обходить.
Схема простого устройства для воспроизведения записанных на карту ММС файлов формата WAV показана на рис. 3. В нем всего две микросхемы: микроконтроллер ATmega8 и усилитель мощности LM386N. Такое устройство можно использовать, например, в качестве квартирного звонка. В программную память микроконтроллера необходимо загрузить коды из файла mmcsd wav.hex, имеющегося в приложении. Разряды конфигурации должны быть запрограммированы следующим образом: CKSEL0=0, CKSELl = 1, CKSEL2=1, CKSEL3=1, CKOPT=1, SUTf>1, SUT1=0.
После подачи напряжения питания микроконтроллер производит инициализацию своих внутренних узлов, после чего переходит в «спящий» режим. При нажатии на кнопку SB1 микроконтроллер «просыпается», о чем свидетельствует включение светодиода HL1, инициализа-цирует карту ММС, подключенную к разъему XI, и ищет на ней файл по имени muzon01.wav. Найдя нужный файл, микроконтроллер воспроизводит его, после чего снова «засыпает», а светодиод HL1 гаснет. При следующем нажатии на кнопку SB1 все повторится, но будет воспроизведен файл muzon02.wav. И так до последнего, десятого файла, после которого вновь прозвучит первый и цикл повторится.
Необходимую скорость воспроизведения задает таймер ТО микроконтроллера, по формируемым им запросам прерывания байты информации, считанные из ММС, поочередно заносятся в регистр ОСВ1А1_таймераТ1 (значение в регистре OCR1 АН должно быть нулевым). Микроконтроллер формирует на выходе ОС1А (выводе 15) импульсы, длительность которых пропорциональна значениям заносимых в регистр OCR1AL байтов, а частота следования равна 32 кГц.
После удаления фильтром R5C7 высокочастотных составляющих эта импульсная последовательность превращается в звуковой сигнал, мощность которого доводит до необходимого для работы акустической головки ВА1 уровня усилитель DA1. Подстроечный резистор R7 — регулятор громкости.
На транзисторе VT1 собран стабилизатор напряжения 3,3 В для питания микроконтроллера и карты ММС. Вмес то транзисторного можно (и даже нужно) применить интегральный стабилизатор, например, на микросхеме LD1086V33. Но к моменту изготовления устройства такого стабилизатора в наличии не оказалось. Следует отметить, что при напряжении питания 3,3 В тактовая частота 16 МГц для микроконтроллера ATmega8 считается слишком высокой. Тем не менее собранное мной устройство нормально работает.
Готовя карту ММС для работы в описанном устройстве, нужно с помощью компьютера записать на нее десять звуковых файлов формата WAV (PCM, 16 кГц, 8 разрядов, моно) с именами muzonOI .wav — muzon10.wav. Файлы, названные иначе, воспроизводиться не будут.
В простейшем случае для этого можно воспользоваться стандартной программой Windows «Звукозапись». Чтобы найти ее, пройдите по пути «Пуск—>Про-граммы-»Стандартные->Развлечения^ Звукозапись». Большие возможности дают специализированные программы, например Sound Forge.
Перед записью файлов карту необходимо отформатировать, создав на ней систему FAT16. Однако на картах небольшого объема, например 16 Мбайт, Windows автоматически создает систему FAT12, непригодную для рассматриваемого устройства. В таких случаях можно запустить программу форматирования из командной строки, указав в ней размер кластера 1024 байт. Если карта определена компьютером как диск F, командная строка должна быть следующей:
format F: /А:1024
В результате ее выполнения на карте будет создана система FAT 16.
Программа микроконтроллера находится на FTP-сервере по адресу <ftp://ftp.radio.ru/pub/2009/ 09/mmc sd wav. zip>.
Метки: Карта памяти, Обмен информацией.
Добавить комментарий