|
Промлема инициализации SD-card в SD mode, Промлема инициализации SD-card в SD mode |
|
|
|
Nov 3 2005, 15:23
|
Группа: Новичок
Сообщений: 4
Регистрация: 3-11-05
Пользователь №: 10 437

|
Имеется SD-карточка с контроллером на ПЛИСе (прошивка с opencores.org). При работе с SPI-режимом никаких проблем нету. Теперь нужно поднять SD - режим. Поднимаю CS в 1. При посылке команд CMD0, CMD55,ACMD41 никакого ответа не наблюдается (0xFF). если опустить CS в 0 и выполнить последовательно команды CMD0,CMD55,ACMD41 то все отрабатывает нормально, но при посылке команды CMD2 возвращает 0x04 (Illegal command). Что в общем то и понятно.... в SPI режиме CMD2 нету  ( Как же все таки инициализировать SD режим??..
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 42)
|
Nov 4 2005, 06:37
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872

|
Цитата Имеется 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 пин. Успехов!
|
|
|
|
|
Nov 4 2005, 11:34
|
Группа: Новичок
Сообщений: 4
Регистрация: 3-11-05
Пользователь №: 10 437

|
Цитата(Camelot @ Nov 4 2005, 09:37) Так в SD режиме нога CSn является ногой данных DAT3, зачем ее трогать вообще? Нужно без всяких чипселектов подавать команды сразу на CMD пин. Успехов! Я имел ввиду что CSn/DAT3 pin в SD режиме находится в 3 состоянии, уровень на ней лог "1" так как она подтянута к +3.3В....
|
|
|
|
|
Nov 4 2005, 12:54
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872

|
Пины данных (D3-D0) и CMD подтянуты на 3.3 В. После включения питания перед посылкой команды нужно подождать гдето клоков 80, затем чтобы выйти в трансфер режим, посылаются команды в порядке слево-направо: CDM0, CMD55, ACMD41, CMD2, CMD3, CMD7 (для 1-но битного SD режима). Если у вас не возвращаются ответы по линии CMD на посланные команды, то возможно проблема с подсчетом контрольной суммы (G(x) = x7 + x3 + 1).
Еще вопрос, на какой частоте вы работаете с SD?
|
|
|
|
|
Nov 4 2005, 14:06
|
Группа: Новичок
Сообщений: 4
Регистрация: 3-11-05
Пользователь №: 10 437

|
Цитата(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.
|
|
|
|
|
Nov 4 2005, 19:59
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872

|
Цитата На 25МГц. так и инициализирую, только CMD55,ACMD41 2 раза повторяю... первый раз с 0 аргументом, второй раз уже с битами Vdd. Я посылаю серию команд CMD55, ACMD41 с самого начала со следующим значением ACMD41: 2'b01, ACMD41, 32'h00FF8000, crc7, 1'b1, пока не получу в ответ, что бит OCR взведен в 1. Попробуйте частоту снизить до 20 МГц, у меня работает на этой частоте.
|
|
|
|
|
Nov 7 2005, 14:22
|
Группа: Новичок
Сообщений: 4
Регистрация: 3-11-05
Пользователь №: 10 437

|
А повторяете команды в такой же последовательности? ACMD41:2'b01, ACMD41:32'h00FF8000 ???
И еще вопросик. Почему в первом ACMD41 - 2'b01 ?? В datasheet говорится, что первые 3 бита зарезервированы?
|
|
|
|
|
Nov 8 2005, 09:34
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872

|
Сорри, не было меня. Цитата А повторяете команды в такой же последовательности? ACMD41:2'b01, ACMD41:32'h00FF8000 ??? parameter ACMD41=6'd41; пакет ACMD41 я посылаю всегда в виде: {2'b01, ACMD41, 32'h00FF8000, crc7, 1'b1} 2'b01 - это стартовый бит и 1 говорит о том что это команда хоста.
|
|
|
|
|
Apr 26 2011, 19:27
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
Не могу разобраться в алгоритме расчета 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).
Сообщение отредактировал toretto - Apr 26 2011, 19:27
|
|
|
|
|
Apr 27 2011, 04:23
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

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

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
Свой лонг и команду распихиваю в массив с элементами типа 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); }
Сообщение отредактировал toretto - Apr 27 2011, 08:49
|
|
|
|
|
Nov 4 2011, 11:29
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
возникло вот такое затруднение: при инициализации в 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 - Nov 4 2011, 11:52
|
|
|
|
|
Jan 31 2012, 08:03
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
приведу осцилограмки ниже команда cmd8:
посылка cmd0 и после 10 байтной паузы cmd 8:
|
|
|
|
|
Feb 9 2012, 12:32
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
карту проинициализировал, видимо была нестыковка по фронтам. Можно ли отключить командой CMD59 CRC_ON_OFF проверку контрольной суммы? или команда только для режима SPI?
|
|
|
|
|
Feb 29 2012, 05:40
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
Цитата(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 проблема пропала.  вот такой интересный нюанс. по непонятным причинам после посылки CMD7 SELECT/DESELECT_CARD карта отвечает (hex) 07 00 00 07 00 75 и после молча терпит все следующие команды (на cmd13, cmd55, cmd7 ответов нет). если я правильно расшифровал, 7 => карта перешла в program state (в DSh сказано, карта должна послать сигнал busy,повесив "0" на DAT0, у меня как висела "1", так и висит). в чем может быть трабл? повторный сброс CMD0 работает
Сообщение отредактировал toretto - Feb 29 2012, 06:25
|
|
|
|
|
Feb 29 2012, 09:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(toretto @ Feb 29 2012, 09:40)  проблема оказалась в емкостях линий, добавив несколько десятков пФ об землю на линиях CLK, CMD проблема пропала.  вот такой интересный нюанс. Скорее всего, у вас наводка идет с линии 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.
|
|
|
|
|
Mar 1 2012, 06:37
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
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 -> и тишина.....
Сообщение отредактировал toretto - Mar 1 2012, 08:05
|
|
|
|
|
Mar 12 2012, 07:26
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
del
Сообщение отредактировал toretto - Mar 12 2012, 07:57
|
|
|
|
|
Mar 27 2012, 16:05
|
Группа: Новичок
Сообщений: 5
Регистрация: 27-03-12
Пользователь №: 71 035

|
Здравствуйте! Дабы не плодить новую ветку по работе с SD картой, напишу здесь. Помогите, пожалуйста, с записью на SD-карту в режиме SD. Инициализация проходит успешно, чтение так же корректно (совпадает с тем что я вижу на осциллографе). Последовательность команд, которую я отправляю:
CMD0, CMD8, CMD55, ACMD41,CMD2,CMD3,CMD9,CMD7,CMD55,ACMD6, далее пишу CMD24 и читаю CMD17
Считаю CRC для данных правильно, подтвержением тому - совпадение вычисленной моей CRC и полученной от карты при чении. Частота тактирования 257 КГц, слот SD карты общается с FPGA. При записи на карту, на середину данных приходится фронт клока (данные изменяю от спада до спада).
Большое спасибо!
|
|
|
|
|
Mar 28 2012, 09:27
|
Группа: Новичок
Сообщений: 5
Регистрация: 27-03-12
Пользователь №: 71 035

|
Я читаю данные, которые изначально были на карте, а не те, которые пытался записать.
|
|
|
|
|
Mar 30 2012, 13:32
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(nikita1584 @ Mar 27 2012, 20:05)  Считаю CRC для данных правильно, подтвержением тому - совпадение вычисленной моей CRC и полученной от карты при чении. Как то не вяжется. У Вас есть блок данных для записи, для него считаем CRC16. Как можно получить значение crc от карты и сравнить со своим значением, если блок не пишется?
|
|
|
|
|
Mar 30 2012, 13:44
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(KAlex @ Mar 30 2012, 17:32)  Как можно получить значение crc от карты и сравнить со своим значением, если блок не пишется? Проверить работу CRC можно при чтении. Цитата(nikita1584 @ Mar 28 2012, 13:27)  Я читаю данные, которые изначально были на карте, а не те, которые пытался записать. Опишите максимально подробно, что происходит на шине после CMD24 - токены, ответы, BUSY и т.д.
|
|
|
|
|
Apr 3 2012, 06:04
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

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

Группа: Участник
Сообщений: 36
Регистрация: 14-03-11
Пользователь №: 63 590

|
а как ведут себя карты с индексом скорости х150? например Transcend 133x SD 2 Гб (TS2GSD133). за счет чего вырастает скорость чтения у карт разных классов?
|
|
|
|
|
Apr 3 2012, 11:52
|
Группа: Новичок
Сообщений: 5
Регистрация: 27-03-12
Пользователь №: 71 035

|
отправляю 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?
Сообщение отредактировал nikita1584 - Apr 3 2012, 11:56
|
|
|
|
|
Apr 10 2012, 08:20
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(nikita1584 @ Apr 3 2012, 15:52)  читаю статус CMD13: 0x4D000009003F респонс от CDM13: 0x0D000009003F Кажется я понял. RCA нулевой. А как посылается CMD7? И что в ответ?
|
|
|
|
|
Apr 11 2012, 09:32
|
Группа: Новичок
Сообщений: 5
Регистрация: 27-03-12
Пользователь №: 71 035

|
Извиняюсь, я не правильно написал, RCA не нулевой. 13-ю команду я посылаю в таком виде: CMD13: 0x4D00020000B1 респонс на CMD13: 0x0D000009003F
выбираю карточку я так CMD7: 0x47000200003F
Было замечено следующее: после попытки записать блок 17-й командой и тактирования, на линии данных я увидел 0xFFFF....FFFF EFE FFFF....FFFF, значит ли это что где-то ошибка?
Ещё я пробовал записать 25-й командой, остонавливаю 12-й командой и спрашиваю статус 13-й (респонс на 13-ю команду такой же). На осциллографе я видел что линия DAT0 находилась в низком состоянии некоторое время, но блок всё равно не записался
может я не тот адрес указываю при чтении.. (задаю такой же как на запись)
|
|
|
|
|
Apr 11 2012, 20:06
|
Группа: Новичок
Сообщений: 5
Регистрация: 27-03-12
Пользователь №: 71 035

|
Большое спасибо тем кто пытался помочь!
Я до записи попробовал послать 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-ю не посылал, а посылал вторую.
Сообщение отредактировал nikita1584 - Apr 11 2012, 20:08
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|