Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Tester kart pamięci microSD

phanick 07 Jan 2022 03:47 5757 13
  • Tester kart pamięci microSD
    W tym artykule opiszę powód wymyślenia oraz konstrukcję testera do kart pamięci microSD który posłuży to sprawdzenia pewnej ciekawej własności kart.

    Przyczyna powstania
    Karty MMC/SD/microSD oprócz swoich naturalnych zastosowań są też lubiane przez miłośników mikrokontrolerów z kilku powodów:
    * mogą posłużyć jako dodatkowa pamięć o naprawdę dużej pojemności (zarówno do odczytu, np. przy wyświetlaniu zdjęć gdy mikrokontroler steruje cyfrową ramką obrazu, jak i do zapisu np. wyników pomiarów z termometru
    * upraszczają wymianę tych danych z PC czy telefonem
    * komunikują się ze światem zewnętrznym albo za pomocą protokołu SD albo SPI (ten ostatni jest bajecznie prosty w implementacji)

    Na początku istniały karty MMC (zdaje się do 128MB), później wyparły je karty SD (rozmiarowo identyczne), a potem powstały karty mini i micro SD. Bywały karty "zwykłe", "SDHC" oraz "SDXC". Wykrywanie rodzaju karty (a co za tym idzie - sposobu jej adresowania) może sprawiać pewne trudności. Doskonale jest to opisane w poniższym artykule:
    http://elm-chan.org/docs/mmc/mmc_e.html

    a świetnie ilustruje to poniższy diagram:
    Tester kart pamięci microSD

    Protokół SPI to szeregowy protokół transmisji danych full-duplex, w którym:
    * po linii MISO (Master Input Slave Output) dane idą od karty do hosta (np. PC),
    * po linii MOSI (mater Output Slave Input dane idą od hosta do karty.
    * a wszystko to dzieje się w takt sygnału zegarowego SCLK generowanego przez hosta.
    * jest jeszcze czwarta linia (nCS), która.. no właśnie

    Teoretycznie ma ona umożliwić podłączenie kilku kart do jednego hosta za pomocą tych samych linii MISO/MOSI/SCLK. Każda karta miałaby swój oddzielny sygnał nCS który byłby aktywny na czas transmisji z nią:
    Code:
                                     
    
                                           VCC VCC   
                                            |   |
    SCLK ---+----------+----------+         R   R
    MISO ---|+---------|+---------|+--------+   |
    SCLK ---||+--------||+--------||+-----------+
            |||        |||        |||
         +-------+  +-------+  +-------+
         |Karta 1|  |Karta 2|  |Karta 3|
          +-------+  +-------+  +-------+
             |           |          |
    nCS1-----+           |          |
    nCS2-----------------+          |
    nCS3----------------------------+


    W praktyce jednak chyba mało kto z tego korzysta i najczęściej mamy do czynienia z pojedynczą kartą. Co więc w tedy z linią nCS? Teoretycznie powinna być w stanie niskim (aktywnym) tylko podczas transmisji 8 bitów, po czym przejść w stan wysoki (co sygnalizowałoby przesłanie całego bajtu)
    Code:

    SCLK __--__--__--__--__--__--__--__--________--__--__--__--__--__--__--__--______
    MISO -<B7><B6><B5><B4><B3><B2><B1><B0>------<B7><B6><B5><B4><B3><B2><B1><B0>-----
    nCS  --______________________________--------______________________________------


    W praktyce jednak linia ta może być cały czas w stanie niskim i karcie nie robi to żadnego znaczenia (a nasz mikrokontroler ma wtedy o jeden pin więcej na inne potrzeby). Ale czy aby na pewno?

    Otóż wg wcześniej przytoczonego diagramu, tuż po podaniu zasilania do karty, należy odczekać chwilę i wysłać jej minimum 74 cykle zegarowe na "rozruszanie się". Podczas tych cykli rozgrzewkowych linia nCS powinna być nieaktywna, a potem już po "rozgrzewce" aż do wyłączenia może być niska. I postępując tak, z każda kartą mogłem się skomunikować bez problemu.

    Jednak w urządzeniu które kiedyś zaprojektowałem, linia nCS była na stałe na masie (z oszczędności pinów i zasobów). Działało to na karcie, którą wtedy miałem. Potem kupiłem kilkanaście innych kart i okazało się, że niektóre "nie chcą się skomunikować". Była to niedobra wiadomość, bo płytki do budowy urządzenia miałem już na biurku w większej ilości - przeróbka stałaby się uciążliwa (nie wchodziła więc w grę). Próbowałem znaleźć jakąś regułę - np. karty Sandisk zawsze działały, a innych producentów czy wręcz no-name czasami miały kaprysy). Zależało mi na jakiejś 100% skutecznej metodzie określenia, która pozwoliłaby to stwierdzić przed zakupem karty, najlepiej po samym jej wyglądzie. No ale karty jak to karty, po za logiem producenta są przecież takie same. Jednak niezupełnie - odkryłem ciekawą własność:

    Tester kart pamięci microSD

    Karty po lewej (działające z linią nCS zawsze na masie) są z tyłu "gładkie" (albo całe czarne albo z jakimiś napisami), a te po prawej (kapryśne) mają albo naklejkę albo jakieś dziwne pola stykowe. Zawsze kupując karty prosiłem sprzedawcę aby wybierał mi "gładkie". Ponieważ nie byłem jednak pewien, czy jest to 100% skuteczna metoda, postanowiłem, że stworzę proste urządzenie-tester, mający: gniazdo karty, przycisk i dwie diody, które po wduszeniu przycisku wykonują sprawdzenie i zapalają się zależnie, czy karta jest OK czy kapryśna. Urządzenie chciałem wysłać sprzedawcy przed zakupem.

    Projekt
    W ramach "oszczędności" aby ciąć koszty, urządzenie oparte będzie o miniaturowy mikrokontroler Attiny13. Ma on tylko 8 nóg. Odejmując VCC, GND i /RESET - pozostaje 5 pinów do własnego użytku:
    - program jest na tyle prosty, że nie wymaga żadnej interakcji od użytkownika (więc przycisk wykonania testu można podpiąć do pinu /RESET)
    - dwie diody, połączone w sprytny sposób, aby jednym z trzech stanów (0/1/Z) wybierać która z diod (odpowiednio: czerwona/zielona/żadna) ma się zapalić,
    - karty MMC/SD wymagają zasilania 3.3V, więc przyda się stabilizator,
    - oraz układ 74LVC245 do konwersji poziomów napięć na liniach idących do karty (MOSI/SCK/nCS); MISO (wychodzące z karty nie wymaga konwersji)
    - mikrokontrolery które posiadam (ATTINY13V) można zasilać już nawet od 3.3V więc konwerter 74LVC245 byłby zbędny, ale... programator USBASP, którego używam jest zasilany z 5V i taki jest też poziom sygnałów na liniach używanych podczas programowania, mogłoby to więc uszkodzić attiny'ego.
    - gniazdo do kart oraz gniazdo USB mini do zasilania
    Tester kart pamięci microSD Tester kart pamięci microSD

    Płytka jak zwykle powstała dość ładna:
    Tester kart pamięci microSD Tester kart pamięci microSD

    Oprogramowanie
    W attinym mamy tylko 1024 bajty na kod, więc bez szaleństw. Program wykonuje 2 identyczne testy, jeden po drugim:
    * TEST1 - próba komunikacji z kartą z nCS stale na masie
    * TEST2 - ustawienie nCS na stan wysoki, puszczenie 80 cykli rozgrzewkowych a powrót nCS na masę i próba komunikacji

    Każdy z testów:
    * albo zakończy się niepowodzeniem,
    * albo uda się skomunikować z kartą - wtedy określa on z jaką kartą mamy do czynienia.

    Code:

    Wyświetlanie wyniku testu:
    dioda   | dioda    | wynik
    zielona | czerwona |
    --------+----------+-------
       -    |   miga   |  TEST1 fail, TEST2 fail (błąd komunikacji)
    miga (*)| miga (*) |  TEST1 fail, TEST2 pass (karta kapryśna)
    miga (*)|     -    |  TEST1 pass, TEST2 pass (karta ugodowa)

    (*) - ilość mignięć oznacza:
    1 -> karta SD VER.2 (block address)
    2 -> karta SD VER.2 (byte address)
    3 -> karta SD VER.1
    4 -> MMC VER.3


    Z kart które mam:
    * karty o pojemności 4GB i 2GB to SD VER.2 (byte address)
    * karta o pojemnośći 32GB to SD VER.2 (block address) - nic dziwnego, bo na 4 bajtach (32 bitach) maksymalnie można zaadresowac właśnie 4GB


    Prezentacja


    Kod
    Code: C
    Log in, to see the code

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    phanick
    Level 28  
    Offline 
    Has specialization in: energetyk najwyższych napięć
    phanick wrote 2464 posts with rating 2553, helped 57 times. Live in city Warszawa. Been with us since 2007 year.
  • #3
    spec220
    Level 27  
    Bardzo ciekawy projekt, szybki test kart pamięci.
    Jednak osobiście uważam, że tiny13 trochę się do tego nie nadaje, chociaż nie ukrywam, że sam artykuł na pewno przedstawia/prezentuje kolegi umiejętności, oraz zdolności programistyczne.

    Osobiście to nabyłem prosty gadżet za parę groszy, który umożliwia pełen dostęp do kart SD oraz pamięci.

    Tester kart pamięci microSD
  • #4
    krzbor
    Level 24  
    phanick wrote:
    Teoretycznie ma ona umożliwić podłączenie kilku kart do jednego hosta za pomocą tych samych linii MISO/MOSI/SCLK. Każda karta miałaby swój oddzielny sygnał nCS który byłby aktywny na czas transmisji z nią:

    To trochę nie tak - SPI nie służy tylko do podłączania kart - bardzo często używany jest do współpracy z wyświetlaczami, przetwornikami ADC/DAC, zegarami RTC itp. Sygnał nCS powinien co do zasady być poprawnie podłączany.
  • #5
    Eidems
    Level 29  
    @phanick, czy kupujesz używane karty pamięci? Mi się zdarzyło już kilka razy, że karta microsd przestała działać sama z siebie. Dlatego w telefonach profilaktycznie wymieniam co 2/3 lata. Koszt takiej karty jest śmieszny.
  • #6
    ZnAl
    Level 14  
    Bardzo ciekawy projekt. :spoko:

    Mam tylko małą uwagę co do tego fragmentu opisu:
    Quote:
    istniały karty MMC (zdaje się do 128MB), później wyparły je karty SD (rozmiarowo identyczne)

    Nie wszystkie wymiary są w nich identyczne.
    Karty MMC (pełnego rozmiaru) mają standardowo 1,4 mm grubości, natomiast zwykłe karty SD - 2,1 mm.
    Istnieją urządzenia, do których zmieszczą się tylko karty MMC, a SD już nie.
  • #7
    bsw
    Level 18  
    phanick wrote:
    - mikrokontrolery które posiadam (ATTINY13V) można zasilać już nawet od 3.3V więc konwerter 74LVC245 byłby zbędny, ale... programator USBASP, którego używam jest zasilany z 5V i taki jest też poziom sygnałów na liniach używanych podczas programowania, mogłoby to więc uszkodzić attiny'ego.

    Z moich doświadczeń wiem, że mikrokontrolera nie uszkodzi, ale może uszkodzić inne, współpracujące z nim akcesoria.
    Jest na to rada - prosta modyfikacja programatora USBASP lub adapter na port USB obniżający jego napięcie:

    https://e-bsw.blogspot.com/2017/09/usbasp.html

    Dodano po 23 [minuty]:

    ZnAl wrote:

    Quote:
    istniały karty MMC (zdaje się do 128MB), później wyparły je karty SD (rozmiarowo identyczne)

    Nie wszystkie wymiary są w nich identyczne.
    Karty MMC (pełnego rozmiaru) mają standardowo 1,4 mm grubości, natomiast zwykłe karty SD - 2,1 mm.
    Istnieją urządzenia, do których zmieszczą się tylko karty MMC, a SD już nie.

    Karty MMC istniały do 512 MB. Istniały też urządzenia w których mieściła się fizycznie SD, ale nie była obsługiwana - wyłącznie MMC.
    Poza różnicą w grubości i brakiem przełącznika blokady zapisu karty MMC miały też dodatkowe styki:
    Tester kart pamięci microSD
  • #8
    zgierzman
    Level 30  
    bsw wrote:
    Karty MMC istniały do 512 MB. Istniały też urządzenia w których mieściła się fizycznie SD ale nie była obsługiwana - wyłącznie MMC.
    Poza różnicą w grubości i brakiem przełącznika blokady zapisu karty MMC miały też dodatkowe styki:


    To były dziwne czasy, były też MMC "połówkowe" (połowa długości) a do tego było kilka, jeśli nie kilkanaście innych standardów. Co producent, to inna karta. A to Memorty Stick, a to inny wynalazek. Jak ze złączami do ładowania telefonów. Całe szczęście, że jakoś się to wyprostowało. :-)
    Tester kart pamięci microSD
  • #9
    Sentymentalny
    Level 10  
    Czy nie można dorzucić do kompletu pliku misc2.h?
  • #10
    phanick
    Level 28  
    Dzięki za zainteresowanie tematem.

    LA72 wrote:
    I pomyśleć, że mały poczciwy szkrab ATtiny13 może wywinąć.
    Brawo.

    Testowałeś może jakąś "fake" kartę? (fałszywa pojemność)

    Nie mam takiej (albo nic o tym nie wiem). Rozumiem że karta zwraca wtedy inną pojemność niż fizyczna, a partycja zachodzi także na tą powiększoną część. Musze się tym zainteresować, bo ciekawe czy jak system tam coś spróbuje zapisać, to dane nigdzie nie są utrwalane, czy może nadpisują inne dane w rzeczywistym obszarze?

    Mam natomiast jedną kartę pamięci, która przez czytnik nie jest w ogóle wykrywana przez system, ale opisywany tester testuje ją pomyślnie. Może dostęp do danych jest w niej zablokowany, albo kość z pamięcią uległa uszkodzeniu, ale kontroler działa?

    Eidems wrote:
    Czy@phanick kupujesz używane karty pamięci? Mi się zdarzyło już kilka razy, że karta microsd przestała działać sama z siebie. Dlatego w telefonach profilaktycznie wymieniam co 2/3 lata. Koszt takiej karty jest śmieszny.

    W moim zastosowaniu karty nie przechowują krytycznych danych i służą głównie jako magazyn danych, z których potem urządzenie czyta. Może nastąpiło u Ciebie fizyczne uszkodzenie karty (np. mikropęknięcie)?

    spec220 wrote:
    Witam bardzo ciekawy projekt. Szybki test kart pamięci.
    Jednak osobiście uważam, że tiny13 trochę się do tego nie nadaje, chociaż nie ukrywam że sam artykuł na pewno przedstawia/ prezentuje kolegi umiejętności, oraz zdolności programistyczne.

    Osobiście to nabyłem prosty gadżet za parę groszy który umożliwia pełen dostęp do kart SD oraz pamięci.

    W obecnym zastosowaniu jest na styk (zajęte ok 87% pamięci), aczkolwiek gdyby chcieć np. zrobić z tego pełnoprawny diagnozer, który umożliwia tez czytanie/zapis danych na kartę i komunikację z PC po USB (a nie tylko zasilanie), to mega8 byłaby minimum.

    Poza tym czytnik na USB korzysta z tego drugiego protokołu komunikacji z kartą, więc moje problematyczne karty są dla niego nierozróżnialne od nieproblematycznych.

    Quote:
    Czy nie można dorzucić do kompletu pliku misc2.h?

    Dodałem
  • #11
    tmf
    Moderator of Microcontroller designs
    phanick wrote:
    W praktyce jednak linia ta może być cały czas w stanie niskim i karcie nie robi to żadnego znaczenia (a nasz mikrokontroler ma wtedy o jeden pin więcej na inne potrzeby). Ale czy aby na pewno?

    CS służy także do synchronizacji operacji na SPI. Pomysl, co się stanie jeśli CS będzie stale aktywne, a na SCK pojawi się jakieś zakłócenie? Transmisja się rozsynchroniuzuje i tylko jakieś wewnętrzne timeouty z karty mogą przywrócić prawidłową komunikację. Dlateog lepiej zrobić jak należy, czyli podłączyć CS i zmieniać jego stan na aktywny tylko na czas transmisji.
  • #12
    eurotips
    Level 38  
    Jak siedzisz w temacie, to wymyśl urządzenie do zmiany CID karty.
  • #13
    Błękitny
    Level 13  
    Można wykonać też taki układ do odczytu parametrów karty:
    Link
    Link
    zbudowałem to urządzenie i działa bardzo dobrze.

    Jeśli chodzi o zmianę nr CID to tutaj walczyli:
    Link