Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Схема для проверки процедур обмена с картой для нашего случая ничем не отличается от приведенной на рис. 11.2 для микросхемы AT45DB. (рис. 11.3, слева). Конечно, не стоит портить карту пайкой непосредственно к ее выводам. У выводов карты шаг 2,5 мм, поэтому самодельный разъем для отладки схемы доступа можно сделать, например, из двухрядного игольчатого разъема PLD, если загнуть контакты одного ряда внутрь (см. рис. 11.3, справа).

Отметим, что "подтягивающие" резисторы на линиях DO, DI и CLK здесь устанавливать рекомендуется инструкцией, хотя минимальное значение этих резисторов, согласно рекомендациям, должно быть 50 кОм (явный расчет на применение встроенных резисторов в микроконтроллерах). На практике карта нормально работает и с обычными для наших схем резисторами 3-5 кОм (но, конечно, потребление при этом будет больше).

Подача команд и инициализация ММС
Общий принцип работы интерфейса SPI в картах немного отличается от привычного нам побайтного доступа. Если помните, в главе 3 я писал, что в интерфейсе SPI нет никакого маркера, разделяющего байты — в принципе это бесконечный поток битов, синхронизированных фронтами по линии SCL. У карт памяти, которые и сами могут иметь самое разное устройство и применяться с различными контроллерами, между информационными посылками могут быть достаточно большие промежутки, необходимые контроллеру или карте на то, чтобы "переварить" нужную информацию.
Поэтому в принципе промежуток до команды, или от команды до получения отклика, или до начала массива данных (см. далее описание команд) может быть произвольным. Поскольку внутреннего тактового генератора у карты нет, то работа ее в таких паузах обеспечивается тактами по линии CLK, при этом на линии DI должен быть выставлен высокий уровень (что равносильно посылке байтов, равных $FF). На линии DO в большинстве случаев при этом также присутствует высокий уровень, за исключением состояния, когда карта занята, например, записью блока в память (BUZY) — тогда здесь низкий уровень. Стандарт устанавливает для большинства таких промежутков максимальное значение в 8 восьмибитовых посылок (минимальное может быть в разных случаях как 0, так и 1). Первый (старший) бит любой команды (либо байта отклика, см. далее) всегда равен нулю, так что по сбросу в нулевое состояние на линии можно определить начало информационного байта. Аналогично, массив данных всегда предваряется байтом, в котором последний (младший) бит равен нулю ($FE, см. далее), так что устройство "знает", когда начинать отсчитывать данные.

Заметки на полях
Собственно, с тем фактом, что 32-битовое число адресует каждый байт индивидуально, и была связана необходимость принятия нового стандарта карт SD под названием SDHC (см. "Заметки на полях" ранее), т. к. максимальная емкость по рассматриваемому нами стандарту ММС и SD может составить теоретически лишь 4 Гбайта, а на практике, учитывая ограничения файловой системы FAT16, — лишь 2 Гбайта. Зато такая адресация позволяет читать информацию побайтно, начиная с любого места в памяти, что, учитывая назначение flash-карт, — явный анахронизм.

Наконец, последний байт в команде должен нести знамение циклического контрольного кода CRC (Cyclic Redundancy Code), причем собственно CRC занимает семь старших битов этого последнего байта, а младший (самый последний бит команды), всегда единица. CRC — не контрольная сумма LRC, о которой мы говорили в главе 5 в связи с hex-файлами, а более "крутая" штука, на которой здесь останавливаться нет смысла — в Интернете найдется множество ресурсов, где это понятие подробно разъясняется', в [22] есть пример вычисления CRC (правда, немного в ином формате), а в техническом описании карт ММС имеется довольно "навороченый" алгоритм расчета.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru