trientxp
Nov 5 2016, 17:41
Фсем ПРИВЕТ ! парни, помoгите бедолаге. имею 4Гб микро СДху неизвестного производителя. на ACMD41 пару раз отвечает 01, после чего как и положенно 0. после нуля запрашиваю CMD58-> C0 00 FF 80 00. значит вышла из idle state. ставлю kingston 8GB - 6 раз 0x01, после чего вечный FF. всю гуглю изрыл, у буржуев такую же проблему видел. решения не нашёл. я уж и меж CMD55 и 41 CS-сом дрыгаю, и ваще всё, всё ,всё. ну не отвечает и всё тут - валится в игнор. но на комманду 0 и последующую 8 отвечает как надо.
Перед ACMD41 выполнить CMD58 не пробовали? Она только "рекомендуется", но, кажется, попадались мне карты, которые без неё не инициализировались.
trientxp
Nov 5 2016, 18:15
R1+respond= 01 00 FF 80 00. да, и не раз - подаю в ручную. даже пытался ЦРЦ правильную в эти комманды запихнуть. всё равно 0x01 6 раз и вечный сон ФФ. а, да, даже электролит 200 мкФ к карте прицепил.
А какие аргументы передаются в CMD8 и ACMD41?
trientxp
Nov 6 2016, 06:20
DO=1;
CS=1; 1000 CLK; CS=0;1000CLK;CS=1;1000 CLK;
CS=0;CMD 0;CLK=8;
CS=0; cmd8: 0x48 0x00,0x00,0x01,0xAA 0x87;читаю R1 +0 0 1 AA ;CS=1;CLK=8;
cycle:
CS=0; cmd 55: 0x77 ,0,0,0,0, 0xFF; читаю R1; CS=1;CLK=8; (здесь пробовал црц=0x65 и (65<<1)|1 )
CS=0; cmd41: 0x69, 0x40,0,0,0 0xFF; читаю R1; CS=1;CLK=8;(здесь пробовал црц=0x77и (77<<1)|1 )
Цитата(trientxp @ Nov 6 2016, 09:20)

cmd41: 0x69, 0x40,0,0,0
Замените на "0x69, 0x40, 0x10, 0, 0" - вы не посылаете карте информацию о своем напряжении, поэтому она и уходит в inactive state.
CRC, по-моему, лучше один раз включить и использовать постоянно.
trientxp
Nov 6 2016, 10:27
не помогло. я и FF80 от комманды 58 подсовывал, и пробежался ротируя 1-цу от 0x69 40 00 01 00 до 0x69 40 80 00 00. на комманду 55, 41 оба раза ответила 01, а на следующий цикл не отвечала уже на CMD55.
GetSmart
Nov 6 2016, 14:04
Может быть по питанию случается провалъ. Дело не в только конденсаторе, а в потолке источника.
trientxp
Nov 7 2016, 03:42
питал от USB. Точнее от USB - HID (3V LPC2148) переходника, с помощью которого и передаю комманды. из чего я делаю вывод, что если бы и были провалы, то они этот же переходник с собой утягивали, что с компа понять очень легко - INVALID DEVICE HANDLE получил бы. осциолографом бороды не увидел. карточка USB-SD/MicroSD переходником читается на ура.
GetSmart
Nov 7 2016, 22:05
Тогда пора показывать код инициализации (исходник). Или ещё можно самостоятельно проверить несколько выложенных на этом форуме (а так же Чена из фатфс) алгоритмов инициализаций и объявить здесь, что они тоже с этой карточкой не работают.
И обозначить предельный ток используемого 3-вольтового стабилизатора.
trientxp
Nov 8 2016, 03:36
unsigned char SendRecSPI(unsigned char dat){
unsigned char temp;
temp =PDI();temp<<=1;
PDO(dat>>7);SCK(1);delay(1);SCK(0);delay(1); temp|=PDI();temp<<=1;
PDO(dat>>6);SCK(1);delay(1);SCK(0);delay(1); temp|=PDI();temp<<=1;
PDO(dat>>5);SCK(1);delay(1);SCK(0);delay(1);temp|=PDI();temp<<=1;
PDO(dat>>4);SCK(1);delay(1);SCK(0);delay(1);temp|=PDI();temp<<=1;
PDO(dat>>3);SCK(1);delay(1);SCK(0);delay(1);temp|=PDI();temp<<=1;
PDO(dat>>2);SCK(1);delay(1);SCK(0);delay(1); temp|=PDI();temp<<=1;
PDO(dat>>1);SCK(1);delay(1);SCK(0);delay(1);temp|=PDI();
PDO(dat); SCK(1);delay(1);SCK(0);delay(1);
return temp;
}
unsigned char SD_CMD(unsigned char *cmd,unsigned char *respond,unsigned int read_cnt, unsigned int timeout){
unsigned char t;
t=*cmd;
CS(0);
SendRecSPI(255);
SendRecSPI(0x7F&(*(cmd++)));
SendRecSPI(*(cmd++));
SendRecSPI(*(cmd++));
SendRecSPI(*(cmd++));
SendRecSPI(*(cmd++));
SendRecSPI(1|(*(cmd++)));
while((timeout--)>0){
*respond=SendRecSPI(255);
if (*respond!=255) break;
if (timeout==1) return 1;
}//timeout
respond++;
while((read_cnt--)>0) *(respond++)=SendRecSPI(255);
//if (t!=0x40|55)
CS(1);
SendRecSPI(255);
return 0;
}
стабилизатор - TPS76333. вот только заметил что в функции SendRecSPI не принимаю последний бит.
trientxp
Nov 8 2016, 12:19
нашёл проблему. действительно, борода по питанию. дома на цифровом осциолографе не увидел, а вот на работе на лучевом рассмотрел - при посылке комманды 0x08 был провал чуть ли не 0,5V. оказалось в цепи 3V был резючок 10 Ом. убрал его и всё попёрло. Всем спасибо, тему можно закрыть. правда я рассмотрел после того как скинул 200мкФ и повесил тантал гдет под микрофараду.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.