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
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
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
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
Plik z chomika:
Shirox_Arth
Inne pliki z tego folderu:
Mikrokontrolery dla początkujących - Piotr Górecki.pdf
(256777 KB)
AVR i ARM7. Programowanie mikrokontrolerów dla każdego.pdf
(530856 KB)
A. Witkowski - Mikrokontrolery AVR - programowanie w języku C. przykłądy zastosowań.pdf
(16603 KB)
2434.pdf
(1252 KB)
2562.pdf
(376 KB)
Inne foldery tego chomika:
Arduino
Automatyk
Biznes
Buddyzm
Elektronika i elektrotechnika
Zgłoś jeśli
naruszono regulamin