Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

338 Часть 111. Практическое программирование микроконтроплеров АVR Длина команды в картах ММС фиксированная и составляет 6 байтов (48 битов). Первые два бита ( 4 7 и 4 6), посылаемые «мастером» - в терминологии описания ММС он называется хостом (host), - всегда равны 0 1 . Следующие шесть битов старшего байта представляют собой код команды. Таким образом, любая команда формируется из ее кода (который может лежать в пределах от о до 63) прибавлени­ ем числа $ 4 0 . После команды должны идти четыре байта (32 бита) аргумента, для команд без аргументов на этом месте должны стоять нули. Для рассматриваемых далее операций чтения или записи это - адрес начального байта (а не блока ! ) . c s --, _______ -о11о-------1 � о 1 510 511 D I .-- lx.-- 1 хт-- 1 н..,.... 1 c"""" Iд"""" I д-lд-lд-jё3-н..... I н...,... 1н...,... IFEt...,... D-.-ID"""rl l l 1 1D ID lн lн 1 н 1н 1 1 1 1 н 1 н 1 х 1 х 1 1- команда -- 1 1-данные -1 1- BUZY-1 Do lz l z l zl нl нl нlн lн l н l н l o lн l н l н lнl l / lн fн ERfё�L I L l l /-I L...- l н......, lz l....... z l Рис. 1 2.4. Временная диаграмма подачи команд на карту ММС: Х - любое состояние; Z - «третье» состояние; Н - высокий уровень ($ FF) ; L - низкий уровень ( $ 0 0) ; С - байт кода команды (ОЬ01пппппп, где п - биты кода команды) ; А - байты аргумента (адреса) , CR - код CRC; FE - байт со значением $FE ЗАМЕТКИ НА ПОЛЯХ Собственно, с тем фактом , что 32-битовое число адресует каждый байт индивидуаль­ но, и была связана необходимость принятия нового стандарта карт SD под названием SDHC, т. к. максимальная емкость по рассматриваемому нами стандарту ММС и SD может составить теоретически лишь 4 Гбайт, а на практике, учитывая ограничения файловой системы FAT1 6 , - лишь 2 Гбайт. Зато такая адресация позволяет читать информацию побайтно, начиная с любого места в памяти , что, учитывая назначение флеш-карт, - явный анахронизм. Наконец, последний байт в команде должен нести значение циклического кон­ трольного кода CRC (Cycl ic Redundancy Code), причем собственно CRC занимает семь старших битов этого последнего байта, а младший (самый последний бит команды) - всегда единица. CRC - не контрольная сумма LRC, о которой мы говорили в главе 6 в связи с НЕХ-файлами, а более «крутая штука», на которой здесь останавливаться нет смысла, - в Интернете найдется множество ресурсов, где это понятие подробно разъясняется, а в техническом описании картММС пред­ лагается весьма «навороченный» алгоритм его расчета. Нам здесь важно, что в режиме SPI для карты ММС по умолчанию механизм про­ верки CRC отключен, и почти для всех команд можно посылать значение последне­ го байта, равное $ FF. Это сильно облегчает задачу, т. к. проверка значения CRC в общем-то ориентирована на реализацию в аппаратной, а не программной форме (где она получается достаточно громоздкой), а такого модуля у нас, естественно, нет. Потому вычислять CRC нам не придется - за одним важным исключением: самой первой должна идти команда сброса карты GO_ I DLE_STATE (с кодом, равным нулю), в которой наличие CRC обязательно. К счастью, его уже подсчитали за

RkJQdWJsaXNoZXIy MTExODQxMg==