
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:

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ą:
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)
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ść:

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


Płytka jak zwykle powstała dość ładna:


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.
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
Cool? Ranking DIY