3045.pdf

(920 KB) Pobierz
035-038_czytnik_sd_cz2.indd
Czytnik kart SD na ARM-ie
PROJEKTY
Czytnik kart SD na
ARM–ie, część 2
AVT–5134
Pamięci masowe w postaci
kart SD/MMC znalazły
już stałe miejsce zarówno
w urządzeniach profesjonalnych,
jak i amatorskich, stąd coraz
większe zainteresowanie nimi
naszych Czytelników. W artykule
opisujemy budowę czytnika
takich kart. Po zapoznaniu
się z teorią przedstawioną
w pierwszej części, w drugiej
zostaną opisane konkretne
rozwiązania zastosowane
w czytniku kart SD.
Rekomendacje:
czytnik pozwoli wygodnie
przesyłać dane pomiędzy kartą
pamięciową SD a komputerem.
Skoro znamy już zarys teorii,
warto spojrzeć na rys. 4 ilustrują-
cy, jak powyższe rozważania zostały
zrealizowane w praktyce w czytniku
kart. Na rysunku tym naniesione
są najważniejsze nazwy plików oraz
funkcji biorących udział w przetwa-
rzaniu danych pomiędzy interfejsem
USB i kartą SD.
Blokiem, który wymaga szczegól-
nego komentarza jest plik msc_if.c .
Plik ten składa się z samych funk-
cji inline , więc nie powinien wpro-
wadzić dodatkowych narzutów cza-
sowych. Zastosowany został po to,
aby jak najbardziej ułatwić dosto-
sowanie biblioteki USB Mass Stora-
ge do posiadanej pamięci masowej.
Interfejs tworzony w pliku msc_if.c
jest najprostszym z możliwych i jed-
nocześnie uniwersalnym interfej-
sem do pamięci masowych. Należy
wspomnieć, że odmianą tego inter-
fejsu posługują się biblioteki imple-
mentacji systemu plików FatFs oraz
EFSL.
W funkcjach znajdujących się
w pliku msc_if.c jeden z parametrów
niewykorzystywanych w czytniku
kart to lun . Jest to parametr jedno-
bajtowy (w czytniku kart ma zawsze
wartość 0), reprezentujący numer
PODSTAWOWE PARAMETRY
• Płytka o wymiarach 85x44 mm
• Zasilanie: przez port USB lub z zasilacza
zewnętrznego
• Obsługiwane karty pamięci: SD i MMC
• Interfejs: USB 2.0, Full Speed
• Klasa urządzenia: Mass Storage Class
(pamięć masowa USB)
• Rzeczywista szybkość zapisu danych na
kartę: około 220 kB/s
• Rzeczywista szybkość odczytu danych
z karty: około 300 kB/s
• Brak konieczności instalacji sterowników
dla systemów Windows XP i 2000
Rys. 4. Graficzna interpretacja działania czytnika kart SD
Elektronika Praktyczna 6/2008
35
649301925.105.png 649301925.116.png 649301925.127.png 649301925.138.png 649301925.001.png 649301925.012.png 649301925.023.png 649301925.034.png 649301925.045.png 649301925.056.png 649301925.061.png 649301925.062.png 649301925.063.png 649301925.064.png 649301925.065.png 649301925.066.png 649301925.067.png 649301925.068.png 649301925.069.png 649301925.070.png 649301925.071.png 649301925.072.png
Czytnik kart SD na ARM-ie
jednostki logicznej LUN ( Logical
Unit Number ), do której aktualnie
odnosi się host. Zerowa wartość
parametru lun bierze się stąd, że
podczas inicjalizacji funkcja mscInit
(z pliku msc_ui.c ) została wywołana
z parametrem 0. Jeśli dla przykładu
funkcję tę wywołamy z parametrem
2, w funkcjach zawartych w msc_if.c
(czyli w interfejsie pamięci maso-
wej) będą pojawiać się parametry
lun o wartościach 0, 1 i 2. Zależ-
nie od parametru lun będziemy
wtedy mogli wykonać działania dla
odpowiedniej pamięci masowej, np.
dla kilku kart SD lub dla karty SD,
pamięci DataFlash i dysku twardego,
obsługiwanych za pomocą jednego
czytnika. Każda z tych pamięci bę-
dzie jednostką logiczną i przypisze-
my jej jedną z wartości parametru
lun .
karty tylko hostowi USB (biblioteka
Mass Storage ), albo funkcjom mo-
dyfikującym zawartość karty (biblio-
teki systemu plików). Modyfikacja
zawartości karty wtedy, gdy host
ma do niej dostęp będzie mia-
ła nieprzewidywalne skutki, nawet
jeśli host w danym momencie nie
prowadzi żadnych operacji na za-
wartości karty.
Budując urządzenie dołączane
do portu USB, ale mogące tak-
że pracować z własnym zasilaniem
będziemy musieli wykryć, czy host
USB został do niego podłączony,
czy też nie. Sprawdzenie, czy host
został dołączony można przeprowa-
dzić, odczytując napięcie sygnału
V_DETECT. Z kolei napięcie V_DE-
TECT najprościej odczytać spraw-
dzając stan logiczny wyprowadze-
nia PA18 mikrokontrolera.
Jeśli dysponuje się w swoim
projekcie systemem operacyjnym,
do kontroli dostępu do karty SD
doskonale nadaje się mechanizm
semaforów wbudowany w system.
Dzięki niemu po podłączeniu urzą-
dzenia do hosta USB i „przejęcia”
przez niego semafora, urządzenie
może być nadal funkcjonalne z wy-
łączeniem jedynie procedur mody-
fikacji karty SD. Semafor zostanie
zwolniony po wykryciu odłącze-
nia urządzenia od hosta – wtedy
przejęcie semafora będzie możliwe
przez bibliotekę systemu plików.
Najrozsądniejszym sposobem im-
plementacji dostępu do karty SD
we własnym programie nie jest
modyfikacja danych na poziomie
bloków, lecz zastosowanie odpo-
wiedniej biblioteki systemu pli-
ków. Przykładowo, jako popularne
biblioteki można wymienić: EFSL
( Embedded Filesystems Library ) lub
FatFs – obie służą do implementa-
cji systemu plików FAT. Stosując
bibliotekę systemu plików dokonu-
jemy operacji na plikach, a nie na
blokach.
Przykład: Jeśli chcemy zbudo-
wać rejestrator temperatury zapi-
sujący dane w pliku tekstowym,
implementujemy w urządzeniu
przedstawioną tutaj bibliotekę Mass
Storage Class i bibliotekę obsługi
systemu plików, powiedzmy EFSL.
W pętli głównej programu spraw-
dzamy, czy na wyprowadzeniu
odpowiadającym V_DETECT jest
napięcie, czyli czy host USB jest
podłączony. Jeśli sygnał V_DETE-
CT będzie w stanie niskim (host
odłączony, urządzenie pracuje au-
tonomicznie), możemy wykonywać
pomiary temperatury i zapisywać
dane do plików za pomocą EFSL,
jeśli natomiast okaże się, że V_DE-
TECT jest w stanie wysokim, to
znaczy, że musimy:
a) zakończyć prowadzone operacje
na plikach (zamknąć pliki),
b) włączyć podciągnięcie linii DP
interfejsu USB do +3,3 V, gdy
tylko będziemy gotowi do roz-
poczęcia transmisji USB (w czyt-
niku do tego celu służy sygnał
DP_PULLUP),
c) zacząć wywoływać w pętli funk-
cję mscUIEnumerate aż do cza-
su, gdy sygnał V_DETECT nie
przejdzie w stan niski (czyli
cały czas, gdy urządzenie bę-
dzie dołączone do hosta).
W tym czasie (gdy urządzenie
jest podłączone do hosta) nie wol-
no wykonywać innych dostępów
do karty niż za pomocą mscUIE-
numerate . Po odłączeniu hosta
USB, w urządzeniu należy ponow-
nie zainicjalizować system plików,
ponieważ host mógł zmodyfikować
dotychczas używane w urządzeniu
pliki.
Co z systemem plików?
W dyskusjach na temat Mass Sto-
rage Class, jakie toczą się na forach
internetowych, wiele osób twierdzi,
iż do poprawnej pracy urządzenia
potrzebna jest implementacja syste-
mu plików (np. często wykorzysty-
wany w urządzeniach przenośnych
FAT). Otóż system plików warto
zaimplementować w czytniku jedy-
nie wtedy, gdy chcemy, aby czyt-
nik miał możliwość autonomicznej
modyfikacji lub odczytu zawartości
karty SD (na poziomie plików, a nie
sektorów) bez udziału hosta USB.
Urządzenie Mass Storage Class
samo w sobie nie ma jakiejkolwiek
kontroli nad treścią zapisywaną
lub odczytywaną z niego, a opera-
cje zapisu/odczytu prowadzone są
sektorami (dysk) lub blokami (kar-
ta). Host podaje adres bloku (czyli
jego numer LBA) z dostępnej puli
wszystkich bloków oraz dane, jakie
ma do niego zapisać lub z niego
odczytać. Urządzenie Mass Storage
ma jedynie odczytać lub zapisać
blok zgodnie z tym, co mówi host,
i to host zajmuje się organizacją
bloków i danych w nich zawartych
tak, aby na dysku/karcie dane były
zapisywane w określonym systemie
plików.
Rozbudowa urządzenia
Zgodnie z tym, co zostało napisa-
ne wcześniej, czytnik kart jest jedy-
nie prezentacją wykorzystania klasy
magazynującej we własnym projek-
cie. Sam czytnik kart o takiej funk-
cjonalności jak w niniejszym arty-
kule ma bardzo niewielką szybkość
(dużo szybszy czytnik wyprodukowa-
ny w Chinach można kupić za kilka
złotych), jednak wzbogacenie wła-
snego urządzenia o możliwość dostę-
pu do pamięci masowej za pomocą
USB może zaowocować znaczącym
wzrostem jego funkcjonalności.
Pisząc oprogramowanie dla wła-
snego urządzenia wykorzystującego
pamięć masową, zaistnieje potrzeba
dołączenia do niego, oprócz opisanej
tutaj biblioteki Mass Storage Device
Class , także biblioteki obsługującej
konkretny system plików – najczę-
ściej będzie to biblioteka obsługują-
ca którąś z odmian systemu plików
FAT.
Obsługa wszystkich interfejsów
napisana jest bez wykorzystania ja-
kichkolwiek przerwań. Można powie-
dzieć, że takie postępowanie marnu-
je możliwości mikrokontrolera. Jest
to prawda, lecz tutaj szybkość pra-
cy nie jest krytyczna, choć i tak jest
Dostęp do karty
Najważniejszą zasadą, jakiej na-
leży bezwzględnie przestrzegać pod-
czas pisania oprogramowania wy-
korzystującego Mass Storage Class
i bibliotekę systemu plików jest za-
pewnienie wyłącznego dostępu do
36
Elektronika Praktyczna 6/2008
649301925.073.png
Czytnik kart SD na ARM-ie
zinterpretuje taką
sytuację jako błąd
transmisji danych).
kontrolera najłatwiej użyć programu
H–Flasher będącego modułem progra-
mu H–JTAG dostępnego za darmo.
Programowanie przy pomocy tzw.
SAM Boot Assistant (SAM–BA) jest
bardzo kłopotliwą czynnością, szcze-
gólnie, że w układach SAM7S nale-
ży podciągać odpowiednie wyprowa-
dzenia (PA0...2) do szyn zasilania.
Ta metoda programowania była już
opisywana w EP [14]. Płytka posia-
da złącze USB i DBGU, więc przy
odrobinie cierpliwości można odpo-
wiednio wysterować wyprowadzenia
PA0...2 oraz zaprogramować układ
przez SAM–BA.
Po odpowiednim zaprogramowa-
niu mikrokontrolera, przy odłączo-
nym zasilaniu, można włożyć kartę
SD do gniazda, a następnie pod-
łączyć urządzenie do portu USB.
W tym momencie powinna rozpocząć
się pierwsza enumeracja układu i po
pewnym czasie powinien pojawić
się dysk wymienny w oknie „Mój
komputer” o wielkości rzeczywistej
pojemności karty SD (jeśli karta jest
sformatowana). Przykładowy „dymek”
podczas instalacji został przedstawio-
ny na rys. 6 , a widok okienka wła-
ściwości dysku na rys. 7 .
Rys. 5. Schemat montażowy płytki czytnika
Montaż
i uruchomienie
Schemat mon-
tażowy płytki dru-
kowanej czytnika
przedstawiono na
rys. 5 . Montaż
może być trudny
ze względu na nie-
wielki rozstaw wy-
prowadzeń mikro-
kontrolera AT91SA-
M7S64. Nie pole-
cam wykonywania
płytki drukowanej
w warunkach do-
mowych bez do-
świadczenia prak-
tycznego i prze-
strzegania reżimu
technologicznego.
Dobrym rozwią-
zaniem może być
zastosowanie płytki ewaluacyjnej
z mikrokontrolerem AT91SAM7S64/
128/256 możliwej do kupienia w po-
pularnych sklepach internetowych.
W przypadku zastosowania zestawu
ewaluacyjnego należy odpowiednio:
– skorygować definicję wyprowadze-
nia sterującego podciągnięciem li-
nii DP interfejsu USB,
– sprawdzić wyprowadzenie mikro-
kontrolera, do którego podłączo-
ny jest sygnał V_DETECT,
– skorygować ewentualne przyłącze-
nie diod LED,
– zmienić przypisanie wyprowa-
dzeń kontrolerów PIO i SPI dla
karty SD.
Plik wynikowy dostarczony jest
w wersji binarnej pod nazwą SD_
CARD_READER.bin .
Zalecane jest programowanie mi-
krokontrolera SAM7 przy pomocy
interfejsu JTAG. Jeśli Czytelnik za-
mierza uruchomić układ w miarę
szybko i bezstresowo polecam za-
kup odpowiedniego interfejsu JTAG
dla ARM7TDMI. Schematy interfej-
su JTAG są także ogólnodostępne
w Internecie. Ściągając pakiet Win
ARM [1] otrzymujemy schematy kil-
ku różnych wersji tanich JTAG–ów
podłączanych do portu LPT kompu-
tera PC. Są to klony tzw. Wigglera
– wtyczki komercyjnej, jednak roz-
pracowanej przez zwolenników dar-
mowych narzędzi. Jako software do
programowania pamięci Flash mikro-
spora jak na USB Full Speed . Zrezy-
gnowanie z wykorzystania przerwań
przede wszystkim upraszcza kod
i ułatwia przenoszenie biblioteki do
innych aplikacji. Przykładowo projekt
Mass Storage został przeze mnie po-
myślnie przetestowany, gdy pracował
wraz z systemem czasu rzeczywiste-
go FreeRTOS [12]. Jedyne, co wy-
starczyło zrobić, to uruchomić task ,
który – podobnie jak w niniejszej
wersji projektu – zawierał wywołanie
funkcji mscUIEnumerate i niewiel-
kie opóźnienie (dla bezpieczeństwa
można wyłączyć scheduler systemu
operacyjnego na czas wykonywania
funkcji mscUIEnumerate ). Każdy, kto
próbował zaimplementować synchro-
nizację przerwań i tasków w syste-
mie FreeRTOS wie, ile kosztuje sta-
bilne uruchomienie przerwań i prze-
kazanie odpowiednich parametrów
do synchronizacji (np. handlerów
do kontroli semaforów, czy tasków)
pomiędzy trybami Thumb (system)
i ARM (przerwania). Ważne jest, aby
pętla z wywołaniem mscUIEnumera-
te wykonywała się dość szybko (je-
śli program będzie za długo zwlekał
z kolejnymi transferami danych, host
Uwagi końcowe
Układ był testowany na kompute-
rach PC z systemami Windows 2000
oraz XP – w każdym przypadku dzia-
łał poprawnie bez instalacji jakich-
kolwiek dodatkowych sterowników.
Uruchomienie układu na komputerze
z systemem Windows 98SE nie powio-
dło się z powodu braku sterowników
ogólnej klasy magazynującej ( Generic
Mass Storage Device Class ).
Czytnik poprawnie działał z karta-
mi:
Rys. 6. „Dymek” ukazujący się pod-
czas instalacji czytnika
Rys. 7. Okno właściwości dysku wy-
miennego
Elektronika Praktyczna 6/2008
37
649301925.074.png 649301925.075.png 649301925.076.png 649301925.077.png 649301925.078.png 649301925.079.png 649301925.080.png 649301925.081.png 649301925.082.png 649301925.083.png 649301925.084.png 649301925.085.png 649301925.086.png 649301925.087.png 649301925.088.png 649301925.089.png 649301925.090.png 649301925.091.png 649301925.092.png 649301925.093.png 649301925.094.png 649301925.095.png 649301925.096.png 649301925.097.png 649301925.098.png 649301925.099.png 649301925.100.png 649301925.101.png 649301925.102.png 649301925.103.png 649301925.104.png 649301925.106.png 649301925.107.png 649301925.108.png 649301925.109.png 649301925.110.png 649301925.111.png 649301925.112.png 649301925.113.png 649301925.114.png 649301925.115.png 649301925.117.png 649301925.118.png 649301925.119.png 649301925.120.png 649301925.121.png 649301925.122.png 649301925.123.png 649301925.124.png 649301925.125.png 649301925.126.png 649301925.128.png 649301925.129.png 649301925.130.png 649301925.131.png 649301925.132.png 649301925.133.png 649301925.134.png 649301925.135.png 649301925.136.png 649301925.137.png 649301925.139.png 649301925.140.png 649301925.141.png 649301925.142.png 649301925.143.png 649301925.144.png 649301925.145.png 649301925.146.png 649301925.147.png 649301925.148.png 649301925.002.png 649301925.003.png 649301925.004.png 649301925.005.png 649301925.006.png 649301925.007.png 649301925.008.png 649301925.009.png 649301925.010.png 649301925.011.png 649301925.013.png 649301925.014.png 649301925.015.png 649301925.016.png 649301925.017.png 649301925.018.png 649301925.019.png 649301925.020.png 649301925.021.png 649301925.022.png 649301925.024.png 649301925.025.png 649301925.026.png 649301925.027.png 649301925.028.png 649301925.029.png 649301925.030.png 649301925.031.png 649301925.032.png 649301925.033.png 649301925.035.png 649301925.036.png 649301925.037.png 649301925.038.png 649301925.039.png 649301925.040.png 649301925.041.png 649301925.042.png 649301925.043.png 649301925.044.png 649301925.046.png 649301925.047.png 649301925.048.png 649301925.049.png 649301925.050.png 649301925.051.png 649301925.052.png 649301925.053.png 649301925.054.png 649301925.055.png
Czytnik kart SD na ARM-ie
– SD 128 MB oraz 1 GB firmy King-
ston (wersja standardowa, bez hi–
–speed),
– SD 256 MB bliżej nieokreślonej fir-
my (na karcie znajduje się jednak
oficjalne logo SD),
– kartą oznaczoną jako „Secure Di-
gital” firmy Hama, lecz bez ofi-
cjalnego logo SD, o pojemności
256 MB,
– SD 16 MB firmy Canon,
– MMC 16 MB firmy Canon.
Na koniec chciałbym jeszcze wy-
tłumaczyć się z rozbieżności w or-
ganizacji kodu i nazwach funkcji
w tym opracowaniu oraz w artykule
[13]. Biorą się one stąd, że zanim
bieżący artykuł został opublikowa-
ny napisałem nową wersję oprogra-
mowania obsługującego klasę ma-
gazynującą USB. Niniejszy artykuł
przepisałem tak, aby dotyczył już
nowej wersji, która zapewne ułatwi
czytanie i analizę kodu.
Opiekunami naukowymi projek-
tu są: dr inż. Cezary Worek i mgr
inż. Łukasz Krzak. Projekt powstał
w ramach praktyk wakacyjnych kie-
rowanych przez dr inż. Cezarego
Worka w Katedrze Elektroniki Akade-
mii Górniczo–Hutniczej w Krakowie.
Specjalne podziękowania kieruję
do Pana mgr inż. Łukasza Krzaka
za pomoc przy realizacji transmisji
USB.
Robert Brzoza–Woch
R
E
K
L
A
M
A
38
Elektronika Praktyczna 6/2008
649301925.057.png 649301925.058.png 649301925.059.png 649301925.060.png
Zgłoś jeśli naruszono regulamin