Ревич, Ю.В. Программирование микроконтроллеров 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, либо применить одну из утилит форма тирования, которые доступны на сайтах производителей.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==