Jump to content

    

SDHC SPI Kingston 8Гб, ACMD41 Halt.

Фсем ПРИВЕТ ! парни, помoгите бедолаге. имею 4Гб микро СДху неизвестного производителя. на ACMD41 пару раз отвечает 01, после чего как и положенно 0. после нуля запрашиваю CMD58-> C0 00 FF 80 00. значит вышла из idle state. ставлю kingston 8GB - 6 раз 0x01, после чего вечный FF. всю гуглю изрыл, у буржуев такую же проблему видел. решения не нашёл. я уж и меж CMD55 и 41 CS-сом дрыгаю, и ваще всё, всё ,всё. ну не отвечает и всё тут - валится в игнор. но на комманду 0 и последующую 8 отвечает как надо.

Edited by trientxp

Share this post


Link to post
Share on other sites

Перед ACMD41 выполнить CMD58 не пробовали? Она только "рекомендуется", но, кажется, попадались мне карты, которые без неё не инициализировались.

Share this post


Link to post
Share on other sites

R1+respond= 01 00 FF 80 00. да, и не раз - подаю в ручную. даже пытался ЦРЦ правильную в эти комманды запихнуть. всё равно 0x01 6 раз и вечный сон ФФ. а, да, даже электролит 200 мкФ к карте прицепил.

Edited by trientxp

Share this post


Link to post
Share on other sites

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 )

Edited by trientxp

Share this post


Link to post
Share on other sites
cmd41: 0x69, 0x40,0,0,0

Замените на "0x69, 0x40, 0x10, 0, 0" - вы не посылаете карте информацию о своем напряжении, поэтому она и уходит в inactive state.

 

CRC, по-моему, лучше один раз включить и использовать постоянно.

Share this post


Link to post
Share on other sites

не помогло. я и FF80 от комманды 58 подсовывал, и пробежался ротируя 1-цу от 0x69 40 00 01 00 до 0x69 40 80 00 00. на комманду 55, 41 оба раза ответила 01, а на следующий цикл не отвечала уже на CMD55.

Edited by trientxp

Share this post


Link to post
Share on other sites

Может быть по питанию случается провалъ. Дело не в только конденсаторе, а в потолке источника.

Edited by GetSmart

Share this post


Link to post
Share on other sites

питал от USB. Точнее от USB - HID (3V LPC2148) переходника, с помощью которого и передаю комманды. из чего я делаю вывод, что если бы и были провалы, то они этот же переходник с собой утягивали, что с компа понять очень легко - INVALID DEVICE HANDLE получил бы. осциолографом бороды не увидел. карточка USB-SD/MicroSD переходником читается на ура.

Edited by trientxp

Share this post


Link to post
Share on other sites

Тогда пора показывать код инициализации (исходник). Или ещё можно самостоятельно проверить несколько выложенных на этом форуме (а так же Чена из фатфс) алгоритмов инициализаций и объявить здесь, что они тоже с этой карточкой не работают.

 

И обозначить предельный ток используемого 3-вольтового стабилизатора.

Edited by GetSmart

Share this post


Link to post
Share on other sites

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 не принимаю последний бит.

Share this post


Link to post
Share on other sites

нашёл проблему. действительно, борода по питанию. дома на цифровом осциолографе не увидел, а вот на работе на лучевом рассмотрел - при посылке комманды 0x08 был провал чуть ли не 0,5V. оказалось в цепи 3V был резючок 10 Ом. убрал его и всё попёрло. Всем спасибо, тему можно закрыть. правда я рассмотрел после того как скинул 200мкФ и повесил тантал гдет под микрофараду.

Edited by trientxp

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this