Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Промлема инициализации SD-card в SD mode
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам
Lblsa
Имеется SD-карточка с контроллером на ПЛИСе (прошивка с opencores.org).
При работе с SPI-режимом никаких проблем нету.
Теперь нужно поднять SD - режим.
Поднимаю CS в 1. При посылке команд CMD0, CMD55,ACMD41 никакого ответа не наблюдается (0xFF).
если опустить CS в 0 и выполнить последовательно команды CMD0,CMD55,ACMD41 то все отрабатывает нормально, но при посылке команды CMD2 возвращает 0x04 (Illegal command). Что в общем то и понятно.... в SPI режиме CMD2 нету sad.gif(

Как же все таки инициализировать SD режим??..
Camelot
Цитата
Имеется SD-карточка с контроллером на ПЛИСе (прошивка с opencores.org).
При работе с SPI-режимом никаких проблем нету.
Теперь нужно поднять SD - режим.
Поднимаю CS в 1. При посылке команд CMD0, CMD55,ACMD41 никакого ответа не наблюдается (0xFF).
если опустить CS в 0 и выполнить последовательно команды CMD0,CMD55,ACMD41 то все отрабатывает нормально, но при посылке команды CMD2 возвращает 0x04 (Illegal command). Что в общем то и понятно.... в SPI режиме CMD2 нету (

Как же все таки инициализировать SD режим??..


Так в SD режиме нога CSn является ногой данных DAT3, зачем ее трогать вообще? Нужно без всяких чипселектов подавать команды сразу на CMD пин.

Успехов!
Lblsa
Цитата(Camelot @ Nov 4 2005, 09:37)
Так в SD режиме нога CSn является ногой данных DAT3, зачем ее трогать вообще? Нужно без всяких чипселектов подавать команды сразу на CMD пин.

Успехов!
*


Я имел ввиду что CSn/DAT3 pin в SD режиме находится в 3 состоянии, уровень на ней лог "1" так как она подтянута к +3.3В....
Camelot
Пины данных (D3-D0) и CMD подтянуты на 3.3 В.
После включения питания перед посылкой команды нужно подождать гдето клоков 80, затем чтобы выйти в трансфер режим, посылаются команды в порядке слево-направо: CDM0, CMD55, ACMD41, CMD2, CMD3, CMD7 (для 1-но битного SD режима). Если у вас не возвращаются ответы по линии CMD на посланные команды, то возможно проблема с подсчетом контрольной суммы (G(x) = x7 + x3 + 1).

Еще вопрос, на какой частоте вы работаете с SD?
Lblsa
Цитата(Camelot @ Nov 4 2005, 15:54)
Пины данных (D3-D0) и CMD подтянуты на 3.3 В.
После включения питания перед посылкой команды нужно подождать гдето клоков 80, затем чтобы выйти в трансфер режим, посылаются команды в порядке слево-направо: CDM0, CMD55, ACMD41, CMD2, CMD3, CMD7 (для 1-но битного SD режима). Если у вас не возвращаются ответы по линии CMD на посланные команды, то возможно проблема с подсчетом контрольной суммы (G(x) = x7 + x3 + 1).

Еще вопрос, на какой частоте вы работаете с SD?
*



На 25МГц.
так и инициализирую, только CMD55,ACMD41 2 раза повторяю...
первый раз с 0 аргументом, второй раз уже с битами Vdd.
Camelot
Цитата
На 25МГц.
так и инициализирую, только CMD55,ACMD41 2 раза повторяю...
первый раз с 0 аргументом, второй раз уже с битами Vdd.


Я посылаю серию команд CMD55, ACMD41 с самого начала со следующим значением ACMD41:
2'b01, ACMD41, 32'h00FF8000, crc7, 1'b1,
пока не получу в ответ, что бит OCR взведен в 1.

Попробуйте частоту снизить до 20 МГц, у меня работает на этой частоте.
Lblsa
А повторяете команды в такой же последовательности? ACMD41:2'b01, ACMD41:32'h00FF8000 ???

И еще вопросик. Почему в первом ACMD41 - 2'b01 ?? В datasheet говорится, что первые 3 бита зарезервированы?
Camelot
Сорри, не было меня.

Цитата
А повторяете команды в такой же последовательности? ACMD41:2'b01, ACMD41:32'h00FF8000 ???

parameter ACMD41=6'd41;

пакет ACMD41 я посылаю всегда в виде: {2'b01, ACMD41, 32'h00FF8000, crc7, 1'b1}


2'b01 - это стартовый бит и 1 говорит о том что это команда хоста.
LexaK
А нет ли у вас случаем библиотеки для работы с картой в SD-mode?
toretto
Не могу разобраться в алгоритме расчета CRC в режиме обмена по родному SD-протоколу. Не мог бы кто-нибудь объяснить, иначе без этого вся работа по интерфейсу стала колом. Вот выдержка из мануала:
Цитата
CRC7
The CRC7 check is used for all commands, for all responses except type R3, and for the CSD and CID
registers. The CRC7 is a 7-bit value and is computed as follows:
Generator polynomial: G(x) = x7 + x3 + 1.
M(x) = (first bit) * xn + (second bit) * xn-1 +...+ (last bit) * x0
CRC[6...0] = Remainder [(M(x) * x7)/G(x)]
The first bit is the most left bit of the corresponding bit string (of the command, response, CID or CSD).
The degree n of the polynomial is the number of CRC protected bits decreased by one. The number of
bits to be protected is 40 for commands and responses (n = 39), and 120 for the CSD and CID (n =
119).
aaarrr
Цитата(toretto @ Apr 26 2011, 23:27) *
Не могу разобраться в алгоритме расчета CRC в режиме обмена по родному SD-протоколу. Не мог бы кто-нибудь объяснить, иначе без этого вся работа по интерфейсу стала колом. Вот выдержка из мануала:

Это обычный CRC, что именно не понятно? Пример реализации на "C":
Код
unsigned int sd_crc7(unsigned char *buff, unsigned int len)
{
    unsigned int a, crc = 0;

    while(len--)
    {
        crc ^= *buff++;
        a = 8;
        do
        {
            crc <<= 1;
            if(crc & (1 << 8)) crc ^= 0x12;
        } while(--a);
    }
    return (crc & 0xfe);
}

toretto
Спасибо. Функция получает строку, для которой необходимо рассчитать CRC (*buff), которая состоит из стартовой последовательности (0b1,0b0), 6 бит команды и 4 байт содержимого, и колличество бит в это строке -1 (len = 40-1)? я храню 4 байта информации в переменной типа unsigned long (32 бита), но функция получает указатель на число типа unsigned char. В чем ошибаюсь?
aaarrr
Цитата(toretto @ Apr 27 2011, 08:23) *
В чем ошибаюсь?

Да ни в чем пока. Стартовые биты и код команды - это первый байт, дальше разделяете свой лонг на 4 байта от старшего к младшим, и получаете 5 байт, для которых и нужно подсчитать CRC. Считаете CRC, добавляете к результату стоповый бит (1 в нулевой позиции) и получаете требуемую последовательность.
toretto
Свой лонг и команду распихиваю в массив с элементами типа unsigned char. Далее, как я понимаю, указатель
*contentCRCPtr (у Вас он звался *buff) цикл за циклом проводит со всей последовательностью свои хитрые операции. Я кдаю ему CMD0 в виде 0х40 и нули во все 4 байта массива. Расчитанное значение равно 0x66c, после приведения к типу чар остается 0x6C. Возможно я неправильно понимаю работу указателей или не так передаю начало массива функции?..
Код
unsigned char t_cmd (unsigned char cmd, unsigned long content)
{
    unsigned long mask = 0b10000000;
    unsigned char n, res, CRC = 0, contentCRC[5]={0};
    ...
    contentCRC[0] = cmd;                // В первую ячейку кладу команду
    contentCRC[1] = content;
    contentCRC[2] = content>>8;
    contentCRC[3] = content>>16;
    contentCRC[4] = content>>24;            // В остальные распихиваю полезное содержимое

    CRC = sd_crc7(contentCRC, 39);
    ...
}

unsigned int sd_crc7(unsigned char *contentCRCPtr, unsigned int len)
{
    unsigned int a, crc = 0;

    while(len--)
    {
        crc ^= *contentCRCPtr++;
        a = 8;
        do
        {
            crc <<= 1;
            if(crc & (1 << 8)) crc ^= 0x12;
//            if(crc & 0x100) crc ^= 0x12;
        } while(--a);
    }
    return (crc & 0xfe);
}
aaarrr
Длина должна быть в байтах - 5. И порядок байт для аргумента (content) у вас развернут - он передается от старших к младшим.
toretto
Спасибо, добрый человек. Все так, как Вы сказали. Сумму считает правильно sm.gif
toretto
возникло вот такое затруднение: при инициализации в SD-режиме посылаю CMD0 (0x40, 0, 0, 0, 0, 0x95), реакции карты никакой. После шлю еще 40 пустых клоков и после в цикле выдаю команду CMD55 (0x77, 0, 0, 0, 0, 0x65). После опять реакции ноль. При посылке CMD0 для сброса в SPI (при CS = 0) карта высылает 0x01 (что верно). Не понимаю, почему в SD-режиме тишина. Все командные ноги и клок подтянуты 10кОм к +3.3В. Работаю по заднему фронту клока (по переднему не работает даже в SPI). После включения питания шлю около 160 пустых тактов, частота 200 кГц. Поделитесь мыслями, у кого есть.
toretto
приведу осцилограмки

ниже команда cmd8:
Нажмите для просмотра прикрепленного файла

посылка cmd0 и после 10 байтной паузы cmd 8:
Нажмите для просмотра прикрепленного файла

toretto
карту проинициализировал, видимо была нестыковка по фронтам.
Можно ли отключить командой CMD59 CRC_ON_OFF проверку контрольной суммы? или команда только для режима SPI?
aaarrr
Нет, отключить можно только в режиме SPI.
toretto
в спецификации на странице 8 приведена диаграмма записи в карту. из нее видно, что после записи карта возвращает по линии cmd0 ответ: некую приставку и сигнал busy. что за приставка и сигнал, не подскажете? или где почитать можно?
toretto
Цитата(toretto @ Nov 4 2011, 14:29) *
возникло вот такое затруднение: при инициализации в SD-режиме посылаю CMD0 (0x40, 0, 0, 0, 0, 0x95), реакции карты никакой. После шлю еще 40 пустых клоков и после в цикле выдаю команду CMD55 (0x77, 0, 0, 0, 0, 0x65). После опять реакции ноль. При посылке CMD0 для сброса в SPI (при CS = 0) карта высылает 0x01 (что верно). Не понимаю, почему в SD-режиме тишина. Все командные ноги и клок подтянуты 10кОм к +3.3В. Работаю по заднему фронту клока (по переднему не работает даже в SPI). После включения питания шлю около 160 пустых тактов, частота 200 кГц. Поделитесь мыслями, у кого есть.

проблема оказалась в емкостях линий, добавив несколько десятков пФ об землю на линиях CLK, CMD проблема пропала. sm.gif вот такой интересный нюанс.
по непонятным причинам после посылки CMD7 SELECT/DESELECT_CARD карта отвечает (hex) 07 00 00 07 00 75 и после молча терпит все следующие команды (на cmd13, cmd55, cmd7 ответов нет). если я правильно расшифровал, 7 => карта перешла в program state (в DSh сказано, карта должна послать сигнал busy,повесив "0" на DAT0, у меня как висела "1", так и висит). в чем может быть трабл? повторный сброс CMD0 работает
aaarrr
Цитата(toretto @ Feb 29 2012, 09:40) *
проблема оказалась в емкостях линий, добавив несколько десятков пФ об землю на линиях CLK, CMD проблема пропала. sm.gif вот такой интересный нюанс.

Скорее всего, у вас наводка идет с линии CLK.

Цитата(toretto @ Feb 29 2012, 09:40) *
по непонятным причинам после посылки CMD7 SELECT/DESELECT_CARD карта отвечает (hex) 07 00 00 07 00 75 и после молча терпит все следующие команды (на cmd13, cmd55, cmd7 ответов нет). если я правильно расшифровал, 7 => карта перешла в program state (в DSh сказано, карта должна послать сигнал busy,повесив "0" на DAT0, у меня как висела "1", так и висит). в чем может быть трабл? повторный сброс CMD0 работает

Карта была в состоянии stby, вы выполнили SELECT, после чего она должна перейти в tran.
toretto
поставил в цикле CMD3, в итоге на первую команду пришел ответ "stand by", на вторую "programe state"... и все.... cranky.gif
aaarrr
Вы лучше опишите подробно, что передается, и что отвечает карта. С самого начала, т.е. с CMD0.
toretto
1. 100 клоков
2. CMD0 0x40, 0, 0, 0, 0 0x95 -> ответа нет
3. 80 клоков
4. CMD8 0x48, 0, 0, 1, 0xAA, 0x87 -> 0x08, 0, 0, 1, 0xAA, 0x13
5. CMD55 0x55, 0, 0, 0, 0, 0x65 -> 0x55, 0, 0, 1, 0x20, 0x83
6. CMD41 0x69, 0, 0xFF, 0x80, 0, 0x80, 0x85 -> 0x3F, 0, 0xAA, 0x80, 0, 0xFF
........... 5-6 в цикле до получения бита busy status "1" .................
7. CMD55 0x55, 0, 0, 0, 0, 0x65 -> 0x55, 0, 0, 1, 0x20, 0x83
8. CMD41 0x69, 0, 0xFF, 0x80, 0, 0x80, 0x85 -> 0x3F, 0x80, 0xAA, 0x80, 0, 0xFF
9. CMD2 0x42 0, 0, 0, 0, 0x4D -> длинный ответ, просто фиксирую факт, что он есть
10. CMD3 0x43 0, 0, 0, 0, 0x4D -> 0x03, 0x02, 0x60, 0x05, 0, 0x5D
11. CMD3 0x43 0, 0, 0, 0, 0x4D -> 0x03, 0x02, 0x61, 0x07, 0, 0x2F -- вот тут уже 7 в ответе - prg state
.... пауза 600 мкс......
12. CMD7 0x47 0x02, 0x61, 0, 0, 0x7B -> 0x7, 0x0, 0x0, 0x7, 0x0, 0x75
13. CMD55 0x55, 0, 0, 0, 0, 0x65 -> и тишина.....
aaarrr
Цитата(toretto @ Mar 1 2012, 10:37) *
13. CMD55 0x55, 0, 0, 0, 0, 0x65 -> и тишина.....

Все правильно: вы же указали 0 в качестве RCA.
toretto
спасибо. глаз замылился, совсем забыл об RCA в этой команде. a14.gif
toretto
del
nikita1584
Здравствуйте! Дабы не плодить новую ветку по работе с SD картой, напишу здесь. Помогите, пожалуйста, с записью на SD-карту в режиме SD. Инициализация проходит успешно, чтение так же корректно (совпадает с тем что я вижу на осциллографе). Последовательность команд, которую я отправляю:

CMD0, CMD8, CMD55, ACMD41,CMD2,CMD3,CMD9,CMD7,CMD55,ACMD6, далее пишу CMD24 и читаю CMD17

Считаю CRC для данных правильно, подтвержением тому - совпадение вычисленной моей CRC и полученной от карты при чении. Частота тактирования 257 КГц, слот SD карты общается с FPGA. При записи на карту, на середину данных приходится фронт клока (данные изменяю от спада до спада).

Большое спасибо!
aaarrr
А вопрос-то в чем? Что и как не работает?
nikita1584
Я читаю данные, которые изначально были на карте, а не те, которые пытался записать.
KAlex
Цитата(nikita1584 @ Mar 27 2012, 20:05) *
Считаю CRC для данных правильно, подтвержением тому - совпадение вычисленной моей CRC и полученной от карты при чении.


Как то не вяжется.
У Вас есть блок данных для записи, для него считаем CRC16.
Как можно получить значение crc от карты и сравнить со своим значением, если блок не пишется?
aaarrr
Цитата(KAlex @ Mar 30 2012, 17:32) *
Как можно получить значение crc от карты и сравнить со своим значением, если блок не пишется?

Проверить работу CRC можно при чтении.

Цитата(nikita1584 @ Mar 28 2012, 13:27) *
Я читаю данные, которые изначально были на карте, а не те, которые пытался записать.

Опишите максимально подробно, что происходит на шине после CMD24 - токены, ответы, BUSY и т.д.
toretto
не хочу заводить новую тему о SD-картах, продолжу тут. Установил размер чтения 1024 бита (2 сектора). читаю командой CMD17, каждый раз новый сектор (не последующий). Задержка между посылкой команды и началом передачи данных ~500 мкс. Возможно ли эту задержку уменьшить как минимум на порядок? карта Inno Disk 2GB, class 10.
aaarrr
Цитата(toretto @ Apr 3 2012, 10:04) *
читаю командой CMD17, каждый раз новый сектор (не последующий). Задержка между посылкой команды и началом передачи данных ~500 мкс. Возможно ли эту задержку уменьшить как минимум на порядок?

Нет, на случайном чтении задержку убрать не получится.
toretto
а как ведут себя карты с индексом скорости х150? например Transcend 133x SD 2 Гб (TS2GSD133). за счет чего вырастает скорость чтения у карт разных классов?
aaarrr
Все это скорости линейных операций. На случайном чтении может выручить только кэш в какой-то степени.
nikita1584
отправляю CMD24: 0x580010080065
получаю ответ 0x18000009005D
отправляю данные (512 байт + старт + CRC + стоп), протактировав карточку до этого тактов 300 тактов:
0x00123456
0x789ABCDE
0xF0123456
0x789ABCDE
0xF0123456
0x789ABCDE
0xF0123456
0x789ABCDE
...
0x789ABCDE
0xFCD67DEF
0x92352A7D
0x1FFFFFFF
т.е. CRC = CD67 DEF9 2352 A7D1
первый ноль в первом блоке - старт бит
затем я тактирую около 6000 тактов
читаю статус CMD13: 0x4D000009003F
респонс от CDM13: 0x0D000009003F
далее, читаю CMD17: 0x51001008005F
ответ: 0x110000090067

линия DAT0 после попытки записи в высоком состоянии
старт бит для данных для записи в режиме SD - это один такт нулей или как SPI - 0xFC?
KAlex
Цитата(nikita1584 @ Apr 3 2012, 15:52) *
читаю статус CMD13: 0x4D000009003F
респонс от CDM13: 0x0D000009003F


Кажется я понял.
RCA нулевой.
А как посылается CMD7? И что в ответ?
nikita1584
Извиняюсь, я не правильно написал, RCA не нулевой. 13-ю команду я посылаю в таком виде:
CMD13: 0x4D00020000B1
респонс на CMD13: 0x0D000009003F

выбираю карточку я так CMD7: 0x47000200003F

Было замечено следующее: после попытки записать блок 17-й командой и тактирования, на линии данных я увидел 0xFFFF....FFFF EFE FFFF....FFFF, значит ли это что где-то ошибка?

Ещё я пробовал записать 25-й командой, остонавливаю 12-й командой и спрашиваю статус 13-й (респонс на 13-ю команду такой же). На осциллографе я видел что линия DAT0 находилась в низком состоянии некоторое время, но блок всё равно не записался

может я не тот адрес указываю при чтении.. (задаю такой же как на запись)
KAlex
А какой респонс на CMD3 при инициализации карты?
И CMD7 тоже интересует.
nikita1584
Большое спасибо тем кто пытался помочь!

Я до записи попробовал послать 16-ю команду (установить длину блока), потом 23-й командой установил количество блоков, равное единице и потом ACMD22 поставил количество блоков, которое должно быть записано. После этого попытался записать 25-й командой (WRITE_BLOCK_MULTIPLE), и попытка удалась.

Кстати, в респонсе от CMD3 устанавливается 5-й бит статуса, т.е. APP_CMD что значит "The card will expect ACMD, or an indication that the command has been interpreted as ACMD" Хотя до того я 55-ю не посылал, а посылал вторую.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.