EE-335: подключение карт SD к процессорам Blackfin
Добавил(а) microsin
Карты памяти Secure DigitalTM (SD, SDHC) очень популярны как устройства хранения, и они широко применяются для современной потребительской электроники. Здесь приведен перевод апноута EE-335 [1], где описывается подключение таких карт к процессорам ADSP-BF52x Blackfin®. Описанный способ подключения подойдет и для других процессоров Blackfin. Некоторые процессоры Blackfin имеют на борту встроенную поддержку карт SD (интерфейс RSI, Removable Storage Interface; см. руководство по выбору процессоров Blackfin и таблицу подбора по параметрам [2]). Руководство EE-335 к таким процессорам не относится, оно описывает подключение карт SD к обычным процессорам Blackfin, не имеющим специальной аппаратной поддержки карт SD/SDHC.
Сегодня карты SD используются почти везде - в мобильных телефонах, PDA, смартфонах, цифровых фото- и видеокамерах, плеерах музыки и видео, пейджерах, электронных игрушках, органайзерах. Эти основанные на технологии FLASH карты памяти разработаны с учетом требуемой безопасности, емкости, скорости работы и условий применения в новых приложениях. Формат карт SD для портативных устройств был разработан компаниями Matsushita, SanDisk и Toshiba. В стандарте карт включен механизм защиты прав, который совместим со стандартом защиты SDMI.
Карты SD поддерживают 2 режима работы – последовательный (serial mode), который совместим с интерфейсом SPI (Serial Peripheral Interface) [3], известный как "режим SPI" (SPI mode), и параллельный (parallel mode), который общеизвестен как "режим SD" (SD mode). Режим SPI удобен тем, что позволяет беспрепятственно подключить карты SD ко многим контроллерам или DSP, поскольку большинство из них имеют встроенную аппаратную поддержку SPI; но режим SPI имеет ограниченный функционал. Для режима SD требуется наличие специального выделенного контроллера (или сложного интерфейса); но для такого подключения карт доступен полный набор возможностей стандарта. В этом документе обсуждаются различные механизмы для подключения карт SD к процессорам SD, такие как последовательный режим через порт SPI, и параллельный режим разными способами, два из которых используют параллельный периферийный интерфейс Blackfin (Parallel Peripheral Interface, PPI), и один интерфейс асинхронной памяти Blackfin (Asynchronous Memory Interface, AMI).
В последующих секциях этого документа обсуждаются фундаментальные понятия, формат команд и сам интерфейс. Код приложения, который прилагается в ZIP-архиве [6], демонстрирует подключение карт SD к процессорам Blackfin. В программе реализованы различные команды, используемые для конфигурирования и работы с картами памяти SD. Примеры кода показывают работу во всех режимах.
[Карты памяти SD: общие понятия]
Карты SD разработаны как интерфейс к памяти FLASH, поддерживающий последовательный и произвольный доступ к памяти. Данные доступны через выделенный последовательный и параллельный интерфейсы, оптимизированные для быстрой и надежной передачи данных. Предусмотрена возможность объединения карт в пакет соединением их контактов.
Рис. 1. Как выглядят карты SD.
Хост (DSP, к которому подключена карта SD) управляет обменом данными по шине карты. Система памяти карты SD определяет, какой из 2 альтернативных протоколов использовать: SPI или SD. Хост может выбрать один из этих двух режимов. Карта детектирует режим (SPI или SD) по запросу хоста, когда принимается команда сброса, и далее ожидается, что весь обмен будет идти в одном и том же, выбранном режиме.
Для системы памяти карты SD определены 2 режима работы (относящиеся к хосту и к карте):
• Режим идентификации карты. Хост появляется в этом режиме после сброса, и когда он определил наличие новой карты на шине. Карты в этом режиме находятся после сброса, и находятся в нем, пока не поступит команда SEND_RCA (CMD3). • Режим передачи данных. Карты входят в этот режим после первой публикации своего RCA. Хост входит в этот режим поле идентификации всех карт на шине.
У карт SD для подключения имеется 9 контактов, из которых 4 предназначены для шины данных. Карты micro-SD поддерживают интерфейс из 8 контактов, где также 4 сигнала отведены под шину данных. В режиме SD для передачи и приема используется 4 сигнала данных, а режиме SPI для данных используется 2 контакта из четырех (один для приема, другой для передачи).
Максимальная рабочая частота передачи данных может достигать 25 МГц (в режиме по умолчанию) или до 50 МГц (режим высокой скорости, high-speed mode). Данные, которые записаны в любом из режимов, могут быть впоследствии прочитаны хостом в любом режиме. Рабочий диапазон напряжений питания находится в пределах 2.7V .. 3.6V, и максимальный объем карты может быть от 4 мегабайт (это очень старые карты, сейчас карты на 512 мегабайт найти трудно) до 4 гигабайт для карт SD, и до 16 гигабайт и более для карт SDHC (SD High Capacity). Поддерживаемый диапазон напряжений питания определяется в процессе инициализации/идентификации содержимым регистра CSD.
[Как устроена карта SD]
Все узлы карты SD тактируются от её внутреннего тактового генератора. Узел драйвера интерфейса синхронизирует данные (DAT0-DATx) и сигналы команды (CMD) от внешнего синхросигнала CLK, согласовывая логику с внутренними тактами.
Для идентификации одной карты SD в пакете карт используется регистр идентификации карты (card identification register, CID) и регистр относительного адреса карты (relative card address register, RCA). Специфический для карты регистр данных (card-specific data register, CSD) содержит рабочие параметры разных типов.
У карты есть своя схема детектирования появления напряжения питания (power-on detection unit). Имеется защита от короткого замыкания при установке и извлечении карты, когда система карты получает питание и включается в работу. Напряжение программирования FLASH генерируется внутри карты.
[Сигналы интерфейса карты SD]
Базовая концепция подключения карты SD - передавать данные через минимальное количество сигналов. Ниже приведено краткое описания сигналов в режимах SD и SPI.
Режим SD
• CLK: такты, генерируемые хостом для карты. На каждом такте этого сигнала выполняется передача одного бита команды и 4 бита данных. Частота тактов может изменяться от 0 до максимально допустимой. • CMD: двунаправленный сигнал для команды/ответа (command/response). Этот двунаправленный сигнал используется для инициализации карты и команд передачи данных. Сигнал CMD имеет 2 рабочих режима: открытый сток (open-drain) для режима инициализации, и режим двунаправленного, двухтактного драйвера (push-pull) для быстрой передачи команды. Команды передаются от мастера шины SD в карту, и хосту нужны ответы от карты. • DAT0 – DATx (x = 0, 3 или 7): двунаправленные каналы для данных. Сигналы DAT работают в режиме push-pull. Только одна из карт, или только хост может получить управление сигналами в любой момент времени.
Режим SPI
• CS/: сигнал выборки для карты, управляемый хостом. Активным является уровень лог. 0, этот уровень выбирает определенную карту SD на шине (однако часто карта только одна). • CLK: сигнал тактов для карты, генерируемый хостом. • MOSI: (Master Out Slave In, выход хоста и вход карты) последовательный сигнал данных в направлении от хоста к карте. • MISO: (Master In Slave Out, вход хоста и выход карты) последовательный сигнал данных в направлении от карты к хосту.
Цоколевка интерфейса карты. В таблице 1 приведено описание 9-выводного интерфейса карты SD.
Таблица 1. Выводы интерфейса карты SD.
Вывод
Имя
Описание
1
DAT3, CD или CS/
Сигнал данных 3 (DAT3), старший бит (MSB) в режиме SD, также используется как сигнал детектирования наличия карты; выборка карты (chip select, CS/) в режиме SPI.
2
CMD или MOSI
Команда (CMD) в режиме: SD mode; Master Out Slave In (MOSI) в режиме SPI.
3
VSS
Земля, общий провод (GND), минус питания.
4
VDD
Напряжение питания.
5
CLK
Внешний тактовый сигнал.
6
VSS
Земля, общий провод (GND), минус питания.
7
DAT0 или MISO
Сигнал данных 0 (DAT0), младший бит (LSB) в режиме SD; Master In Slave Out (MISO) в режиме SPI.
8
DAT1
Сигнал данных 1 (DAT1).
9
DAT2
Сигнал данных 2 (DAT2).
Дополнительные сигналы данных (DAT1 – DAT3) при включении питания работают как входы. Они начинают работать как сигналы данных DAT после выдачи команды установки ширины данных SET_BUS_WIDTH (ACMD6). Кроме того, сигнал CD является входом при включении питания, с наличием верхнего подтягивающего резистора (pull-up) на 50 кОм (может использоваться для детектирования подключения карты или выбора режима SPI). Этот pull-up должен быть отключен пользователем во время обычной передачи данных выдачей команды SET_CLR_CARD_DETECT (ACMD42).
[Регистры карты SD]
Для карты SD определены 8 регистров: CID, RCA, DSR, CSD, SCR, OCR, SSR и CSR. Некоторые из них описаны в таблице 2:
Таблица 2: Регистры карты SD.
Имя
Ширина
Описание
CID
128
Card Identification Number, идентификационный номер карты.
RCA
16
Relative Card Address, относительный адрес карты. Локальный адрес карты в системе, динамически предложенный картой и подтвержденный котом во время инициализации.
CSD
128
Card-Specific Data: данные, относящиеся к карте в разных рабочих условиях.
OCR
32
Operation Conditions Register, регистр результатов операции.
CSR
32
Card Status Register, регистр состояния карты.
[Подключение к процессору Blackfin в режиме SPI]
Реализация SPI использует подмножество определений протокола карты памяти SD и набора команд. Достоинство этого режима в том, что можно использовать стандартный, широко распространенный интерфейс SPI для хоста. Недостаток режима SPI в том, что быстродействие получается ниже, чем в режиме SD - из-за того, что для каждой карты используется 1 разряд данных и сигнал аппаратной выборки CS.
SPI процессора Blackfin состоит из 4 сигналов, из которых 2 это данные (MOSI и MISO), 1 сигнал выборки устройства (SPISS/), и 1 сигнал тактов (SCK). SPI является полнодуплексным синхронным последовательным интерфейсом, поддерживающим режим мастера (master mode, главное устройство), режим подчиненного устройства (slave mode), и режим наличия нескольких мастеров на шине (multi-master environment). SPI-совместимая реализация также поддерживает программируемые скорости и разные варианты полярности и фазы тактов. Подробнее см. [4].
Интерфейс SPI в сущности это регистр сдвига, который последовательно передает и принимает биты данных, по одному биту за такт сигнала SCK. Данные передаются сразу в обоих направлениях, из устройства SPI и в него, с использованием регистра сдвига. Сигнал SCK синхронизирует сдвиги и выборку данных на двух последовательных сигналах данных (MISO и MISO).
Порт SPI может быть сконфигурирован как SPI master (когда он генерирует сигналы SCK и SPISS/), или как SPI slave (когда он принимает сигналы SCK и выборки, поступающие снаружи). Когда SPI сконфигурирован как master, он управляет данными на выводе MOSI, и принимает данные на выводе MISO. Также он управляет сигналами выборки подчиненных устройств, и предоставляет такты последовательных бит SCK. SPI процессора Blackfin поддерживает 4 функциональные режима, определяемые комбинациями установки настроечных бит CPOL (clock polarity, полярность тактов) и CPHA (clock phase, фаза тактов). В режиме системы SPI multimaster или multislave выводы данных (MOSI и MISO) могут быть сконфигурированы как выходы с открытым стоком (open drain), что при коллизии на шине предотвращает возможное повреждение выходных драйверов. Бит WOM управляет этой опцией. Подробное описание работы SPI Blackfin см. в соответствующем аппаратном руководстве процессора Blackfin Processor Hardware Reference Manual. Для процессора ADSP-BF538 см. также перевод этой документации по интерфейсу SPI [4].
Протокол карты SD: команды и ответы на них. Интерфейс SPI выбирается первой командой сброса после включения питания (CMD0), и далее это не может быть изменено, пока карта запитана.
Канал SPI байт-ориентированный. Каждая команда или блок данных состоит из 8 бит, и эти данные выровнены байтами по сигналу выборки CS/ (т. е. длина бит нацело делится на 8 тактов данных). Карта начинает отсчет тактов SPI при выдаче активного уровня (лог. 0) сигнала CS/. Каждая команда или токен данных (байт) выровнена по границе блока из 8 тактов. Сообщения SPI состоят из токенов команды, ответа и блока данных.
Хост начинает каждую транзакцию на шине выдачей активного лог. 0 на сигнале выборки CS/. Выбранная карта всегда отвечает на команду. Когда карта встречается с проблемой поиска данных при операции чтения, она пошлет ответ, означающий ошибку (error response), который заменит собой ожидаемый блок данных. Дополнительно каждый блок данных, отправляемый в карту операциями записи, будет сопровождаться ответом с токеном подтверждения данных (data response token).
Для карт памяти стандартной емкости (размер у стандартных карт не более 4 гигабайт; это не относится к картам SDHC), блок данных может быть настолько велик, как размер одного записываемого блока данных, или настолько мал, как 1 байт. Частичные блоковые операции чтения/записи разрешаются настройкой опций карты через регистр CSD.
Каждая команда карты SD, переданная по шине, защищена битами контрольной суммы CRC. В режиме SPI карта памяти SD предоставляет режим CRC ON, который разрешает построение систем с надежными поставщиками данных, чтобы исключить аппаратную или программную реализацию функций генерации и проверки CRC. В режиме CRC OFF биты CRC команды определены как "не имеет значения" (don’t care) для передатчика, и они игнорируются приемником.
По умолчанию интерфейс SPI инициализирован в режиме CRC OFF. Однако команда сброса RESET (CMD0) используется для переключения карты в режим SPI, что принимается картой, когда она в режиме SD, и, таким образом, должна иметь достоверное поле CRC. Поскольку у команды CMD0 нет аргументов, то содержимое всех полей, включая поле CRC, является константой, и не нуждается в вычислении во время выполнения кода. Допустимая команда сброса следующая: 0x40, 0x0, 0x0, 0x0, 0x0 и 0x95. После того, как карта переведена в режим SPI, проверка CRC для всех команд, включая CMD0 будет выполняться в соответствии с настройкой CMD59 (CRC_ON_OFF).
Формат команды. Команды состоят из 6 бит. Передача команды всегда начинается с левого, самого значащего бита (MSB) последовательности бит, соответствующей кодовому слову команды. Формат следующий:
Таблица 3. Формат команды в режиме SPI.
Позиция бит
47
46
[45:40]
[39:8]
[7:1]
0
Ширина (бит)
1
1
6
32
7
1
Значение
0
1
x
x
x
1
Описание
Стартовый бит
Бит передачи
Индекс команды
Аргумент
CRC7
Последний бит
Формат ответа. Несколько типов токенов ответа (response token R1, R1b, R2, R3 и R7) фиксированы для каждой команды. Ответ передается картой старшим битом (MSB) вперед. Здесь рассматривается ответ R1, поскольку он используется чаще всего.
Токен ответа R1 отправляется картой в ответ на каждую команду, кроме команды SEND_STATUS. Токен ответа R1 имеет длину 1 байт, и у него всегда старший бит (MSB) установлен в 0. Другие биты показывают наличие ошибки, если в битах присутствуют единицы. Ниже показана структура формата R1. Имеется в виду, что флаги определены следующим образом:
• In idle state (ожидание): карта находится в состоянии ожидания, и в ней идет процесс инициализации. • Erase reset (сброс стирания): перед выполнением была очищена последовательность стирания (erase sequence), потому что была принята последовательность команд out-of-erase. • Illegal command (недопустимая команда): была детектирована недопустимая команда. • Communication CRC error (ошибка обмена): не прошла проверка CRC последней команды. • Erase sequence error (ошибка стирания): произошла ошибка в последовательности команд стирания данных. • Address error (ошибка адреса): в команде был использован неправильно выровненный адрес, который не соответствует длине блока. • Parameter error (ошибка параметра): аргумент команды (например, адрес или длина блока) вышел за допустимые для этой карты пределы.
Рис. 2. Формат ответа токеном R1 в режиме SPI.
Чтение и запись. Поддерживаются операции чтения одного блока (single block read) и нескольких блоков (multiple block read), команды CMD17 или CMD18. При получении допустимой команды чтения карта ответит токеном response, за которым будет следовать токен данных. Для карт стандартного объема (не SDHC) размер токена данных определяется длиной блока, установленный командой SET_BLOCKLEN (CMD16). Для карт большой емкости (high-capacity card, карты SDHC?), размер данных в токене данных фиксирован на 512 байтах, независимо от длины блока, установленного CMD16.
Рис. 3. Чтение и запись данных в режиме SPI.
Поддерживаются операции записи одного блока (single block write) и нескольких блоков (multiple block write). При получении допустимой команды записи (CMD24 или CMD25) карта ответит токеном response, и будет ждать блок данных, посланный хостом.
Все байты данных отправляются старшим битом (MSB) вперед. Передачи данных, связанные с командами чтения и записи (токены данных) имеют длину от 4 до 515 байт, и у них следующий формат (в случае передач одним блоком):
• Первый байт (Start Block, начало блока): 1111 1110 • Байты 2 .. 513 (в зависимости от длины блока): User Data, данные пользователя • Последние два байта: 16-битная CRC
Каждый блок данных, записанный в карту, подтверждается токеном data response, как показано ниже:
Рис. 4. Токен подтверждения данных (data response token) в режиме SPI.
Токен data response имеет длину 1 байт, и в нем содержится 3 бита для индикации состояния (статуса) записи. Значение бит следующее:
010 – данные приняты 101 – данные отклонены из-за ошибки CRC 110 – данные отклонены из-за ошибки записи
Если операция чтения потерпела неудачу, и карта не может предоставить требуемые данные, то вместо данных будет отправлен токен ошибки данных (data error token). Этот токен имеет длину 1 байт, и его формат следующий:
Рис. 5. Токен ошибки данных в режиме SPI.
Аппаратный интерфейс SPI. В режиме SPI для подключения карты используется 4 сигнала (SPISCK, SPIMOSI, SPIMISO и SPISEL1/). Тактовый сигнал SPISCK сопровождает данные, которые выводятся через SPIMOSI, и принимаются через SPIMISO. Хост посылает команды и данные карте SD через вывод SPIMOSI, и принимает подтверждения и данные от карты через SPIMISO. Сигнал выборки (chip select, SPISEL1/) разрешает работу карты во время передачи данных и команд.
Рис. 6. Аппаратный интерфейс SPI для подключения карты SD к процессору Blackfin.
Сигнал выборки также первоначально используется для перевода карты в режим SPI. Если сигнал выборки карты CS/ (у Blackfin это SPISEL1/) находится в лог. 0, когда передается команда CMD0, то карта конфигурируется для режима SPI. В режиме SPI данные передаются блоками бит по 8 тактам SPISCK.
Алгоритм кода приложения в режиме SPI. Программа начинает работу следующим образом:
1. После подачи питания сигнал SPISEL1/ переводится в неактивное состояние (лог. 1). Это запретит работу карты.
2. Выдается как минимум 80 пустых тактов для инициализации карты SD.
3. Сигнал SPISEL1/ переводится в лог. 0, и передается команда CMD0. В этой точке режим карты меняется из режима по умолчанию SD на режим SPI.
Рис. 7. Инициализация, за которой идет команда CMD0.
Рис. 8. Команда CMD0.
4. Ожидание ответа R1 от карты. Ответ R1 должен быть 0x01. Любое другое значение показывает наличие ошибки, тогда может потребоваться повторная инициализация.
5. После ответа R1 выдается команда CMD1. Ответ R1 на эту команду должен быть 0x00. Любой другой ответ показывает наличие ошибки.
6. После корректного ответа R1 на команду CMD1 может быть осуществлена передача данных. Имейте в виду, что пока не будет успешно выполнена команда CMD1, скорость SPI (частота тактов SPISCK) должна быть меньше 400 кГц. Перед началом передачи данных скорость SPI может быть увеличена.
7. Теперь можно передавать команды, такие как установка длины блока.
8. Для чтения/записи карты могут быть также выданы соответствующие команды.
Рис. 9. Запись данных.
Рис. 10. Чтение данных.
9. Когда выключается питание, делается проверка, что карта в состоянии готовности, и сигнал SPISEL1/ переводится в неактивное состояние (лог. 1) перед отключением от карты источника питания.
[Подключение к процессору Blackfin в режиме SD/MMC]
Пока этот раздел документации не переведен за ненадобностью.
[Проверки CRC]
CRC предназначена для защиты команд, ответов, передач данных карты SD от ошибок, которые могли бы возникнуть на шине карты. Код проверки CRC генерируется для каждой команды, и проверяется для каждого ответа на сигнале CMD (параллельный режим). Для блоков данных генерируется один код CRC на передаваемый блок. Алгоритмы генерации и проверки показаны ниже.
Вычисление CRC7. Проверка CRC7 используется для всех команд, для всех типов ответов, кроме R3, и для регистров CSD и CID. CRC7 дает 7-битное значение, вычисляемое следующим образом:
Вычисление CRC16. В случае использования сигналов DAT используется CRC16 для защиты полезной нагрузки в режиме передачи блока. CRC16 дает 16-битное значение, вычисляемое следующим образом: