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





Нам здесь важно, что в режиме SPI для карты ММС по умолчанию механизм проверки CRC отключен, и почти для всех команд можно посылать значение последнего байта, равное $FF. Это сильно облегчает задачу, т. к. проверка значения CRC в принципе ориентирована на реализацию в аппаратной, а не программной форме (где она получается достаточно громоздкой), а такого модуля, у нас, естественно, нет. Потому считать CRC нам не придется, за одним важным исключением: самой первой должна идти команда сброса карты GOIDLESTATE (с кодом, равным нулю), в которой CRC обязательно. К счастью, его уже посчитали за нас: значение последнего байта для этой команды, с учетом CRC, будет равно 0x95, а вся команда полностью тогда будет представлять последовательность байтов:
$40, $00, $00, $00, $00, $95.

Перед любой командой, как показано на рис. 11.4, лучше подать не менее восьми импульсов по линии CLK при высоком уровне на линии DI -г- проще говоря, выдать $FF. После подачи любой команды записи или чтения карта посылает отклик (в SPI-режиме в большинстве команд— один байт), который иногда полезно проанализировать: отдельные биты в нем сигнализируют, например, об ошибке, если достигнут конец памяти, или о неправильно принятой команде. Перед посылкой отклика карта выжидает как минимум в течение восьми тактов, посылая единицы (байт, равный $FF), старший бит отклика всегда равен нулю.

Запись и чтение ММС
Карты ММС внутри устроены аналогично любым микросхемам flash-памяти — все пространство поделено на страницы, размер которых равен сектору на жестком диске (512 байт), и в документации называются блоками (или секторами). Как и на жестком диске, величину блока для операции чтения в принципе можно изменить (от 1 до 2048 байт), но эта операция имеет ограничения для операций записи, и в принципе для карт разных производителей несколько разные, потому проще смириться с тем, что читать и писать придется одинаково массивами по 512 байт (можно, правда, читать и писать сразу несколько таких массивов). Отличие ММС от разобранной ранее микросхемы AT45DB в том, что базовые операции чтения и записи производятся без явного участия буфера — непосредственно в память, поэтому для записи на карту в МК придется либо иметь буфер данных такого объема, либо получать данные извне (а при чтении — посылать "наружу"). Емкости встроенной в контроллер SRAM не всегда хватает для организации буфера размером 512 байт (напомним, что даже если емкость SRAM равна 512 байт, как в большинстве младших моделей Mega, то часть ее занята под Стек). Потому в принципе AVR или другие универсальные контроллеры — не очень удобное устройство для "общения" с картами памяти.

Однако положение облегчается следующим нюансом. Задав команду чтения или записи блока, ее всегда приходится выполнять до конца, подав нужное число тактовых импульсов для обмена блоком данных соответствующей длины. Но, согласно основному принципу работы интерфейса SPI, нет необходимости читать (или писать) все байты без перерывов: карта вполне может "повисеть", пока на линии CLK отсутствуют импульсы. Потому передачу данных можно прерывать на время обработки уже принятых байтов.

Среди команд ММС есть операции чтения и записи сразу нескольких блоков подряд, но мы будем применять только чтение и запись одного блока: WRITE_BLOCK (код 24) и READ_SINGLE_ BLOCK (код 17). Блок данных и при чте-нии, и при записи предваряется, как мы говорили, байтом $FE, перед которым (уже после подачи команды) может идти несколько пустых байтов $FF. После нулевого бита данные должны начинаться сразу: например, если вы подадите байт со значением $FD или $FC, то весь 512-байтовый массив окажется сдвинутым на один бит влево. Отметим, что при записи это соблюдается в случае команды для одного блока данных, для команды WRITEMULTIPLEBLOCK (код 25) этот байт должен быть равен $FC. По окончании блока данных карта выдаст отклик из двух байтов, содержащих CRC, который может быть проигнорирован.



     
 

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