Просмотр полной версии : Подключение SD карты
Lisitsin
16.11.2013, 20:00
Приветствую!
Кто может помочь советом в подключении SD карты?
Имею желание прикрутить SD карту к AVR ZX Spectrum. Стал разбираться и уткнулся в контрольную сумму. В спецификации на SD карты от SD Group (версия 3.01) https://dl.dropboxusercontent.com/u/12408899/SD%20PHISICAL%20LAYER%20SPECIFICATION.zip
на стр. 116 в разделе 7.2.2 сказано, что команда CMD8 всегда проверяется на контрольную сумму. CMD8 рекомендуется использовать при инициализации карты.
Кто может объяснить как реализовать на ассемблере подсчёт контрольной суммы, описанный в разделе 4.5?
Буду премного благодарен!
Если SD подключается по SPI, то там можно CRC пренебречь.
http://elm-chan.org/docs/mmc/mmc_e.html
Lisitsin
16.11.2013, 20:24
Если SD подключается по SPI, то там можно CRC пренебречь.
http://elm-chan.org/docs/mmc/mmc_e.html
Да, но не в случае CMD8. Она всегда проверяет CRC: (раздел 7.2.2) The CMD8 CRC verification is always enabled.
CMD8 необходима для выяснения к какой спецификации относится карта. Эта команда была введена в версии 2.0
При определении версии карты аргументом CMD8 вроде указывается "0x000001AA". На Си команда у меня выглядела примерно так:
sd_cmd(SEND_IF_COND,0x000001AA)
Т.е. команда не изменяется и к.с. можно задать константой
Lisitsin
16.11.2013, 22:40
При определении версии карты аргументом CMD8 вроде указывается "0x000001AA". На Си команда у меня выглядела примерно так:
sd_cmd(SEND_IF_COND,0x000001AA)
А какая там crc получается?
Lisitsin
17.11.2013, 10:32
google говорит 0x87.
Премного благодарен за ответ, сейчас буду пробовать.
Посмотрел в исходнике - точно к.с. 0х87. Т.е. для CMD8 на карту подается последовательность 0х48(код команды), 0х000001АА(аргумент), 0х87(crc).
Любой ответ карты, кроме 0х01, говорит о первой версии, иначе - вторая.
Lisitsin
17.11.2013, 13:23
Чёт 0х78 для CMD8 0x000001AA у меня не идёт ... Ошибка CRC пишет ...
---------- Post added at 13:11 ---------- Previous post was at 13:04 ----------
Туплю ... Вбиваю 0x78 вместо 0x87 ...
---------- Post added at 13:23 ---------- Previous post was at 13:13 ----------
Отвечает: 01 00 00 01 AA, Всё нормально !
Lisitsin
17.11.2013, 20:53
Люди, ещё появилась проблема.
Пытаюсь отправить ACMD41. Выставляю на CS ноль. Передаю команду 55 с нулевым аргументом и нулевой КС. Ставлю CS в единицу. Делаю паузу порядка 3 мкС. Снова CS в ноль. Передаю команду 41. В ответ вместо response R3 вижу R1 = 0x01. Чё это? Что я не правильно делаю?
---------- Post added at 20:53 ---------- Previous post was at 20:28 ----------
Всё, разобрался. В SPI режиме он отвечает как R1 ...
Lisitsin
18.11.2013, 21:21
Опять какая-то фигня. Пытаюсь прочитать нулевой сектор отформатированной в FAT32 SD карты 16 G. Результат чтения - 512 байт пишу в eeprom контроллера. Читаю командой cmd17. Правда, не знаю как CS делать. Пробовал по-всякому, и держать в нуле и поднимать ненадолго в 1 перед чтением самого блока данных. Результат всегда разный. Например, как во вложении. Что-то не похоже на правду ...
Lisitsin
18.11.2013, 21:29
Читаю байт за байтом, последовательно 512 раз, с CS в нуле.
ILoveSpeccy
21.11.2013, 16:27
Можете посмотреть тут: http://elm-chan.org/docs/mmc/mmc_e.html
Или скачайте примеры FAT-библиотеки, там всё понятно в исходникак как и что.
ILoveSpeccy
21.11.2013, 18:03
Хорошая дока, но перевод поршивый. Даже с моими мизерными знаниями
английского оригинал читается легче.
shurik-ua
23.11.2013, 21:47
подозреваю что ты стоповый бит забываешь отсылать, покажи в hex значениях что конкретно ты отсылаешь в контроллер.
вот что я отсылаю(vhdl):
SEND_CMD_00 =>
command <= X"FF400000000095";
SEND_CMD_08 =>
command <= X"FF48000001AA87";
SEND_CMD_55 =>
sd_ver_2 <= not responce(34);
command <= X"FF7700000000FF";
SEND_ACMD_41 =>
command <= X"FF69" & '0' & sd_ver_2 & "000000" & X"000000FF";
Lisitsin
09.12.2013, 19:55
Да вроде разобрался, сейчас и пишу и читаю посекторно ...
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot