Приветствую Вас Гость | RSS


Главная страница » Про СДкарточки - ZX-Форум » Регистрация » ВходВторник
2024-04-16
19:51:05
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
ZX-Форум » Hardware » Hardware » Про СДкарточки (про сорцы работы с ними)
Про СДкарточки
lvdДата: Вторник, 2008-06-10, 01:02:06 | Сообщение # 1
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
Короче, поипавшись, как водится, с СДкарточкой, нащупал алго инициализации.

Послать команду, далее ждать, пока неФФ ответит. И СЧИТАТЬ ПОЛНОСТЬЮ ВСЕ 6 байт ответа (включая и этот неФФ).

Пока это не сделал - ничего не работало или глючило, или ругалось инвалидной командой, или просто из слипа не выходило по CMD1.
Все вокруг (смотрел пару сорцов) все 6 байт не читают... А у Савелия вообще ахтунг - если ACMD41 не ответил нулём с первого же байта, то вся команда заново перепосылается...

Вон пусть независимое лицо (например, Романыч) подтвердит или опровергнет.


Многого нет здесь: http://lvd.nedopc.com

Сообщение отредактировал lvd - Вторник, 2008-06-10, 01:02:26
 
RomanichДата: Вторник, 2008-06-10, 02:54:35 | Сообщение # 2
Младший одепт
Группа: Человеки
Сообщений: 578
Репутация: 1
Статус: Offline
моё рабочее (проверял на ММС):

Code
#define MMC_Slow SPI_CSR1=0x00004B02; //@400 kHz
#define MMC_Fast SPI_CSR1=0x00000202; //@15 MHz

#define MMC_CS(mmc_cs) \
{ \
  A_ODSR=(A_ODSR&0xFFFFFFEF)|(mmc_cs<<4); \
  PIOA_ODSR=A_ODSR; \
}

u32 A_ODSR=0x00000038;

u8 MMCBuffer[512]; //Буфер MMC-карточки

s8 DetectMMC(void) //Наличие MMC
{
  if(PIOA_PDSR&0x00000100) return -1;
  return 0;
}

u8 IO(u8 io)
{
  SPI_TDR=io|0x00010000;
  while((SPI_SR&3)!=3);
  return SPI_RDR;
}

s8 PrepareMMC(void) //Подготовка MMC к работе
{
  u8 b;
  MMC_Slow
  MMC_CS(1)
  for(b=0;b<10;b++) IO(0xFF);
  SimpleDelay(1000);
  MMC_CS(0)
  IO(0x40);
  IO(0);
  IO(0);
  IO(0);
  IO(0);
  b=IO(0x95);
  while(b==0xFF) b=IO(0xFF);
  if(b!=0x01)
  {
   MMC_CS(1)
   return -1;
  }
  CMD1:
  IO(0x41);
  IO(0);
  IO(0);
  IO(0);
  IO(0);
  b=IO(0xFF);
  while(b==0xFF) b=IO(0xFF);
  if(b!=0x00) goto CMD1;
  MMC_CS(1)
  MMC_Fast
  return 0;
}

s8 InMMC(u32 Sector) //Чтение сектора MMC
{
  u8 b;
  u16 i;
  Sector<<=9;
  MMC_CS(0)
  IO(0x51);
  IO(Sector>>24);
  IO(Sector>>16);
  IO(Sector>> 8);
  IO(Sector    );
  b=IO(0xFF);
  while(b==0xFF) b=IO(0xFF);
  if(b)
  {
   MMC_CS(1)
   return -1;
  }
  while(b!=0xFE) b=IO(0xFF);
  for(i=0;i<512;i++) MMCBuffer[i]=IO(0xFF);
  IO(0xFF);
  IO(0xFF);
  MMC_CS(1)
  return 0;
}


Живу схемами, питаюсь концепциями :)
http://emu-apparatchik.narod.ru
 
lvdДата: Вторник, 2008-06-10, 09:27:53 | Сообщение # 3
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
Вот именно - первый неФФ в ответе и всё. А так у меня не работает, надо весь ответ 6байтовый читать. Какая частота клока?

Многого нет здесь: http://lvd.nedopc.com
 
RomanichДата: Вторник, 2008-06-10, 10:04:06 | Сообщение # 4
Младший одепт
Группа: Человеки
Сообщений: 578
Репутация: 1
Статус: Offline
SPI Clock 15 MHz (написано в комменте сорца)

Живу схемами, питаюсь концепциями :)
http://emu-apparatchik.narod.ru
 
lvdДата: Вторник, 2008-06-10, 10:21:22 | Сообщение # 5
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
Quote (Romanich)
SPI Clock 15 MHz (написано в комменте сорца)

Ога, а когда иниты шлёшь, что-то на 400кгц переключаешь... Видимо, на 15мгц не работало happy
Попробуй, если не влом, читать по 6 байт начиная с неФФ в инитах, мож на 15 проканает? smile
Хотя 6 байт - это в СД, в ммц не знаю как.


Многого нет здесь: http://lvd.nedopc.com
 
RomanichДата: Вторник, 2008-06-10, 10:53:41 | Сообщение # 6
Младший одепт
Группа: Человеки
Сообщений: 578
Репутация: 1
Статус: Offline
> Ога, а когда иниты шлёшь, что-то на 400кгц переключаешь

вся инициализация на частоте 400 кГц

далее после инициализации работаем (читаем/пишем) на 15 МГц
(хотя до 24 МГц можно, просто делитель от MCK=60 МГц не позволяет)


Живу схемами, питаюсь концепциями :)
http://emu-apparatchik.narod.ru
 
lvdДата: Вторник, 2008-06-10, 12:49:44 | Сообщение # 7
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
Вот я и удивляюсь, почему это на 400 кгц ) Чай не i2c smile

Многого нет здесь: http://lvd.nedopc.com
 
savelijДата: Вторник, 2008-06-10, 19:33:43 | Сообщение # 8
Активист
Группа: Человеки
Сообщений: 158
Репутация: 0
Статус: Offline
Quote (lvd)
А у Савелия вообще ахтунг - если ACMD41 не ответил нулём с первого же байта, то вся команда заново перепосылается...

А на эту команду и будет сразу ответа, надо подавать команду пока не появится 0 вместо 1. Про это в спецификации нацарапано.
 
lvdДата: Вторник, 2008-06-10, 19:53:17 | Сообщение # 9
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
Quote (savelij)
А на эту команду и будет сразу ответа, надо подавать команду пока не появится 0 вместо 1. Про это в спецификации нацарапано.

Речь об чём:
1. на команды отвечает не сразу, перед ответом идут $FF. Потом уже ответ - с 0 или с 1. Вот, если ФФ, то не надо переподавать команду.
2. ответ на команду кмд1 (ну и акмд41, если не глючу) - 6 байт. Надо их все считать.


Многого нет здесь: http://lvd.nedopc.com
 
savelijДата: Вторник, 2008-06-10, 20:03:00 | Сообщение # 10
Активист
Группа: Человеки
Сообщений: 158
Репутация: 0
Статус: Offline
Quote (lvd)
Речь об чём: 1. на команды отвечает не сразу, перед ответом идут $FF. Потом уже ответ - с 0 или с 1. Вот, если ФФ, то не надо переподавать команду. 2. ответ на команду кмд1 (ну и акмд41, если не глючу) - 6 байт. Надо их все считать.

1. Вообще-то FF насколько я понимаю это исполнение команды и зачем их учитывать?
2. Откуда в ответ 6 байт, если код ответа из группы R1 и равен 1 байту. Спецификация нужна, там все расписано/разрисовано.


Сообщение отредактировал savelij - Вторник, 2008-06-10, 20:03:55
 
lvdДата: Вторник, 2008-06-10, 20:21:49 | Сообщение # 11
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
1. Я смотрю в исходки того, что в НедоПц5 послано: там и на кмд0, и на акмд41 логика работы такова, что если первый байт ответа не тот, что нужно (в том числе ФФ), то команда перепосылается. Я же утверждаю, что ответ на команду приходит не сразу, а после нескольких ФФ, которые обозначают, что ответа пока нет. Получается, что ты не дожидаешься ответа, а пинаешь карточку до упаду =)
Такое может прокатить, если карточку пинать медленно (как например у Романыча, или со спектрума). А если быстро (как у меня выходит: зетник на 12 мгц и частота СПИ-клока 6 мгц) - то не проканывает.

2. насколько я помню, ответ на кмд1 - R3, то есть 6 байт. Насчёт акмд41 не помню, не смотрел.


Многого нет здесь: http://lvd.nedopc.com
 
savelijДата: Вторник, 2008-06-10, 20:30:30 | Сообщение # 12
Активист
Группа: Человеки
Сообщений: 158
Репутация: 0
Статус: Offline
Quote (lvd)
1. Я смотрю в исходки того, что в НедоПц5 послано: там и на кмд0, и на акмд41 логика работы такова, что если первый байт ответа не тот, что нужно (в том числе ФФ), то команда перепосылается. Я же утверждаю, что ответ на команду приходит не сразу, а после нескольких ФФ, которые обозначают, что ответа пока нет. Получается, что ты не дожидаешься ответа, а пинаешь карточку до упаду =) Такое может прокатить, если карточку пинать медленно (как например у Романыча, или со спектрума). А если быстро (как у меня выходит: зетник на 12 мгц и частота СПИ-клока 6 мгц) - то не проканывает.

Ну на Z-контроллере инициализация на полной скорости происходит без переключений частоты (на какой частоте у КОЕ надо спросить). А карту пинать это не мой произвол.
Quote (lvd)

2. насколько я помню, ответ на кмд1 - R3, то есть 6 байт. Насчёт акмд41 не помню, не смотрел.

Да нет, как раз у обоих команд ответ R1 = 1 байт
 
KOEДата: Вторник, 2008-06-10, 23:52:18 | Сообщение # 13
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2318
Репутация: 5
Статус: Offline
Quote (savelij)
Ну на Z-контроллере инициализация на полной скорости происходит без переключений частоты (на какой частоте у КОЕ надо спросить).

8 МГц.

Quote (savelij)
А карту пинать это не мой произвол.

Угу, почти во всех открытых исходниках так. А иначе половина карт разных производителей не рабртает, похоже.


Мы рождены, чтоб сказку сделать былью
"Кто не обломался, тем еще предстоит"
 
lvdДата: Среда, 2008-06-11, 01:54:31 | Сообщение # 14
Retry, Abort, Ignore?
Группа: Человеки
Сообщений: 2528
Репутация: 13
Статус: Offline
Ага, напутал. Точно, везде 1 байт ответа.
Но вот страница 88 (по нумерации ридера) файла sdcard_full.pdf длиной 1174524 байтов, там про то, что после конца любой транзакции надо 8 клоков прохреначить. Наверное поэтому у меня так и вылечилось.

а на странице 99 там же нарисовано, что перед респонсом карточка может срать ФФами.


Многого нет здесь: http://lvd.nedopc.com
 
RomanichДата: Среда, 2008-06-11, 03:22:30 | Сообщение # 15
Младший одепт
Группа: Человеки
Сообщений: 578
Репутация: 1
Статус: Offline
Quote (lvd)
Я смотрю в исходки того, что в НедоПц5 послано...

Киньте в личку если не жалко, линк на недопц5


Живу схемами, питаюсь концепциями :)
http://emu-apparatchik.narod.ru


Сообщение отредактировал Romanich - Среда, 2008-06-11, 03:23:11
 
ZX-Форум » Hardware » Hardware » Про СДкарточки (про сорцы работы с ними)
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

the DLCorp © 2006