lwh
Guest
Sun Oct 21, 2007 8:01 pm
Próbuję użyć karty SD 512MB z mikrokontrolerem.
Umiem z niej odczytywać, a nie potrafię do niej zapisywać.
Po komendzie CMD24 odpowiada np. 3F 04 80 (błędy ?) , albo FF 00 00 00
(dużo zer aż dojdzie znowu do FF) zamiast oczekiwanego FF 00 FF. Wymuszenie
zapisu FE dane CRC nie skutkuje odpowiedzią x5 00 00 00. Jest FF FF FF
Próbowałem z innymi kartami, bez sukcesu. Karty w PC-cie są sprawne.
Na różnych forach internetowych wielu zgłasza taki sam problem: umie
odczytać, ale nie zapisać.
Czy ktoś może mi pomóc rozwiązać problem ? Gdzie szukać przyczyn ? W
sprzęcie (podłączenie przez oporniki do 5V, długie ścieżki , za szybki/wolny
zegar (10MHz), ....) czy programie ? Czy dla zapisu bloku 512B oprócz CMD24
trzeba jeszcze jakieś komendy, (może one mają blokadę przed zapisem, którą
trzeba wyłączyć) ?
Michał
Guest
Sun Oct 21, 2007 8:15 pm
Użytkownik "lwh" <lI@vp.pl> napisał w wiadomości
news:ffg7lo$98j$1@news.onet.pl...
Quote:
Próbuję użyć karty SD 512MB z mikrokontrolerem.
Umiem z niej odczytywać, a nie potrafię do niej zapisywać.
Po komendzie CMD24 odpowiada np. 3F 04 80 (błędy ?) , albo FF 00 00 00
(dużo zer aż dojdzie znowu do FF) zamiast oczekiwanego FF 00 FF.
Wymuszenie zapisu FE dane CRC nie skutkuje odpowiedzią x5 00 00 00. Jest
FF FF FF
Próbowałem z innymi kartami, bez sukcesu. Karty w PC-cie są sprawne.
Na różnych forach internetowych wielu zgłasza taki sam problem: umie
odczytać, ale nie zapisać.
Czy ktoś może mi pomóc rozwiązać problem ? Gdzie szukać przyczyn ? W
sprzęcie (podłączenie przez oporniki do 5V, długie ścieżki , za
szybki/wolny zegar (10MHz), ....) czy programie ? Czy dla zapisu bloku
512B oprócz CMD24 trzeba jeszcze jakieś komendy, (może one mają blokadę
przed zapisem, którą trzeba wyłączyć) ?
Trochę OT. Wiesz może gdzie znaleźć dobry opis dla kart SD? Mam dla MMC, a
do SD nie udało mi się znaleźć.
Pozdrawiam
lwh
Guest
Sun Oct 21, 2007 8:38 pm
Użytkownik "Michał" <mmmm@edwew.pl> napisał w wiadomości
news:ffg8he$1jm$1@atlantis.news.tpi.pl...
Quote:
Trochę OT. Wiesz może gdzie znaleźć dobry opis dla kart SD? Mam dla MMC, a
do SD nie udało mi się znaleźć.
Dobry ? Gdybym miał dobry, to bym wiedział czemu mi nie działa
Mam tylko tyle ile linków znalazłem na forum elektrody , wikipedii i
bezpośrednim szukaniem
Wszystko co mam o SD to specyfikacja 1.9 i 2..2 i kilka przykładowych
programów w różnych językach.
O MMC też mam podobnie mało.
MMC mobile, plus też mi nie działają, albo działają tak samo -nie potrafię
zapisać.
Ponoć są kompatybilne, mimo, że mają mnóstwo "nóg".
Na dodatek MMCPlus 512MB, jaką mam, ma "parszywą" właściwość, z się blokuje
(daje na wyjściu stan niski) przy ponownej inicjalizacji. Trzeba wyłączać
zasilanie.
"Zwykłej" MMC kupić nie umiem, zresztą byłby to zabytek, a "modyfikacje" są
dostępne wszędzie.
Ta strona po polsku wydaje się ciekawa
http://kju.wemif.net/mmc/ .
Dziwi, mnie, ze o zapisie SD/MMC nic nie ma. Czego nie wiem ? Cos jest
tajne, płatne ?
Wielu zrobiło obsługę tych kart mikrokontrolerem z sukcesem.
Marek Wodzinski
Guest
Sun Oct 21, 2007 9:48 pm
lwh wrote:
Quote:
Próbuję użyć karty SD 512MB z mikrokontrolerem.
Umiem z niej odczytywać, a nie potrafię do niej zapisywać.
Po komendzie CMD24 odpowiada np. 3F 04 80 (błędy ?) , albo FF 00 00 00
(dużo zer aż dojdzie znowu do FF) zamiast oczekiwanego FF 00 FF.
Dlaczego oczekujesz FF00FF?
Po CMD24 karta sobie zapisuje a ty czekasz na koniec sprawdzając
najstarszy bit odpowiedzi (busy). Jak jest 0, to lecisz dalej z zapisem.
Quote:
W
sprzęcie (podłączenie przez oporniki do 5V, długie ścieżki , za
szybki/wolny zegar (10MHz), ....) czy programie ?
Zasilasz kartę poprawnym napięciem?
Przy wysyłaniu CMD taktujesz spi zegarem max 400kHz (o ile dobrze
pamiętam)? Podnieść f zegara możesz dopiero w fazie przesyłania danych.
Podajesz początkowy adres do zapisu w bajtach?
Quote:
Czy dla zapisu bloku
512B oprócz CMD24 trzeba jeszcze jakieś komendy, (może one mają blokadę
przed zapisem, którą trzeba wyłączyć) ?
Trzeba ustawić długość bloku w CMD16 na 512, ale to chyba masz.
Wystarczy to zrobić raz, np. przy inicjalizacji karty.
U mnie działa na różnych SD (od 16MB do 2GB) i zwykłej MMC. Na innych
nie sprawdzałem. Kod możesz sobie ściągnąć z mojego projektu (w sumie z
niewielkimi przeróbkami jest to to samo co w yamppie)
http://majek.mamy.to/gps/ (procedury sd_write i sd_cmd).
pozdrawiam
majek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg
Marek Wodzinski
Guest
Sun Oct 21, 2007 10:03 pm
lwh wrote:
Quote:
Próbuję użyć karty SD 512MB z mikrokontrolerem.
Umiem z niej odczytywać, a nie potrafię do niej zapisywać.
Po komendzie CMD24 odpowiada np. 3F 04 80 (błędy ?) , albo FF 00 00
00 (dużo zer aż dojdzie znowu do FF) zamiast oczekiwanego FF 00 FF.
Dlaczego oczekujesz FF00FF?
Po wysłaniu CMD24 karta coś sobie robi, a ty czekasz na koniec
sprawdzając najstarszy bit odpowiedzi (busy). Jak jest 0, to lecisz
dalej z zapisem.
Quote:
W sprzęcie (podłączenie przez oporniki do 5V, długie ścieżki , za
szybki/wolny zegar (10MHz), ....) czy programie ?
Zasilasz kartę poprawnym napięciem?
Przy wysyłaniu CMD taktujesz spi zegarem max 400kHz (o ile dobrze
pamiętam)? Podnieść f zegara możesz dopiero w fazie przesyłania danych.
Podajesz początkowy adres do zapisu w bajtach?
Quote:
Czy dla zapisu bloku
512B oprócz CMD24 trzeba jeszcze jakieś komendy, (może one mają
blokadę przed zapisem, którą trzeba wyłączyć) ?
Trzeba ustawić długość bloku w CMD16 na 512, ale to chyba masz.
Wystarczy to zrobić raz, np. przy inicjalizacji karty.
U mnie działa na różnych SD (od 16MB do 2GB) i zwykłej MMC. Na innych
nie sprawdzałem. Kod możesz sobie ściągnąć z mojego projektu (w sumie z
niewielkimi przeróbkami jest to to samo co w yamppie)
http://majek.mamy.to/gps/ (procedury sd_write i sd_cmd).
pozdrawiam
majek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg
lwh
Guest
Mon Oct 22, 2007 8:59 am
Użytkownik "Marek Wodzinski" <majek@ODSPAMIACZ.mamy.to> napisał w wiadomości
news:ffger9$604$3@atena.e-wro.net...
Quote:
Po komendzie CMD24 odpowiada np. 3F 04 80 (błędy ?) , albo FF 00 00
00 (dużo zer aż dojdzie znowu do FF) zamiast oczekiwanego FF 00 FF.
Dlaczego oczekujesz FF00FF?
Bo tak było na pewnym obrazku z przebiegami czasowymi
Quote:
Po wysłaniu CMD24 karta coś sobie robi, a ty czekasz na koniec sprawdzając
najstarszy bit odpowiedzi (busy). Jak jest 0, to lecisz dalej z zapisem.
3F, 04,00 mają najstarszy bit =0
Bez względu wymuszony na moment wysłania FE, efektu brak
Quote:
W sprzęcie (podłączenie przez oporniki do 5V, długie ścieżki , za
szybki/wolny zegar (10MHz), ....) czy programie ?
Zasilasz kartę poprawnym napięciem?
Co do tego mam najwięcej watpliwości.
Może mój stabilizator 3V3 ma jakiś problem z odpowiedzią dynamiczną, jeśli
ta karta pobierałaby ogromny prąd w impulsie?. Wydajność statyczna,
zwarciowa mojego stabilizatora to 300mA i spada do 0,25A jak scalak robi się
gorący. Przy obciążeniu opornikiem 33 Omy jest 3,28V. Jałowo 3,29V Przy
obciążeniu opornikiem 10 Om, jest 2,87V. Mam stabilizator 50mA LP2980, bo
wydawal mi się odpowiedni (mały, tani, z łapką wyłączenia) i widzę, ze on
nie ma ogranicznika zaraz po znamionowym prądzie.
Co to znaczy , że karta jest dwunapięciowa ? Przy zapisie trzeba jej dac
mniej niż 1,95V ? (mam nadzieję, że nie trzeba, a można). Opcji dwóch napięć
nie przewidzialem. Zasilam ciagle 3V3. OCR zgłasza kod napięcia w MMCmobile
80 (dwunapięciowa), w innych 00 (jednonapięciowe).
Quote:
Przy wysyłaniu CMD taktujesz spi zegarem max 400kHz (o ile dobrze
pamiętam)? Podnieść f zegara możesz dopiero w fazie przesyłania danych.
To testowałem na różne sposoby od pojedyńczych Herców do 10MHz. To na nic
nie ma wpływu (w kilku wypowiedziach na roznych forach spotkalem się z tą
samą opinią.), a nawet jest gorzej przy obniżonym do Hz taktowaniu.
Wg tego co zrozumiałem z opisów, wymóg 400kHz dotyczył najstarszych kart MMC
z open drain. Dziś został zachowany jako kompatybilność w tył. Wg mojej
oceny jest zbędny w nowych tajwańskich i chińskich kartach, mimo, że to
ponoć nie spełnia standardu.. One są przystosowane na zegar 26MHz, 52MHz. Ja
umiem z mojego mikrokontrolera dać co najwyżej 10MHz. Nie jest moim celem
obsługa kart 8MB. Najmniej dziś do łatwego kupienia to 512MB,a w zasadzie
pospolite to od 1GB.
Quote:
Podajesz początkowy adres do zapisu w bajtach?
Oczywiście. Umiem odczytać, to co wpisałem pod windows i adres sprawdziłem
winhexem i podobnymi programami i staram się to nadpisać. Bez względu na
adres (czy 00 00 00 00 czy 10 00 00 00 czy jakikolwiek inny z końcówką xx0
00) nie umiem nic wpisać.
Quote:
Czy dla zapisu bloku
512B oprócz CMD24 trzeba jeszcze jakieś komendy, (może one mają
blokadę przed zapisem, którą trzeba wyłączyć) ?
Trzeba ustawić długość bloku w CMD16 na 512, ale to chyba masz.
Mam. Z CMD16 i bez tego bez zmian. Domyślnie ponoć jest to ustawiane na 512B
i nie ma innej opcji.
Z kolejnością CMD1 , ACMD41 też nie widzę różnic. Wg mnie dobrze rozróżnia
MMC od SD.
Quote:
Wystarczy to zrobić raz, np. przy inicjalizacji karty.
U mnie działa na różnych SD (od 16MB do 2GB) i zwykłej MMC. Na innych nie
sprawdzałem. Kod możesz sobie ściągnąć z mojego projektu (w sumie z
niewielkimi przeróbkami jest to to samo co w yamppie)
http://majek.mamy.to/gps/ (procedury sd_write i sd_cmd).
Ten projekt też oglądałem kilka dni temu.
Marek Wodzinski
Guest
Mon Oct 22, 2007 11:52 am
lwh wrote:
Quote:
Użytkownik "Marek Wodzinski" <majek@ODSPAMIACZ.mamy.to> napisał w
wiadomości news:ffger9$604$3@atena.e-wro.net...
Po komendzie CMD24 odpowiada np. 3F 04 80 (błędy ?) , albo FF 00 00
00 (dużo zer aż dojdzie znowu do FF) zamiast oczekiwanego FF 00 FF.
Dlaczego oczekujesz FF00FF?
Bo tak było na pewnym obrazku z przebiegami czasowymi
Zmusiłeś mnie do odkopania dokumentacji:-)
Po wysłaniu CMD24 możesz dostać od 1 do 8 razy FF zanim dostaniesz 1
bajt statusu R1. Nie wiem po co odczytujesz i sprawdzasz następny bajt.
Jeżeli od razu po CMD24 dostajesz 3F..., to może masz jakieś problemy z
transmisją z karty (kable?). Procesor zasilasz tym samym napięciem co
kartę czy konwertujesz poziomy?
Quote:
Bez względu wymuszony na moment wysłania FE, efektu brak
Jeżeli dostaniesz odpowiedź 00 (po iluśtam FF) to wysyłasz 1 FF, po nim
FE i dane+CRC.
Quote:
Zasilasz kartę poprawnym napięciem?
Co do tego mam najwięcej watpliwości.
Może mój stabilizator 3V3 ma jakiś problem z odpowiedzią dynamiczną,
jeśli ta karta pobierałaby ogromny prąd w impulsie?. Wydajność
statyczna, zwarciowa mojego stabilizatora to 300mA i spada do 0,25A jak
scalak robi się gorący.
Karta nie powinna przekraczać 200mA (typowo o wiele mniej), więc tu
powinno być ok. Sam używam na 3.3V i 2.9V bez problemu, natomiast
stabilizatory mam na razie na 1A, chociaż planuję miniaturyzację na
LP2951 - może się uda.
Z resztą jakbyś chciał, to z CSR karty możesz odczytać ile karta wymaga
prądu.
Quote:
Co to znaczy , że karta jest dwunapięciowa ?
Tego niestety nie drążyłem. Jak się dowiesz, to daj znać:-)
Jeszcze z mojego projektu: też miałem na początku problemy z zapisem.
'Na stole' wszystko działało, ale jak zaczął dostawać prawdziwe dane
(dużo), to czasem miałem błędy zapisu. Okazało się, że w którymś
przerwaniu zapomniałem wrzucić rejestr flag na stos. Jak przyszło
przerwanie w czasie zapisu karty, to się krzaczyło.
pozdrawiam
majek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg
lwh
Guest
Mon Oct 22, 2007 11:27 pm
Użytkownik "Marek Wodzinski" <majek@ODSPAMIACZ.mamy.to> napisał w wiadomości
news:ffhvdl$5dq$1@atena.e-wro.net...
Quote:
(dużo), to czasem miałem błędy zapisu. Okazało się, że w którymś
przerwaniu zapomniałem wrzucić rejestr flag na stos. Jak przyszło
przerwanie w czasie zapisu karty, to się krzaczyło.
Jak to mówią prawa Murphy'ego ? Jak coś można spierdolić, to w najmniej
oczekiwanym miejscu ?
Wykryłem przyczynę moich problemów, po długotrwałych testach. Udało mi się
zrobić przed chwilą oczekiwany zapis. Winny był program.
Dla potomnych, bo może się to komuś przyda:
Wcześniej odczytywałem dane. Niestety nie wszystkie, bo licznik ilości
bajtów był zły. Następne takty zegarowe SD wykorzystywał do dalszego
odczytu, nie reagując prawidłowo na żadną komendę. Bzdury, które uważałem,
za odpowiedź na CMD24 i inne komendy były resztą danych odczytu:-(
Rozruchowe <400kHz, CMD16 są zbędne. Oporniki do konwersji poziomów 5V/3V i
maleńki stabilizator 3V3 są wystarczające.