Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
404
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

8. Когда кадровая синхронизация будет достигнута, счетчик кадров начнет увеличиваться.

9–10. Когда счетчик достигнет значения 8, последнее слово нужно сохранить, как длину кадра.

if (k==8) N=Frame.Words[1];

11.Упаковка байтов в кадр продолжается до тех пор, пока счетчик не достигнет предела 7+4N. Выполнение этого условия свидетельствует о завершении приема кадра и готовности данных к использованию. Остальные блоки относятся к использованию принятых данных.

12.Обнуление счетчика байт необходимо для подготовки приема следующего кадра.

14–16. В цикле формируются и индицируются первые четыре числа из кадра. Подробно рассмотрим только 15-ый блок

snprintf(S,4,"%3.1f",Frame.Floats[i+2]);

Укажем также, что позиция на индикаторе для каждого числа равна 4i. Повтор в цикле таких команд даст верхнюю строку индикатора в формате

x.x x.x x.x x.x

3.24 Обмен данными с картой памяти Secure Digital

3.24.1 Задание

Разработать библиотеку функций взаимодействия с картами памяти типа SD/MMC. Проверить подпрограммы путем записи и считывания блока объемом 512 байт.

3.24.2 Общие сведения о карах FLASH-памяти SD/MMC

Карты FLASH-памяти SD (Secure Digital) и MMC (MultiMedia Card)

чрезвычайно распространены в компьютерной технике. Они служат накопителями информации в цифровых фотоаппаратах и других мобильных устройствах. Запоминающие устройства SD/MMC отличаются малыми габаритами, высокой надежностью хранения данных, сравнительно низкой ценой и высокой емкостью (емкость может превышать 8 Гбайт). Эти достоинства делают их удобным для применения и в средствах промышленной автоматики. Сегодня MMC встречается редко, а SD часто применяются в модификации microSD и miniSD. Использование простого переходника делает их абсолютно совместимыми с SD/MMC.

Карты памяти SD/MMC поддерживают два интерфейса: специальный интерфейс MultiMedia Card, использующий шесть проводников, не считая контактов питания, и интерфейс SPI (4 проводника). Применение последнего предоставляет меньше возможностей, однако позволяет решать все необходимые задачи чтения и записи данных. Здесь ограничимся описанием только интерфейса SPI. Более того, будут подробно рассмотрены лишь основные, совершенно необходимые команды. Остальные предлагается изучить самостоятельно по многочисленным инструкциям. Реализация функций взаимодействия с картами памяти оказывается громоздкой. Поэтому кроме алгоритмов будет приведен полный листинг программы.

239

При составлении данного описания руководствовались в основном документацией фирмы Sandisk, примером, предложенным фирмой NXP, а

также интернет-ресурсом [http://www.dharmanitech.com/]

3.24.3 Команды SD/MMC

Каждый цикл обмена с картой памяти должен начинаться с установки активного низкого уровня на линии CS. Высокий уровень может быть установлен после завершения одной команды, а может удерживаться неизменно активным в течение нескольких команд.

Воздействие на карту выполняется командами одинакового формата (см. рисунок 3.24.1 вверху). Каждая команда имеет длину 6 байт. Первый байт состоит из битов 01 и шестиразрядного кода команды, далее следует 32разрядный аргумент, уточняющий действие команды, затем циклический код контроля ошибок CRC7, дополненный в конце единичным битом. Основные команды сведены в таблицу 3.24.1.

На большинство команд контроллер карты отвечает одним байтом, обозначенным на рисунке 3.24.1, как «ответ на команду». Ответ чаще всего приходит с некоторой задержкой, поэтому требуется организовать циклический опрос карты в ожидании ответа. Байт ответа имеет ненулевой старший разряд и содержит коды ошибок. В большинстве случаев он должен быть равен нулю.

Напомним, что в отличие от I2С, при обмене по SPI только ведущий может генерировать тактовые сигналы. Причем во время приема на линии передатчика MOSI (контакт DI карты) должен быть установлен высокий уровень. Поэтому для получения ответа необходимо повторять отправку байта 0xFF с одновременным приемом байта.

Внимание! После получения ответа и до формирования очередной команды необходимо выполнить холостую передачу байта 0xFF (восемь тактовых сигналов при ).

3.24.4 Процедура инициализации карты

При выполнении процедуры инициализации тактовая частота приемопередатчика SPI не должна превышать 400 кГц.

После включения питания карта находится в режиме интерфейса Multimedia Card. Для перевода в режим SPI требуется установить высокий уровень на линии CS и подать не менее 74 тактов на линии CLK (то есть не менее десяти переданных байт). Далее выполнить программный сброс, подав команду CMD0 с кодом (0x40 0x00 0x00 0x00 0x00 0x95). Здесь 0x95 —

циклический код CRC7, рассчитанный заранее (см. приложение). Дождаться ответа 0x01, показывающего, что карта находится в режиме ожидания.

Инициализация карты начинается с команды CMD1 с кодом (0x41 0x00 0x00 0x00 0x00 0xFF). В режиме SPI по умолчанию контроль CRC7 картой не производится (хотя при необходимости может быть включен), поэтому здесь и далее вычислять код CRC7 нет необходимости. Можно передавать произвольный байт, заканчивающийся единицей (здесь 0xFF).

240

Формат команды

47

46

45

0

1

Код команды

40

 

S

2

R

 

M

 

39

 

R

2

R

 

M

 

Аргумент

8

7

1

0

Аргумент

 

CRC7

1

Ответ на команду

Подтверждение пакета данных

7

6

 

5

 

4

 

 

AR

 

R

A

 

0

 

D

 

 

D

 

R

ER

R

 

P R

 

 

ER

A

R

ER

 

 

E

 

Ошибочный параметр

 

 

 

 

 

Ошибка адреса

 

 

 

 

Ошибка при стирании

 

 

 

3

 

2

 

 

1

 

0

7

 

C

 

L

 

RA

 

E

 

R

R

IL

O

 

 

C

 

 

E

E

IDL

 

E

R

C

M

R

S

 

 

 

 

 

 

 

 

 

Ошибка

 

 

 

 

 

Ожидание

 

CRC

 

 

 

 

 

 

Стирание прервано

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Недопустимая команда

 

5

4

3

1

0

 

 

0

STATUS

1

 

 

 

Код результата:

 

110

– ошибка записи,

101 – ошибка CRC,

010

– данные приняты

 

 

Сообщение об ошибке

 

 

7

6

5

 

4

3

2

1

0

 

 

 

 

CK

E

C

CC R

RR

0

0

0

L

RANG

EC IL

 

F

E

 

 

 

 

O

 

A

R

E

 

 

Блокировка

 

 

Ошибка

 

 

 

записи

 

 

 

Ошибка контроллера

 

 

 

 

 

 

 

 

 

Адрес вне диапазона

 

Ошибка коррекции данных

Рисунок 3.24.1 – Форматы команды и основных ответных сообщений карт SD/MMC

DI

 

 

 

 

 

 

 

 

 

0x51

Аргумент

CRC7

 

Повторяется при пакетном чтении

 

 

 

 

 

 

 

Маркер блока данных:

 

 

 

 

 

 

 

 

 

DO

 

 

 

 

 

 

0xFС – начало блока (при пакетной записи)

 

 

 

 

 

 

 

 

 

Ответ

Маркер

Данные

Данные

CRC16

0xFD – конец блока (далее блок не передается)

 

 

 

 

 

 

 

0xFE – начало блока

Холостые

 

 

 

 

 

 

 

8 тактов

 

 

 

 

 

 

 

 

 

CLK

 

 

 

 

 

 

 

 

 

DI

 

 

 

 

 

 

 

 

 

0x58

Аргумент

CRC7

Маркер

Данные

Данные

CRC16

 

Повторяется при пакетной записи

 

 

 

 

 

 

 

 

DO

 

 

 

 

 

 

 

Занят

Готов

 

 

Ответ

 

 

 

 

Подтв.

0x00

0xFF

 

 

 

 

 

 

 

 

 

Холостые

 

 

 

 

 

 

 

 

 

8 тактов

CLK

CS

Рисунок 3.24.2 – Временные диаграммы обмена данными с картой памяти SD/MMC (вверху — чтение, внизу — запись)

241

Таблица 3.24.1 – Основные команды карты памяти MMC/SD

 

Выполняемая

Код с

 

Ответ при

Длина

Обознач.

учетом

Аргумент

отсутствии

операция

пакета, байт

 

ст. битов

 

ошибок

 

 

 

 

CMD0

Режим

0x40

0x01

ожидания

 

 

 

 

 

CMD1

Инициализа-

0x41

0x00

ция

 

 

 

 

 

CMD12

Прервать

0x4C

0x00

чтение

 

 

 

 

 

CMD16

Установка

0x50

Размер

0x00

размера блока

блока

 

 

 

 

CMD17

Чтение блока

0x51

Адрес

0x00

1…512 +

+ 2 (CRC16)

 

 

 

 

 

 

Чтение

 

 

 

Не

CMD18

нескольких

0x58

Адрес

0x00

ограничена

 

блоков

 

 

 

 

 

 

 

 

CMD24

Запись блока

0x58

Адрес

0x00

512 +

+2 (CRC16)

 

 

 

 

 

 

Запись

 

Адрес

 

Не

CMD25

нескольких

0x59

первого

0x00

ограничена

 

секторов

 

сектора

 

 

 

 

 

Так как инициализация занимает около 150 мс, команду CMD1 с последующим ожиданием ответа необходимо повторять несколько раз. Причем здесь идет речь не просто о циклической передаче байта 0xFF, сопровождающейся приемом ответа, а о периодическом повторе самой команды. Рекомендуется после подачи команды опрашивать карту примерно 250 раз (как раз примерно 150 мс при кГц), после чего повторить команду и опрос. И так до тех пор, пока, наконец, не поступит ответ 0x00. Ответ, скорее всего, будет получен со второй попытки.

Когда инициализация завершена, рекомендуется увеличить скорость передачи данных до максимальной, что для LPC2148 составляет 7,5 Мбит/с.

3.24.5 Чтение и запись данных

Чтение и запись информации осуществляется блоками. При чтении размер блока может быть произвольным от 1 до 512 байт. При записи он фиксированный и составляет 512 байт, что соответствует одному сектору в логической организации накопителя. Размер блока устанавливается командой CMD16 (код с учетом старших бит 0x50). Собственно размер задается младшими байтами аргумента (шестнадцатеричные значения 0x0001– 0x0200). Как обычно после команды выполняется опрос (передача байта 0xFF) и ожидание ответа 0x00. Цикл чтения и записи показан на временных диаграммах (рисунки 3.24.1, 3.24.2).

242