Комментарии 41
Пока таких планов нет. В случае необходимости реализации SDIO, я бы лучше обратил внимание на eMMC. У eMMC есть возможность установки на плату с помощью припаивания, а не с помощью разъема.
Эм, если вы уже используете 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).
AXI4 или AXI-Stream? Сколько скорость получилась?
Железо было на стандарт 3.3V по нему максимальный клок 50Mhz ну и 4битная шина. Расчетная должна быть около 200 Mbit/s где так оно и получалось в пике, ну а так а вычетом времени на посыл команды старта отсановки, поменьше выходила но точных цифр не приведу, я это года два назад тестировал.
При использовании FPGA нет смысла использовать SD-карту в режиме SPI
Тут дело не совсем в FPGA. Вроде как это замысел создателей стандарта SD-карточек: режим SPI — это единственный открытый (бесплатный) вариант работы с SD-карточкой, а остальные все закрытые, т.е. требуют либо покупки лицензий, либо покупки IP-корок, либо реверс-инжиниринга их проприетарного протокола. В то же время многие производители микроконтроллеров включают подобные ядра в свои продукты, в результате конечному пользователю не приходится заморачиваться.
Сейчас обнаружил, что вышла новая версия спецификации. Карты размером от 2 Тб до 128 Тб включительно вынесли из группы SDXC и создали для них новую группу SDUC (Ultra Capacity SD Memory Card). Карты SDUC режим SPI не поддерживают. Видимо чтобы не тащить протокол, которым мало кто будет пользоваться.
не очень понял из кода: использовались команды чтения/записи по 1 сектору или по много подряд? во 2 случае достаточно задать начальный сектор и лить данные сколько надо.
При чтении тут мультиплексор выбора команды. Код команды определен в SDPackage.vhd
При записи тут мультиплексор выбора команды. Код команды определен в SDPackage.vhd
спасибо. правильно ли я понимаю, что ваши измерения скоростей сделаны на кусках по 8 килобайт? возможно, если вы возьмёте например 8 мегабайт, вы приблизитесь к 25 мегабитам (исходя из скорости SPI-интерфейса), как минимум на чтении (т.к. скорость записи может ограничиваться неидеальностью SD-карты как микро-пародии на SSD :))
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 «пустых» клоков. Обычно это не требуется, и многие так не делают. Но вчера мне как раз попалась карта, которая без этого не проходила инициализацию.
Можно, пожалуйста, опубликовать образцовый пакет CMD=0x00 arg=0x000000. Какая CRC7 у такого frame(а)? Мне это надо для unit test(а).
На моей SD карте пришлось еще исполнить команду CMD42, чтобы снять защиту на запись
![](https://habrastorage.org/getpro/habr/upload_files/388/19b/728/38819b72848ae185f18597ebf1fa02de.png)
В репозитории flipperzero-firmware
https://github.com/flipperdevices/flipperzero-firmware
есть драйвер SD карты по SPI
https://github.com/flipperdevices/flipperzero-firmware/blob/dev/firmware/targets/f7/fatfs/stm32_adafruit_sd.c
При чтении и записи блоков надо указывать адрес блока в байтах.
То есть первый блок будет иметь адрес 512, второй 1024 и так далее. Иначе R1 будет выдавать ошибку Address error.
Во время инициализации команда CMD8 R1 (в составе R7) возвращает 0x00, а не 0x01.
Какой пункт после этого выполнять?
Ожидать ответа на команду CMD8. Ответом являет ответ типа R7. В случае, если в ответе содержится бит, что команда не поддерживается, переход к шагу 7
Вы какой именно бит имеете в виду? Тот, что в части R1 (illegal command (bit3))?
![](https://habrastorage.org/getpro/habr/upload_files/951/1d1/d66/9511d1d66df39f9658fd6443c74e9dca.png)
NCR это сколько байт?
![](https://habrastorage.org/getpro/habr/upload_files/12c/a71/3c9/12ca713c91fe339729136a666f043fbe.png)
Что делать, если SD карта не отвечает на команду CMD8 (SEND_IF_COND)?
Отправляешь CMD8, а дальше считываются только 0xFF.
Очень важный момент про SD-карты в режиме SPI.
Как известно SPI это полный дуплекс. То есть за один такт SCLK одновременно принимается и передается один бит информации.
Оказывается, что если при чтении ответа от SD-карты случайно послать по SPI что-то отличное от единиц, то большинство SD-карт ведут себя абсолютно непредсказуемо.
Поэтому приём данных от карты следует производить с одновременной записью в них 0xFF(ок).
Вот хороший и понятный алгоритм для инициализации SD-карты
![](https://habrastorage.org/getpro/habr/upload_files/925/efb/980/925efb980ce32a1d3fca14c41e17f9d2.png)
Существует ли программный способ до инициализации быстро определить подключена ли SD карта по SPI или нет?
Добрый день!
Подскажите пожалуйста. Вот сейчас есть много подделок карт памяти (в том числе USB) с фейковым объемом и пишущим по кругу. Наверняка читали или даже сталкивались. Так вот в случае с USB -это решаемо прошивкой для контроллера. Но сколько бы яни искал чего-то подобного для например SD карт… ничего нет. Может быть автор или кто из хабровчан сталкивался и может что-то подсказать по этому поводу? Может нужен ридер специальный? может какие платы или интерфейсы нужны? В идеале конечно обычный картридер. Информации нет совсем. Я например как раз начал поиск про режим SPI в SD и вот эта статья попалась.
Просто гуглите букварь по токену "sd specifications" и читайте нужную версию. Там всё описано, от физики и интерфейса до логики. Все примеры и статьи режима SPI (причём, используют именно 1-битный, хотя есть и 4-битный) взяты по сути из этого букваря.
Разве там описано как прошивать\править контроллер карты и уж тем более каким софтом?
Если прошивка/правка контроллера не предусмотрена спецификацией на интерфейс, через который вы собрались с ним работать и прошивать/править, то причём тут SD интерфейс в принципе? У большинства карт есть технологические пятачки, которые доступны при сборке и недоступны после подготовки к ретейлу. Не удивлюсь, если контроллер вообще шьётся ещё до корпусирования.
Может быть и шьется на заводе. Мне не известно. Я не нашел как сделать через SD интерфейс (хотя не факт что не существует ридеров с доп возможностями) и поэтому спросил про SPI. Принять окончательно эту версию меня останавливает нюанс, что абы кто в подвале не сможет сделать флешку с миллиардом транзисторов. А значит те кто подделывают скорее всего получают отбраковку с завода и прошивают ПОСЛЕ. вполне возмжно у них там это отлажено и ридеры на 100 карт сразу итп. Мне это не известно. Я об этом в общем то и спрашиваю.
Добрый день! Мне не попадался софт, который сможет сменить прошивку внутри контроллера карты SD. Да и отдельно контроллеры карты SD не попадались.
Ну отдельно они лет 15 назад наверное были не меньФе =)
Сейчас все монолитное и встроено в кристал. в этом то и проблема. Не понятно через что добраться туда. Толи специальная команада с обычным картридером. то ли вот через SPI...
Толи правдла через тех пяточки. (но это еще сложнееуже... учитывая например рамзер microSD) Но впрочем изначально конечно хочется добраться софтово или так сказать - полуапаратно. Без стачивания пластика и подпаивания к тестовым пинам.
Насколько я помню, в спецификации SD/MMC были vendor-specific команды. Софт для прошивки, очевидно, тоже есть. А не можете найти потому, что производителей SD карт намного меньше, чем USB флешек. Как результат, меньше утечек.
В случае USB флешек вы можете купить отдельно контроллеры, отдельно NAND Flash чипы с интерфейсом ONFI и делать свои флешки. С SD картами сложнее из-за размера, но, в принципе, ещё возможно. А вот с MicroSD всё заметно сложнее: тут уже чипы и контроллера, и памяти бескорпусные.
P.S. SPI режим в спецификации SD/MMC уже давно объявлен устаревшим и необязательным.
А не можете найти потому, что производителей SD карт намного меньше, чем USB флешек. Как результат, меньше утечек.
уже не первый раз на это отвечаю. с софтом проблем нет. Не для всего подряд есть конечно, но имеется. но он не работает. Именно потому что ему чего-то не хватает.
специального прошивальщика... или режима...
поэтому пришлось рассуждать вот в сторону SPI интерфейса.
Работа с SD-картой по интерфейсу SPI. Реализация на VHDL