Karta SD - dziwne zachowanie zasilania

Wczoraj pisałem, że próbuję walczyć z uruchomieniem karty SD na PIC32. Kod niby sprawdzony i przetestowany (FatFS) a u mnie pojawiały się jakieś dziwne problemy z inicjacją pracy karty. Chwilę zajęło mi dojście do tego, że błąd najpewniej nie jest programowy, a sprzętowy. Na chwilę obecną w przypadku braku karty w slocie funkcja f_open zwraca błąd 3 (). Gdy karta jest w slocie pojawia się błąd 13 ().

Początkowo szukałem winy po stronie karty albo konfiguracji biblioteki. Okazuje się jednak, że od czasu do czasu (raz na kilkadziesiąt przełożeń karty/restartów całego układu) układ zaczyna pracować prawidłowo, zapisując dane na karcie bez zgłaszania jakichkolwiek błędów.

Pomyślałem, że winę może ponosić brak kluczowana zasilaniem karty, w związku z czym nie jest wykonywany pełen cykl jej resetu przy inicjacji. Podłączyłem więc kartę do zasilania przez tranzystor PNP i filtr LC (10uH, 1uF) - identyczny układ stosowałem w moich projektach na AVR-ach, z którymi nie miałem żadnych problemów. Gdy tranzystor był w stanie przewodzenia wszystko wyglądało dobrze - na pienie VCC było około 3,2V. Jednak po wyłączeniu tranzystora okazało się, że napięcie nie spada do zera, ale utrzymuje się na stałym poziomie około 2,5V.

Rezystory podciągające linie CS i CD były podpięte do plusa zasilania ZA tranzystorem, a pomimo tego napięcie się tam pojawiało. Żadne wewnętrzne pull-upy w mikrokontrolerze nie były aktywne. Efekt pojawia się także po fizycznym usunięciu tranzystora. Nie występuje, gdy kartę wyjmę ze slota - wówczas napięcie spada do zera.

Jakiś pomysł skąd się berze taki efekt?

Reply to
Atlantis
Loading thread data ...

Napięcie z linii io pojawi się na odłączonym Vcc poprzez diody zabezpieczające linie io w układzie. Czasami stosuje się takie zasilanie z linii io a nie Vcc w układach z zasilaniem pasożytniczym.

Reply to
Marek

W dniu 2016-01-01 o 16:47, Marek pisze:

Jak w takim razie powinien wyglądać układ, aby to zjawisko nie występowało, pozwalając na przeprowadzenie resetu karty? Czyby PIC32 miał inaczej zbudowane piny GPIO? Bo o ile mnie pamięć nie myli, to tam taki efekt nie występował.

Reply to
Atlantis

Nie bardzo rozumiem, każdy mcu możesz zasilać z io a nie z Vcc (pod pewnymi warunkami), tutaj masz to omówione:

formatting link

Podciągi karty powinny być do Vcc karty a nie Vcc całego układu. Wtedy kluczując Vcc karty masz pewność, na pewno odcinasz jej Vcc. Ale tak na marginesie.nie stosowałem kluczowania Vcc kart sd i nie kojarzę abym napotkał przy kartach sd opisywany przez Ciebie problem. Podejrzewam, ze być może jednak driver spi jaki używasz nieprawidłowo inicjuje kartę np. brak spi lowbitrate przy inicjalizacji (przyspieszyć spi można dopiero po inicjalizacji).

Reply to
Marek

W dniu 2016-01-01 o 19:01, Marek pisze:

Hmm... Masz może działającą wersję mmc.c? Bo siedzę na tym już kolejną godzinę i za nic nie mogę zmusić ukłdu do stabilnej pracy. W kółko wywala albo bład 3, albo 13. Jeśli już ruszy, to od wielkiego święta i nie ma żadnej pewności, że stan taki utrzyma się po kolejnym resecie.

Obecna konfiguracja wygląda następująco:

1) Osoba linia zasilania dla karty, kluczowana tranzystorem i filtrowana LC. 2) Wszystkie linie karty podciągnięte do tej linii rezystorami 4,7k. To znaczy wszystkie z wyjątkiem DC - ta jest podłączona do ogólnego VCC. 3) w funkcji power_on() konfiguruję wyjścia i ustawiam PPS. W power_off() wyłączam funkcję PPS dla MOSI i z powrotem przestawiam wszystkie wyjścia na wejścia.

Generalnie wygląda to następująco:

static void power_on (void) { PWR_SETOUT(); PWR_ON(); for (Timer1 = 150; Timer1; ); /* Wait for 150ms */

/* Setup SPI2 */ // Setup CS as output CS_SETOUT(); MISO_SETIN(); MISO_SETPPS(); MOSI_SETOUT(); MOSI_SETPPS(); // configured for ~400 kHz operation - reset later to 20 MHz SpiChnOpen(SPI_CHANNEL2,SPI_OPEN_MSTEN|SPI_OPEN_CKP_HIGH|SPI_OPEN_SMP_END|SPI_OPEN_MODE8,64); SPI2CONbits.ON = 1; }

static void power_off (void) { select(); /* Wait for card ready */ deselect();

SPI2CONbits.ON = 0; /* Disable SPI2 */

Stat |= STA_NOINIT; /* Set STA_NOINIT */

PWR_OFF(); CS_SETIN(); MOSI_RESTOREPPS(); MOSI_SETIN(); for (Timer1 = 150; Timer1; ); /* Wait for 40ms */

}

Jak widzisz SPI startuje na małej prędkości.

Zresztą w disk_initialize są wywoływane jeszcze dwie makrodefinicje: #define FCLK_SLOW() SPI2BRG = 64 /* Set slow clock (100k-400k) */ #define FCLK_FAST() SPI2BRG = 2 /* Set fast clock (depends on the CSD) */

Reply to
Atlantis

Mam własny, sprawdzony driver, wyślę Ci na maila.

Reply to
Marek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.