Как стать автором
Обновить

Комментарии 39

SPI это здорово. А может в контексте SD карт всё же попробовать реализовать полноценный SDIO?

Пока таких планов нет. В случае необходимости реализации SDIO, я бы лучше обратил внимание на eMMC. У eMMC есть возможность установки на плату с помощью припаивания, а не с помощью разъема.

С eMMC понятно, это подходит (и уже давно используется) для набортного несъемного накопителя. Но часто нужна именно съемная карта. И для SD карт их родной SDIO, хотя бы на уровне физики, как это сделано в старших семействах микроконтроллеров STM32F тоже интересен. Особенно, если его можно будет подключить к чему-то другому.

Эм, если вы уже используете eMMC, то в чём проблема использовать вместо 8-битной шины 4-битную? (Или 1-битную, если кто-то экономит на выводах/соединениях.) Протокол то один и если использовать только базовые команды, то можно работать и с SD, и с eMMC. Более того, всегда можно спросить у устройства, какие размеры шины оно поддерживает.


JEDEC Standard No. 84-A441, page 15:


DAT0-DAT7: These are bidirectional data channels. The DAT signals operate in push-pull mode. Only the card or the host is driving these signals at a time. By default, after power up or reset, only DAT0 is used for data transfer. A wider data bus can be configured for data transfer, using either DAT0-DAT3 or DAT0-DAT7, by the MultiMediaCard controller. ...

Там же, стр. 18:


data: data can be transferred from the card to the host or vice versa. Data is transferred via the data lines. The number of data lines used for the data transfer can be 1(DAT0), 4(DAT0-DAT3) or 8(DAT0-DAT7)

ну и


For each data lines, data can be transferred at the rate of one bit (single data rate) or two bits (dual data rate) per clock cycle.

Я уже плохо помню протокол, но, если не ошибаюсь, устройство всегда стартует в SDIO с однобитной шиной. Сбрасываем устройство, получаем паспорт, переключаемся на максимальную из поддерживаемых контроллером и устройством. И будут работать и древние MMC (1-битная шина) и MMCPlus (1, 4 и 8), а также современные SD (1 и 4) и eMMC (1, 4 и 8).

На оперкорес было готовое ядро, которое у нас патрировали на AXI шину, с DMA, правда на с транзакцией максимум на 8 килобайт.

AXI4 или AXI-Stream? Сколько скорость получилась?

AXI4, изначально делался Stream но потом сделали AXI4 в пользу простоты программирования.
Железо было на стандарт 3.3V по нему максимальный клок 50Mhz ну и 4битная шина. Расчетная должна быть около 200 Mbit/s где так оно и получалось в пике, ну а так а вычетом времени на посыл команды старта отсановки, поменьше выходила но точных цифр не приведу, я это года два назад тестировал.
При использовании FPGA нет смысла использовать SD-карту в режиме SPI

Тут дело не совсем в FPGA. Вроде как это замысел создателей стандарта SD-карточек: режим SPI — это единственный открытый (бесплатный) вариант работы с SD-карточкой, а остальные все закрытые, т.е. требуют либо покупки лицензий, либо покупки IP-корок, либо реверс-инжиниринга их проприетарного протокола. В то же время многие производители микроконтроллеров включают подобные ядра в свои продукты, в результате конечному пользователю не приходится заморачиваться.
Создали стандарта все равно немного жадные. В бесплатной документации нет временных диаграммы работы по шине SPI, на которые удобно ориентироваться при разработке.
Картинка


Сейчас обнаружил, что вышла новая версия спецификации. Карты размером от 2 Тб до 128 Тб включительно вынесли из группы SDXC и создали для них новую группу SDUC (Ultra Capacity SD Memory Card). Карты SDUC режим SPI не поддерживают. Видимо чтобы не тащить протокол, которым мало кто будет пользоваться.

не очень понял из кода: использовались команды чтения/записи по 1 сектору или по много подряд? во 2 случае достаточно задать начальный сектор и лить данные сколько надо.

Подряд по несколько блоков.
При чтении тут мультиплексор выбора команды. Код команды определен в SDPackage.vhd
При записи тут мультиплексор выбора команды. Код команды определен в SDPackage.vhd

спасибо. правильно ли я понимаю, что ваши измерения скоростей сделаны на кусках по 8 килобайт? возможно, если вы возьмёте например 8 мегабайт, вы приблизитесь к 25 мегабитам (исходя из скорости SPI-интерфейса), как минимум на чтении (т.к. скорость записи может ограничиваться неидеальностью SD-карты как микро-пародии на SSD :))

Да, объем данных, читаемых подряд, был равен 8кБайт. С увеличением размера читаемых данных, я думаю скорость на чтение вырастет. Проблема только в ограниченном объеме памяти в ПЛИС. Я хотел попробовать работу с 32 блоками (16кБайт), но это потребовало бы модификацию командного уровня. В результате мне стало жалко 4 BRAM на прием, 4 BRAM на передачу и своего времени (Размер одного BRAM в ПЛИС Zynq равен 4кБайт). От идеи я отказался.

ну чтоб замерить скорость чтения, данные необязательно сохранять :)

Скорей всего здесь это уже никому не интересно, но есть в спецификации такой кусоче:
It is an obvious requirement that the clock must be running for the SD Card to output data or response
tokens. After the last SD Card bus transaction, the host is required to provide eight (8) clock cycles for
the card to complete the operation before shutting down the clock. Following is a list of various SD
Card bus transactions:
− A command with no response—eight clocks after the host command end bit.
− A command with response—eight clocks after the card response end bit.
− A read data transaction—eight clocks after the end bit of the last data block.
− A write data transaction—eight clocks after the CRC status token.

То есть после исполнения команды и получения ответа, надо выдавать ещё 8 «пустых» клоков. Обычно это не требуется, и многие так не делают. Но вчера мне как раз попалась карта, которая без этого не проходила инициализацию.
Мне попадалась информация, что нужно сформировать 8 «пустых» переключений тактового сигнала перед формированием команды и я это реализовал. Думал, что отражено в статье, оказывается нет. Я расширил код команды, добавив в старший байт 0xFF. github.com/Finnetrib/SdController/blob/cab2ef85c89d9ed7b696d84bf141bc6eb3f89a6b/SD_Controller.srcs/sources_1/hdl/SDPackage.vhd#L54

Можно, пожалуйста, опубликовать образцовый пакет CMD=0x00 arg=0x000000. Какая CRC7 у такого frame(а)? Мне это надо для unit test(а).

x"400000000095" отправляется в sd карту при инициализации. Младшие биты (7..1) содержат crc.

На моей SD карте пришлось еще исполнить команду CMD42, чтобы снять защиту на запись

При чтении и записи блоков надо указывать адрес блока в байтах.
То есть первый блок будет иметь адрес 512, второй 1024 и так далее. Иначе R1 будет выдавать ошибку Address error.

Во время инициализации команда CMD8 R1 (в составе R7) возвращает 0x00, а не 0x01.

Какой пункт после этого выполнять?

Ожидать ответа на команду CMD8. Ответом являет ответ типа R7. В случае, если в ответе содержится бит, что команда не поддерживается, переход к шагу 7


Вы какой именно бит имеете в виду? Тот, что в части R1 (illegal command (bit3))?

Сходу не помню. Надо либо читать спецификацию, либо мой исходник, в котором это реализовано.

NCR это сколько байт?

К байтам это время не привязано, несколько я помню. Оно зависит от конкретной флешки.

Что делать, если SD карта не отвечает на команду CMD8 (SEND_IF_COND)?
Отправляешь CMD8, а дальше считываются только 0xFF.

Очень важный момент про SD-карты в режиме SPI.

Как известно SPI это полный дуплекс. То есть за один такт SCLK одновременно принимается и передается один бит информации.

Оказывается, что если при чтении ответа от SD-карты случайно послать по SPI что-то отличное от единиц, то большинство SD-карт ведут себя абсолютно непредсказуемо.

Поэтому приём данных от карты следует производить с одновременной записью в них 0xFF(ок).

Вот хороший и понятный алгоритм для инициализации SD-карты

Существует ли программный способ до инициализации быстро определить подключена ли SD карта по SPI или нет?

Интересный вопрос. Я склоняюсь к тому, что нет. Единственное, что приходит в голову, передать в SPI какой-нибудь набор данных, если пришел ответ, то на SPI кто-то есть.

Добрый день!

Подскажите пожалуйста. Вот сейчас есть много подделок карт памяти (в том числе USB) с фейковым объемом и пишущим по кругу. Наверняка читали или даже сталкивались. Так вот в случае с USB -это решаемо прошивкой для контроллера. Но сколько бы яни искал чего-то подобного для например SD карт… ничего нет. Может быть автор или кто из хабровчан сталкивался и может что-то подсказать по этому поводу? Может нужен ридер специальный? может какие платы или интерфейсы нужны? В идеале конечно обычный картридер. Информации нет совсем. Я например как раз начал поиск про режим SPI в SD и вот эта статья попалась.

Просто гуглите букварь по токену "sd specifications" и читайте нужную версию. Там всё описано, от физики и интерфейса до логики. Все примеры и статьи режима SPI (причём, используют именно 1-битный, хотя есть и 4-битный) взяты по сути из этого букваря.

Разве там описано как прошивать\править контроллер карты и уж тем более каким софтом?

Если прошивка/правка контроллера не предусмотрена спецификацией на интерфейс, через который вы собрались с ним работать и прошивать/править, то причём тут SD интерфейс в принципе? У большинства карт есть технологические пятачки, которые доступны при сборке и недоступны после подготовки к ретейлу. Не удивлюсь, если контроллер вообще шьётся ещё до корпусирования.

Может быть и шьется на заводе. Мне не известно. Я не нашел как сделать через SD интерфейс (хотя не факт что не существует ридеров с доп возможностями) и поэтому спросил про SPI. Принять окончательно эту версию меня останавливает нюанс, что абы кто в подвале не сможет сделать флешку с миллиардом транзисторов. А значит те кто подделывают скорее всего получают отбраковку с завода и прошивают ПОСЛЕ. вполне возмжно у них там это отлажено и ридеры на 100 карт сразу итп. Мне это не известно. Я об этом в общем то и спрашиваю.

Добрый день! Мне не попадался софт, который сможет сменить прошивку внутри контроллера карты SD. Да и отдельно контроллеры карты SD не попадались.

Ну отдельно они лет 15 назад наверное были не меньФе =)

Сейчас все монолитное и встроено в кристал. в этом то и проблема. Не понятно через что добраться туда. Толи специальная команада с обычным картридером. то ли вот через SPI...

Толи правдла через тех пяточки. (но это еще сложнееуже... учитывая например рамзер microSD) Но впрочем изначально конечно хочется добраться софтово или так сказать - полуапаратно. Без стачивания пластика и подпаивания к тестовым пинам.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории