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





Перед подачей любой команды необходимо сбросить линию /CS. При записи следует учесть, что после передачи массива, если линия /CS находится в активном (сброшенном) состоянии, на время ожидания нельзя прекращать выдачу импульсов по линии SCK, до тех пор, пока операция, которая может продолжаться, как обычно, несколько миллисекунд, не будет закончена. Все время этой операции линия DO карты находится в нулевом состоянии, по завершении на этом выводе устанавливается высокий уровень. Можно следить просто за состоянием вывода (только следует пропустить байты CRC, которые также могут содержать нули), а можно за принимаемыми байтами, значение которых должно смениться с $00 на $FF. После этого карта готова к дальнейшей работе: можно опять установить линию /CS в единичное состояние. Далее мы поступим в соответствии с этим алгоритмом, но в принципе после приема байтов CRC можно установить линию /CS в единичное состояние, заняться своими делами и потом, сбросив /CS опять (иначе DO окажется в третьем состоянии), проверить состояние линии DO. С учетом всего сказанного, демонстрационные процедуры записи и чтения карты могут выглядеть, например, как в листинге 11.8.

Листинг 11.8
;=====—== Запись и чтение карты ММС Read_write_MMC:
cbi PORTB,CS ;CS = 1
9 Зак. 400
• ====== запись 512 байт ==========
clr AdrHH ;по адресу 0000 clr AdrHL. clr AdrLH clr AdrLL
ldi CMD,$58 ;CMD24=WRITE_BLOCK
rcall Send_command ; rcall out_com ;отклик можно послать наружу через UART для
контроля
ldi temp, $FE /начало блока данных
rcall WR_spi
clr count /count = 0 repeat_writel:
mov temp,count /заполняем блок последовательными числами
rcall WR_spi /очередной байт
inc count /по возрастающей от 0 до 256
brne repeat_writel /если count опять =0, 256 байт передали /повторим 256 байт
clr count /count = 0 repeat_write2:
mov temp,count /заполняем блок последовательными числами dec temp /'по убывающей от 256 до 0 rcall WR_spi /очередной байт dec count
brne repeat_write2 /если count опять = 0, 256 байт передали ser temp /$FF
rcall WR_spi /прием CRC
ser temp /$FF rcall WR_spi /прием CRC
ser temp /$FF rcall WR_spi / пустой байт wait_write: /теперь будем ждать ser temp /$FF rcall
WR_spi /пустой, байт
sbis PinB,MISO /ждем, пока не установится DO rjmp wait_write
;======== чтение 512 байт =======
clr AdrHH /по адресу 0000 clr AdrHL clr AdrLH clr AdrLL
clr ZH
ldi ZL,$60 /начальный адрес в SRAM
ldi CMD,$51 ;CMD17=READ_SINGLE_ BLOCK
rcall Send_command ;rcall out_com /отклик можно послать наружу через UART для
контроля wait_read: /ожидаем начало блока данных
ser temp ;$FF
rcall WR_spi /пустой байт
cpi temp,$FE /ожидаем байт $FE
brne wait_read
clr count /count = 0 repeat_readl: /первые 256 байт
ser temp ;$FF
rcall WR_spi /пустой байт
st Z+,temp /складываем в память первые 256 байт
dec count
brne repeat_readl /-clr count /=256 repeat_read2: /вторые 256 байт
ser temp ;$FF
rcall WR_spi /пустой байт
rcall out_com /посылаем сразу через UART
dec count
brne repeat_read2 / принимаем хвост CRC-
ser temp /$FF rcall WR_spi /CRC
ser temp /$FF rcall WR_spi /CRC
/окончание процедуры ser temp ;$FF rcall WR_spi /пустой байт
sbi PORTB,CS /CS = 1 /читаем записанное в память clr ZH
ldi ZL,$60 /первый адрес в SRAM
clr count /=256 repeat_out:
Id temp,Z+
rcall out_com /посылаем через UART
dec count
brne repeat_out ret



     
 

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