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

342 Часть ///. Практическое программирование микроконтроллеров А VR товых импульсов для обмена блоком данных соответствующей длины. Но, соглас­ но основному принципу работы интерфейса SPI, нет необходимости читать (или писать) все байты без перерывов, - карта вполне может «повисеть», пока на линии CLK отсутствуют импульсы. Потому передачу данных можно прерывать на время обработки уже принятых байтов. Среди команд ММС есть операции чтения и записи сразу нескольких блоков под­ ряд, но мы будем применять только чтение и запись одного блока: WRITE_в1ocк (код 2 4 ) и READ_S INGLE_в1ocк (код 17) . Блок данных и при чтении, и при записи предваряется, как мы говорили, байтом $ FE, перед которым (уже после подачи ко­ манды) может идти несколько пустых байтов $ FF. После нулевого бита данные должны начинаться сразу - например, если вы подадите байт со значением $FD или $ FC, то весь 5 1 2-байтный массив окажется сдвинутым на один или два бита влево . Отметим, что при записи это соблюдается в случае команды для одного бло­ ка данных, для команды WRITE_МULTI PLE_в t ocк (код 2 5) этот байт должен быть равен $FC. По окончании блока данных карта выдаст отклик из двух байтов, содержащих CRC, который в нашем случае может быть проигнорирован. Перед подачей любой команды необходимо сбросить линию CS . При записи сле­ дует учесть, что после передачи массива, если линия CS находится в активном (сброшенном) состоянии, на время ожидания нельзя прекращать выдачу импульсов по линии SCK до тех пор, пока операция, которая может продолжаться, как обыч­ но - несколько миллисекунд, не будет закончена. Во время этой операции линия DO карты находится в нулевом состоянии, по завершении на этом выводе устанав­ ливается высокий уровень . Можно следить просто за состоянием вывода (только следует пропустить байты CRC, которые также могут содержать нули), а можно ­ за принимаемыми байтами, значение которых должно смениться с $ 0 0 на $ FF. После этого карта готова к дальнейшей работе - можно опять установить линию CS в единичное состояние. Далее мы поступим в соответствии с этим алгоритмом, но в общем случае после приема байтов CRC можно установить линию CS в единич­ ное состояние, заняться своими делами и потом, сбросив CS опять (иначе DO ока­ жется в третьем состоянии), проверить состояние линии DO. Ввиду объемности этих процедур, я их здесь не привожу. Демонстрационная про­ грамма целиком имеется в архиве по адресу, указанному во введении (файл rwMMC­ SPl .asm). По этой программе устройство должно выдать через UART сначала под­ ряд числа от 256 до нуля (вторая половина записанного блока), затем числа от нуля до 256 (первая половина блока, которую мы при чтении сохранили на время в SRAM). Еще раз отметим, что отформатированная (обычно в файловой системе FАТ 1 6) карта после такого издевательства будет, конечно, непригодна для обычных при­ менений. Однако восстановить ее не составляет труда: можно либо просто отфор­ матировать ее заново средствами Windows, либо применить одну из утилит форма­ тирования, которые доступны на сайтах производителей.

RkJQdWJsaXNoZXIy MTExODQxMg==