|
Промлема инициализации 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 - 14)
|
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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|