реклама на сайте
подробности

 
 
> SDHC vs SD. Идентификация карты., Не устанавливается "power-up status bit" в OCR
KAlex
сообщение Mar 28 2008, 10:25
Сообщение #1


Местный
***

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



Порядок инициализации:
Код
  send_comstr( CMD_0, 0, 6);
  ocr = 0;
  do {
    send_comstr(CMD_55, 0, 6);
    send_comstr(ACMD_41, ocr, 6);
    ocr = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24);
  }  while (!(comstr->arg0 & 0x80));

У обычной SD через два-три цикла бит power-up устанавливается.
SDHC отвечает, ответные аргументы и crc совпадают с SD, но power-up не устанавливается.
Нормального даташита на HC нет. Может там другой порядок идентификации.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
abcdefg
сообщение Mar 29 2008, 13:32
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



Цитата(KAlex @ Mar 28 2008, 13:25) *
Порядок инициализации:
Код
  send_comstr( CMD_0, 0, 6);
  ocr = 0;
  do {
    send_comstr(CMD_55, 0, 6);
    send_comstr(ACMD_41, ocr, 6);
    ocr = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24);
  }  while (!(comstr->arg0 & 0x80));

У обычной SD через два-три цикла бит power-up устанавливается.
SDHC отвечает, ответные аргументы и crc совпадают с SD, но power-up не устанавливается.
Нормального даташита на HC нет. Может там другой порядок идентификации.


См. ссылку в посте (про команду CMD8) - http://electronix.ru/forum/index.php?showtopic=35898
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 30 2008, 07:31
Сообщение #3


Местный
***

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



Я правильно делаю?
После CMD0 посылаю CMD8 - не отвечает.
SD не HC тоже не отвечают, но работают(power-up устанавливается).
Код
  send_comstr( CMD_0, 0, 6);
  ocr = 0;
  do {
    send_comstr( CMD_8, 0, 6);  // !!! нет ответа
    send_comstr(CMD_55, 0, 6);
    send_comstr(ACMD_41, ocr, 6);
    ocr = (comstr->arg3)|(comstr->arg2<<8)|(comstr->arg1<<16)|(comstr->arg0<<24);
  }  while (!(comstr->arg0 & 0x80));

На 55 и 41 отвечает.
Работаю с ARM7 под Jtag. Проходил пошагово. В софте ошибок нет.
И может главное - работаю в SD-mode.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 30 2008, 10:52
Сообщение #4


Местный
***

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



Сделал ещё
send_comstr( CMD_8, 0x1AA, 6); // отвечает 08,00,00,01,AA
Не помогло.
Go to the top of the page
 
+Quote Post
abcdefg
сообщение Mar 31 2008, 13:32
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 201
Регистрация: 23-01-06
Из: Msk
Пользователь №: 13 490



аналогичная проблема, CMD55 проходит нормально, а на ACMD41 приходит ответ с busy-битом и неправильной CRC. Если разберетесь - дайте знать
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 1 2008, 11:11
Сообщение #6


Местный
***

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



Разобрался. Надо зажигать 30-й бит в ocr.

send_comstr(ACMD_41, ocr | (1<<30), 6);
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 3 2008, 10:22
Сообщение #7


Местный
***

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



C инициализацией разобрался.
Вот что непонятно, как адресовать блоки старше 4G?
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 8 2008, 12:38
Сообщение #8


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Не хотел создавать новую тему про SD, итак много, поэтому пишу сдесь.
C SPI режимом проблем не имею всё красиво работает, но не так быстро как это необходимо. В этой связи раэбираюсь с SD-mode. Подскажите пожалусто умные люди, не сочтите за труд, а то устал искать в доке ответы на столь простые вапросы, да и с англиским некоторые проблемы.
Вапросы:
1)Как посчитать CRC для разных команд? или где взять посчитаные?
2)И команды и ответы на команды по линии CMD?
3)В SD-mode данные поступают по 4-м линиям, порядок бит? Как распазнаётся первый байт данных?

Спасибо! С остальным думаю сам разберусь.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 9 2008, 07:13
Сообщение #9


Местный
***

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



Цитата(skripach @ Apr 8 2008, 15:38) *
1)Как посчитать CRC для разных команд? или где взять посчитаные?

Код
unsigned char calc_crc7(unsigned char *ptr, signed char count ){
  char crc=0;
  unsigned char i,data;
  while (count--) {
    data=*ptr++;
    for (i=0;i<8;i++) {
      crc <<= 1;
      if ((data & 0x80)^(crc & 0x80)) crc ^=0x09;
      data <<= 1;
    }
  }
  return((crc<<1)|1);
}


Цитата(skripach @ Apr 8 2008, 15:38) *
2)И команды и ответы на команды по линии CMD?

Да.

Цитата(skripach @ Apr 8 2008, 15:38) *
3)В SD-mode данные поступают по 4-м линиям, порядок бит? Как распазнаётся первый байт данных?

Всегда старшим вперед. При 4-линиях старшая тетрада вперед.
После отсылки команды на чтение данных ждем(не забывая CLC) "0" на DAT0 - это стартовый бит. Далее пошли данные.
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 9 2008, 11:13
Сообщение #10


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Спасибо, с СRC правда уже и сам разобрался.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 10 2008, 10:45
Сообщение #11


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



А можно пару примеров команд с правильно посчитаной CRC, хочу проверить свою функцию.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 10 2008, 11:57
Сообщение #12


Местный
***

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



40 00 00 00 00 95 CMD_0
77 00 00 00 00 65 CMD_55
69 00 00 00 00 e5 ACMD_41
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 10 2008, 13:16
Сообщение #13


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Спасибо, проверил, всё работает. После отладки выложу свою функцию по расчёту CRC7 (ASM i8051), может кому-то пригодится.

Сообщение отредактировал skripach - Apr 10 2008, 13:17


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 10 2008, 22:59
Сообщение #14


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



В архиве моя функция по расчету CRC7 с подробнейшими коментариями + пример 'ручного' расчета + дока по CRC вообще.

Надеюсь кому-то будет полезно.

P.S. Возможно функция не самая оптимальная но работает.
Прикрепленные файлы
Прикрепленный файл  CRC7.rar ( 282.14 килобайт ) Кол-во скачиваний: 224
 


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 13 2008, 11:56
Сообщение #15


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Ещё вапросик:
Шлю карте след. команды
cmd0 - ответа нет
cmd55 - отвечает 37 00 00 01 20 83
acmd41 - ответа нет
Так и должно быть?????????
Все команды с нулевым аргументом, карта Apacer 2gb 60x.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 14 2008, 06:59
Сообщение #16


Местный
***

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



Цитата(skripach @ Apr 13 2008, 14:56) *
cmd0 - ответа нет
cmd55 - отвечает 37 00 00 01 20 83
acmd41 - ответа нет

На 41 должна отвечать. 3f 00 ff 80 00 ff или подобное.
Карта случаем не HC?
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 14 2008, 11:26
Сообщение #17


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Нет карта не HC.
Уже не знаю на что грешить. На CMD0 не должно быть ответа?
После включения шлю CMD0, потом CMD55 и ACMD41 в цикле, но из цикла не выходит(т.е. на CMD41 нет ответа). Ответа на команду каждую команду жду 255 клоков. Да, второй ответ(когда в цикле крутится) на CMD55 - 37 00 80 01 20 09, на ACMD41 нет никогда ответа(секунд 30 ждал). Пробовал на разной частоте, даже под JTAGом если проходить по шагам одно и тоже:
cmd0 - ответа нет
cmd55 - отвечает 37 00 00 01 20 83
acmd41 - ответа нет
P.S. Как я понял на CMD55 ответ правильный?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 14 2008, 11:41
Сообщение #18


Местный
***

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



CMD55 ответ правильный.
Ну что еще может быть, вот например:
ACMD41 -- No response (non valid command) must be an MMC -- Start MMC initialization process starting at CMD1
Go to the top of the page
 
+Quote Post
skripach
сообщение Apr 14 2008, 13:11
Сообщение #19


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Заработало, отвечает на ACMD41 как вы и говорите 3f 00 ff 80 00 ff. Заработало после того как добавил после чтения ответа на CMD55 ещё 255 'пустых' клоков. При чем отвечает с первого раза.

Спасибо за помощ.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 20 2008, 07:59
Сообщение #20


Местный
***

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



Цитата(skripach @ Apr 11 2008, 01:59) *
В архиве моя функция по расчету CRC7

Я пошел дальше.
По скольку работаю с ARM, памяти немеряно, решил сделать табличный вариант.
Таблица генерится в RAM при запуске, далее по определению.
!!
!!
Скорость общения с картой поднялась на порядок!
Код
#define CRC7_POLYNOMIAL 0x89            /* x^7 + x^3 + 1 */
static unsigned char crc7_syndrome_table[256];

void gen_crc7_syndrome_table (void) {
  int i, j, syndrome;
  for (i = 0;  i < 256;  ++i) {
      syndrome = ((i & 0x80) != 0)? i ^ CRC7_POLYNOMIAL : i;
      for (j = 0;  j < 7;  ++j)
        if (((syndrome <<= 1) & 0x80) != 0)  syndrome ^= CRC7_POLYNOMIAL;
      crc7_syndrome_table[i] = (unsigned char) syndrome;
  }
}

char crc7 (const unsigned char *ptr) {
  unsigned char i, crc7_accum = 0;
  for (i = 0;  i < 5;  ++i)  // 6 - адаптировано для SD
    crc7_accum = crc7_syndrome_table[(crc7_accum << 1) ^ *ptr++];
  return ((crc7_accum<<1)|1);  // адаптировано для SD (+ стоп бит)
}
Go to the top of the page
 
+Quote Post
gnomik_
сообщение Nov 9 2009, 04:59
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 6-11-09
Пользователь №: 53 443



Здравствуйте. Работал с SD картами в SPI режиме. Но возникла необходимость заставитьработать карту в SD режиме. Пожалуйста поделитесь полным (не обрезанным) Даташитом. help.gif

Спасибо всем кто отзовется.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 13:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01523 секунд с 7
ELECTRONIX ©2004-2016