Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[PIC32] [SD/MMC] Busy time

Jado_one 21 Lut 2012 22:25 1508 5
  • #1 21 Lut 2012 22:25
    Jado_one
    Poziom 22  

    Witam,

    Doszlifowywuję procedurkę obsługi kart SD/MMC i w związku z tym mam pytanko.
    Po przesłaniu danych (zapis sektora) do karty, następuje czas oczekiwania na wykonanie się operacji zapisu. Karta w tym czasie wystawia stan logiczny 0 na wyjsciu DO. Po skończonym zapisie podnosi poziom na 1.
    W róznych kartach te czasy są różne. W procedurze obslugi karty mam procedure TimeOut'u.
    I teraz pytanko: Jaki może być najdłuższy czas trwania zapisu 1 sektora na kartę?
    U siebie testowałem 2 karty - jedna z nich miała ten czas krótki, ale druga (stara SD 32MB) była "busy" przez okres prawie 18ms.
    W tej chwili ustawiłem licznik TimeOut'u na ok 80ms - po tym okresie procedura wyjdzie z oczekiwania na response karty z błedem.
    Czy zetknął się ktoś z kartą, która ma dłuższy czas zapisu 1 sektora niż 80ms?

    0 5
  • #2 22 Lut 2012 00:25
    janbernat
    Poziom 38  

    Nic nie robiłem z kartami, nic nie robiłem na PIC, nie znam Twojej procedury TimeOut-u a już mi się nie podoba.
    Albo zrób to na przerwaniu albo zrób polling.
    W przerwaniu- jak karta wystawi 1 wiesz że gotowe.
    W pollingu- co jakiś czas w głównej pętli sprawdzasz co jest na pinie.
    Jak jest 1- to gotowe.
    Sprawdzanie robisz wykorzystując timer.
    Najlepiej taki który już jest do czegoś wykorzystany.

    0
  • #3 22 Lut 2012 11:23
    Jado_one
    Poziom 22  

    Procedura jest zrobiona na przerwaniach.
    Karta MMC/SD może zwracać rózne kody błedu, może też nie działać/uszkodzić się/zle kontaktować w slocie/etc.
    Procedura obslugi karty (musi - powinna) mieć zabepieczenie na takie okazje i w przypadku braku dostępu do karty przez dluzszy czas nie może zawisać w nieskonczonej petli oczekiwania na odpowiedz z karty, bo wtedy caly system Ci może zawisnąć.
    TimeOut to juz jest pewna nadmiarowość kodu stworzona w celu w/w.
    A poniewaz w specyfikacji SD ten czas nie jest jasno okreslony, więc trzeba przyjąc jakiś lekko nadmiarowy czas - uwzgledniajacy najgorszy mozliwy przypadek - stad moje pytanie o to kto widział najdłuższy czas zapisu na karcie :-)

    W przypadku urządzenia z dedykowaną kartą SD - możemy sobie zmierzyć ten czas i przyjąć konkretną wartość. Jeżeli procedura ma być bardziej uniwersalna - patrz wyżej.

    Najprosciej byłoby oczywiscie wyłączyć time out, ale wtedy np. jesli uszkodzi sie dany sektor karty wskutek wielokrotnego zapisu, to system zawisnie zamiast zasygnalizować użytkownikowi konieczność wymiany karty.

    Pisząc "zawiśnie" mam na myśli owo sprawdzanie tego "bitu 1" w procedurze main - co nie oznacza całkowitego zatrzymania programu. Po prostu bedzie sobie sprawdzał ten bit w nieskonczoność i nic z tym nie robił dalej.

    0
  • #4 22 Lut 2012 21:36
    janbernat
    Poziom 38  

    No to już trzeba zrobić arbitralnie- liczysz przerwania i jak np. po 1s nie masz żadnej odpowiedzi- ani kodu błędu z karty ani prawidłowego odczytu to wyświetlasz jakiś komunikat.
    Może być- karta nie działa albo wyjmij i włóż kartę jeszcze raz.

    0
  • #5 22 Lut 2012 22:01
    Jado_one
    Poziom 22  

    No toż własnie tak mniej więcej mam zrobione. Jednakowoż 1s to bardzo długi czas - chciałem wycyrklować tak, żeby było tylko trochę dłużej niż niezbędne minimum.
    Pod SPI mam podpięty równocześnie wyswietlacz GLCD i nie chcę mu blokować dostępu do SPI na dłużej niż potrzeba.

    No nic - przyjdzie przetestować kilka róznych kart i zobaczyć, która jest najgorsza i taki ustalić max czas. W sumie w nowszych kartach - czyli o lepszych parametrach zapisu, ten czas powinien być coraz krótszy, więc może najgorszym egzemplarzem okaze się ta stara 32Mb.....

    Miałem cichą nadzieję, że ktoś już ten temat może przerabiał ;-)
    A przyjdzie jak zwykle DIY :-)

    0
  • #6 22 Lut 2012 22:46
    janbernat
    Poziom 38  

    No ale jak karta nie jest dedykowana i włożysz jakąś starą to na nic.
    Jak układ czeka na odczyt to powinien jakoś to sygnalizować- że czeka.
    A dopiero jak tobie się to znudzi to musisz "ręcznie" podjąć jakąś decyzję.

    0