83_86.pdf

(237 KB) Pobierz
Obsługa kart pamięci Flash za pomocą mikrokontrolerów, część 2
K U  R S
Obsługa kart pamięci Flash
za pomocą mikrokontrolerów,
część 2
W†drugiej czÍúci artyku³u przedstawiamy podstawy obs³ugi
sterownika karty oraz sk³adniÍ i znaczenie najwaøniejszych
poleceÒ steruj¹cych jego prac¹.
Przedstawione informacje s¹ podstawowymi i wprowadzaj¹cymi
do kolejnej czÍúci artyku³u, w†ktÛrej opiszemy programow¹
obs³ugÍ pamiÍci Compact Flashy i†Multimedia Card.
ProtokÛ³ komunikacji z†kart¹ CF
Niezaleønie od wybranego trybu
pracy, karty typu CF komunikuj¹
siÍ z†otoczeniem za pomoc¹ proto-
ko³u zgodnego ze specyfikacj¹ ATA.
Oznacza to, øe dostÍp†do zawartoú-
ci pamiÍci jest zawsze realizowany
poprzez zapis lub odczyt podstawo-
wych rejestrÛw ATA. W†zaleønoúci
od trybu, sposÛb adresowania tych
rejestrÛw wymaga nieco innej kom-
binacji sygna³Ûw steruj¹cych.
Poniewaø†do komunikacji z†mik-
rokontrolerem wybraliúmy tryb PC
Card Memory , zostanie on najdok-
³adniej opisany. Wymagane kombi-
nacje sygna³Ûw steruj¹cych w†tym
trybie oraz odpowiadaj¹ce im rejes-
try ATA zestawiono w† tab. 3 .
ZawartoúÊ pamiÍci Flash podzie-
lona jest na sektory (przewaønie
o†d³ugoúci 512 bajtÛw). DostÍp do
danego sektora danych naj³atwiej
jest realizowaÊ w†trybie LBA ( Logi-
cal Block Addressing ).
Do zaadresowania sektora uøywa
siÍ jednej 28-bitowej liczby okreúla-
j¹cej numer sektora. Wpisujemy j¹
do rejestrÛw ATA o†offsetach 3, 4,
5†i†6 i ustawiamy bit 6†rejestru nu-
meru g³owicy/dysku (offset 6) dla
w³¹czenia trybu LBA. Do rejestru
IloúÊ sektorÛw wpisujemy ile kolej-
nych sektorÛw chcemy odczytaÊ lub
zapisaÊ za pomoc¹ jednej komendy,
a†do rejestru komend - odpowied-
ni¹ komendÍ (zapis/odczyt sektora).
NastÍpnie po sprawdzeniu flagi go-
towoúci moøemy rozpocz¹Ê zapis
lub odczyt z†rejestru danych zawar-
toúci zaadresowanego sektora. Spro-
wadza siÍ to do 512-krotnego zapi-
sania lub odczytania rejestru da-
nych (o offsecie 0).
Jeúli wykorzystujemy 16-bitowy
tryb dostÍpu, to dokonujemy jedy-
nie 256 zapisÛw/odczytÛw 16-bito-
wych s³Ûw. Jeúli zamierzamy zapi-
saÊ lub odczytaÊ wiÍcej niø 1†sek-
tor danych, to przed rozpoczÍciem
zapisu/odczytu kaødego kolejnego
sektora musimy ponownie sprawdziÊ
flagi BUSY oraz DRQ. Jeúli do re-
jestru IloúʆsektorÛw wpiszemy 0†-
oznacza to, øe chcemy zapisaÊ/od-
czytaÊ 256 sektorÛw.
Na rys. 6 przedstawiono algo-
rytm dostÍpu do danych wed³ug
standardu ATA.
Rejestry ATA
Znaczenie rejestru danych oraz
rejestrÛw o†offsetach od 2†do 6†opi-
sano powyøej. Dla pe³nego opisu
rejestrÛw ATA naleøy jeszcze
scharakteryzowaÊ znaczenie poszcze-
gÛlnych bitÛw rejestrÛw: b³ÍdÛw,
statusu, alternatywnego statusu, re-
jestru kontrolnego oraz rejestru nu-
meru g³owicy/dysku - gdyø oprÛcz
najstarszej czÍúci adresu LBA zawie-
ra on istotne w†procesie komunika-
cji pola bitowe.
Rejestr b³Ídow ( Error Register ) -
offset 1, tylko do odczytu. Rejestr
ten zawiera szczegÛ³owe informacje
o†b³Ídach, jeúli bit 0†rejestru statu-
su zosta³ ustawiony, co oznacza
wyst¹pienie b³Ídu. Znaczenie po-
szczegÛlnych bitÛw tego rejestru po-
Tab. 3. Zestawienie wymaganych kombinacji sygnałów sterujących w trybie PC Card Memory oraz odpowiadające im
rejestry ATA
-REG
A10 A9...A4
A3
A2
A1
A0
Offset
-OE = 0
-WE = 0
1
0
X
0
0
0
0
0
Odczyt rejestru danych
Zapis rejestru danych
1
0
X
0
0
0
1
1
Rejestr b³êdów
Rejestr Features
1
0
X
0
0
1
0
2
Iloœæ sektorów
Iloœæ sektorów
1
0
X
0
0
1
1
3
Numer sektora (LBA 7...0)
Numer sektora (LBA 7...0)
1
0
X
0
1
0
0
4
Numer cylindra [bity 0...7]
Numer cylindra [bity 0...7]
(LBA 15...8)
(LBA 15...8)
1
0
X
0
1
0
1
5
Numer cylindra [bity 8...15]
Numer cylindra [bity 8...15]
(LBA 23...16)
(LBA 23...16)
1
0
X
0
1
1
0
6
Numer g³owicy/dysku (LBA 27...24)
Numer g³owicy/dysku (LBA 27...24)
1
0
X
0
1
1
1
7
Rejestr statusu
Rejestr komend
1
0
X
1
0
0
0
8
Duplikat rejestru danych
Duplikat rejestru danych
1
0
X
1
0
0
1
9
Duplikat rejestru danych H
Duplikat rejestru danych H
1
0
X
1
1
0
1
D
Duplikat rejestru b³êdów
Duplikat rejestru Features
1
0
X
1
1
1
0
E
Alternatywny status
Rejestr kontrolny
1
0
X
1
1
1
1
F
Adres urz¹dzenia
Zarezerwowany
1
1
X
X
X
X
0
8
Odczyt rejestru danych L
Zapis rejestru danych L
1
1
X
X
X
X
1
9
Odczyt rejestru danych H
Zapis rejestru danych H
Uwagi:
Rejestr o offsecie 0 mo¿e byæ wykorzystany w trybie 16-bitowego dostêpu przy -CE1 i -CE2 = 0. W tym przypadku linie danych D0...D15 zawieraj¹ 16-bitowe
dane (dwa kolejne bajty z pamiêci). Jeœli -CE1 = 0 i -CE2 = 1, to mamy do czynienia z dostêpem 8-bitowym i ka¿de kolejne odwo³anie do tego rejestru daje
nam kolejny bajt z danego sektora danych.
Elektronika Praktyczna 3/2004
83
32686325.020.png
K U  R S
(w trybie IDE). Znaczenie poszcze-
gÛlnych bitÛw tego rejestru jest na-
stÍpuj¹ce (ich rozmieszczenie poka-
zano na rys. 8 ):
BUSY - Ustawiony, jeúli karta wy-
konuje wewnÍtrzne operacje i†nie
umoøliwia w†tym czasie dostÍpu
do pozosta³ych rejestrÛw. Jeúli bit
ten jest ustawiony, to pozosta³e
bity nie posiadaj¹ prawid³owych
informacji (s¹ niewaøne).
DRDY - Zostaje ustawiony, jeúli
karta jest gotowa do przyjÍcia ko-
mendy. Zerowany podczas zerowa-
nia karty.
DWF†- Ustawienie tego bitu ozna-
cza b³¹d zapisu do karty.
DSC - Ustawiony, jeúli karta jest
gotowa.
DRQ - Ustawiony, jeúli karta ø¹da za-
pisu danych do rejestru danych lub
w†buforze s¹ jeszcze jakieú dane do
odczytu poprzez rejestr danych.
CORR - Zostaje ustawiony, jeúli wy-
kryto b³¹d danych, ktÛry zosta³
skorygowany. Ustawienie tego bitu
nie przerywa transmisji danych.
O†(IDX) - Zawsze ustawiony na 0.
ERR - Ustawiony w†przypadku wy-
st¹pienia b³Ídu w†wyniku wyko-
nania poprzedniej komendy.
Transmisja danych zostaje prze-
rwana. PrzyczynÍ wyst¹pienia te-
go b³Ídu dodatkowo pokazuje re-
jestr b³ÍdÛw.
Rejestr Kontrolny ( Device Control
Register ) - offset E, tylko do zapi-
su. Rejestr ten s³uøy do programo-
wego zerowania karty oraz do usta-
wienia trybu pracy z†wykorzysta-
niem przerwaÒ. Moøe byÊ on zapi-
sywany nawet w†przypadku zajÍtoú-
ci karty (bit BUSY w†rejestrze sta-
tusu ustawiony na 1). Znaczenie
poszczegÛlnych bitÛw tego rejestru
( rys. 9 ) jest nastÍpuj¹ce:
D7...D4 - Nieistotne.
D3 - WartoúÊ tego bitu jest igno-
rowana przez kartÍ.
SW Rst - Wpisanie jedynki powodu-
je programowy reset karty. Wyma-
ga programowego wyzerowania, aby
zakoÒczyÊ procedurÍ resetu i†umoø-
liwiÊ karcie normaln¹ pracÍ.
-IEn - Jeúli jest ustawiony, karta
nie zg³asza przerwaÒ do mikro-
Tab. 4. Adresy rejestrów karty
Offset Adres dostêpu Adres dostêpu
Rejestru - rys. 3 - rys. 4
0 0xF000 0x8000
1 0xF100 0x8001
2 0xF200 0x8002
3 0xF300 0x8003
4 0xF400 0x8004
5 0xF500 0x8005
6 0xF600 0x8006
7 0xF700 0x8007
E 0xFE00 0x800E
Uwaga! Rysunki: 3 i 4 opublikowano w pierwszej
czêœci artyku³u, w EP2/2004.
Rys. 6. Algorytm dostępu do
danych przy użyciu komend ATA
kontrolera. NajczÍúciej nie uøywa
siÍ trybu przerwaÒ, wiÍc naleøy
go ustawiÊ na 1.
D0 - WartoúÊ tego bitu jest ignoro-
wana przez kartÍ.
Rejestr g³owicy/dysku ( Drive/Head
Register ) - offset 6, do zapisu i†od-
czytu. Rejestr ten zawiera
4†najbardziej znacz¹ce bity adresu
LBA (lub numer g³owicy przy dostÍ-
pie w†trybie CHS), znacznik infor-
muj¹cy kontroler o†chÍci dostÍpu do
urz¹dzenia Master lub Slave oraz
znacznik wymuszaj¹cy pracÍ w†trybie
LBA. Znaczenie poszczegÛlnych bitÛw
tego rejestru ( rys. 10 ) jest nastÍpuj¹ce:
Bity D7 i†D5 - powinny byÊ usta-
wione na 1.
LBA - 1†oznacza ø¹danie dostÍpu
w†trybie LBA.
DRV - 0†oznacza, øe odwo³ujemy
siÍ do urz¹dzenia Master, 1†- do
Slave. Poniewaø karta CF po re-
secie jest skonfigurowana jako
Master, powinniúmy pozostawiÊ
ten bit wyzerowany podczas ko-
munikacji z†kart¹. Przestawienie
karty na Slave, jeúli korzystamy
z†trybu PC Card Memory , moøli-
we jest jedynie poprzez wpis do
rejestrÛw†konfiguracyjnych karty
(dostÍp przy niskim poziomie syg-
na³u -REG), a†wiÍc stosuj¹c po³¹-
czenia wed³ug rys. 3†lub rys. 4
(EP2/2004), po prostu jest niemoø-
liwe do zrealizowania.
HS3...HS0 - 4†najbardziej znacz¹ce
bity adresu LBA lub numer g³o-
wicy w†trybie CHS.
kazano na rys. 7 . Oznaczenia na
rysunku s¹ nastÍpuj¹ce:
BBK - Bit zostaje ustawiony, jeøeli
kontroler wykryje, øe odwo³ujemy
siÍ do uszkodzonego bloku pamiÍ-
ci ( Bad Block ).
UNC - Bit zostaje ustawiony, jeøeli
kontroler karty wykryje b³¹d niemoø-
liwy do skorygowania przez wbudo-
wane mechanizmy korekcji b³ÍdÛw.
IDNF - عdany sektor nie moøe byÊ
odnaleziony.
ABRT - Bit zostaje ustawiony, jeúli
ø¹dana komenda zosta³a odrzuco-
na ze wzglÍdu na niegotowoúÊ
karty, b³Ídu zapisu lub prÛby wy-
konania nieprawid³owej komendy.
AMNF - Bit zostaje ustawiony, jeúli
wykryto dowolny b³¹d.
Rejestr Statusu i†Alternatywnego
statusu ( Status and Alt. Status Re-
gisters ) - offsety 7†oraz E, tylko do
odczytu. Rejestry te zwracaj¹†aktual-
ny status karty Compact Flash. Po-
winien on byÊ sprawdzany przed
wys³aniem jakiejkolwiek komendy
do kontrolera karty, nastÍpnie po
wys³aniu tej komendy oraz pomiÍ-
dzy zapisem/odczytem kaødego sek-
tora danych. Rejestr alternatywnego
statusu rÛøni siÍ tym od podstawo-
wego, øe odczyt pierwszego nie ka-
suje sygna³u aktywnego przerwania
Rys. 7. Znaczenie poszczególnych bitów rejestru
błędów
Rys. 9. Znaczenie poszczególnych bitów rejestru
kontrolnego
Rys. 8. Znaczenie poszczególnych bitów rejestrów:
statusu i alternatywnego statusu
Rys. 10. Znaczenie poszczególnych bitów rejestru
głowicy/dysku
84
Elektronika Praktyczna 3/2004
32686325.021.png 32686325.022.png 32686325.023.png
K U  R S
Bajty nr 120...124 - liczba dostÍp-
nych sektorÛw w†trybie LBA, czy-
li zarazem pojemnoúÊ danej karty
- to najwaøniejsza dla nas infor-
macja, ktÛr¹ zwraca komenda
identyfikacji.
Rys. 11. Struktura kodu polecenia identyfikacja napędu
0x20 lub 0x21 - Odczyt Sekto-
ra/Ûw ( Read Sector(s) ) - rys. 12 .
Zak³adaj¹c, øe adresujemy kartÍ
w†trybie LBA, zawartoúÊ rejestrÛw
przy wywo³aniu komendy powinna
wygl¹daÊ tak:
X†- Dane nieistotne.
LBA = 1.
Drive = 0.
LBA[27...0] - adres sektora, od
ktÛrego rozpoczynamy transmisjÍ.
Sector Count - liczba sektorÛw do
odczytu (0 = 256, 1†= 1, 2†= 2 itd.).
Jest to polecenie najbardziej dla
nas interesuj¹ce. Pozwala na odczyt
maksymalnie 256 sektorÛw, jeúli
wartoúÊ rejestru 2†wynosi zero. Re-
jestry 3...6 zawieraj¹ adres pocz¹t-
kowego sektora. Jeúli bit LBA =1,
wtedy stosujemy adresowanie LBA,
a gdy LBA=0, to CHS. Po wydaniu
komendy trzeba zaczekaÊ, aø kont-
roler karty wyzeruje flagÍ BUSY
i†ustawi DRQ, a†nastÍpnie odczytaÊ
512 bajtÛw danych z† Rejestru da-
nych . Komenda posiada dwie od-
miany - wersja z†powtÛrzeniami
(komenda 0x20) nakazuje kontrole-
rowi w†przypadku natrafienia na
uszkodzony sektor prÛbowaÊ odczy-
taÊ go ponownie. Liczba prÛb jest
nieokreúlona standardem i†specyficz-
na dla kaødego typu karty. Mecha-
nizm ten jest niewidoczny dla uøyt-
kownika, a†informacja o†wyst¹pieniu
problemu pojawia siÍ jedynie jako
ustawienie bitu CORR w†rejestrze
statusu - o†ile kontrolerowi uda³o
siÍ skorygowaÊ odczytywane dane.
W†przeciwnym przypadku kontroler
ustawia flagÍ ERR i†przerywa trans-
Adresowanie rejestrÛw ATA
Jeúli juø znamy znaczenie po-
szczegÛlnych rejestrÛw kontrolera
ATA, musimy znaÊ sposÛb ich ad-
resowania. Zgodnie z†tab. 3 musimy
wygenerowaÊ na odpowiednich wy-
prowadzeniach karty w³aúciw¹ sek-
wencjÍ sygna³Ûw steruj¹cych. Przy
wykorzystaniu interfejsu do zewnÍtr-
znej pamiÍci RAM zawartego w†mik-
rokontrolerze, sprowadza siÍ to do
zapisu lub odczytu odpowiedniej ko-
mÛrki pamiÍci. W†zaleønoúci od te-
go czy pod³¹czyliúmy kartÍ wed³ug
rys. 3,†czy wed³ug rys. 4, poszcze-
gÛlne rejestry (o danym offsecie)
maj¹ adresy pokazane w† tab. 4 .
Jak pewnie uwaøni Czytelnicy
zauwaøyli, w†tab. 4†nie opisano
wszystkich moøliwych do zaadreso-
wania rejestrÛw ATA, a†jedynie
9†z†nich. Owe 9†rejestrÛw wystarcza
do typowej obs³ugi interfejsu ATA,
a†wiÍc pozosta³e rejestry moøemy
pomin¹Ê.
Specyfikacja ATA dla kart CF
zawiera doúÊ pokaün¹ liczbÍ obs³ugi-
wanych przez nie komend ATA.
Wiele z†nich dotyczy trybÛw zabez-
pieczeÒ ( Security Commands ), oraz
innych mniej waønych funkcji lub
s¹ rÛønymi odmianami podstawo-
wych komend zapisu/odczytu sekto-
ra. Ze wzglÍdu na ograniczon¹ objÍ-
toúÊ artyku³u opiszemy tylko 3†naj-
waøniejsze i†niezbÍdne komendy.
0x0E - Identyfikacja napÍdu
( Identify Drive ) - rys. 11 .
ZawartoúÊ rejestrÛw przy wywo-
³aniu komendy jest nastÍpuj¹ca:
X†- Dane nieistotne.
Drive - Numer dysku - w†naszym
przypadku bit ten powinien mieÊ
wartoúÊ 0.
Komenda zwraca 256 s³Ûw (512
bajtÛw) zawieraj¹cych informacje
o†danej karcie. Po wykonaniu ko-
mendy odczytujemy dane w†iden-
tyczny sposÛb jak odczytujemy jeden
sektor pamiÍci. SpoúrÛd danych naj-
bardziej interesuj¹ nas nastÍpuj¹ce:
Bajty nr 20...39 - numer seryjny
karty (w ASCII).
Bajty nr 54...93 - typ (nazwa)
karty.
Komendy ATA
Operacje zapisu i†odczytu danych
z†karty CF wymagaj¹ stosowania od-
powiednich komend zgodnych ze
specyfikacj¹†ATA. Oznacza to przy-
k³adowo, øe aby otrzymaÊ zawartoúÊ
jednego sektora pamiÍci, czyli 512
bajtÛw danych, naleøy najpierw za-
adresowaÊ kartÍ jako Master, po-
przez wpis do rejestru Numer g³owi-
cy/dysku czterech najbardziej znacz¹-
cych bitÛw LBA plus wartoúÊ 0xE0,
poczekaÊ na wyzerowanie flagi BU-
SY i†ustawienie flagi DRDY, a na-
stÍpnie wpisaÊ niezbÍdne dane do
rejestrÛw o†offsetach od 2†do 5, po
czym do rejestru komend wpisaÊ
kod komendy odczytu sektora. Na-
stÍpnie naleøy sprawdziÊ gotowoúÊ
karty na wys³anie danych i†dopiero
wtedy moøna odczytaÊ owe 512 baj-
tÛw poprzez wykonanie 512 odczy-
tÛw† Rejestru danych (offset 0).
Rys. 12. Struktura kodu polecenia odczyt sektora/ów
Elektronika Praktyczna 3/2004
85
32686325.001.png 32686325.002.png 32686325.003.png 32686325.004.png 32686325.005.png 32686325.006.png 32686325.007.png 32686325.008.png 32686325.009.png 32686325.010.png 32686325.011.png 32686325.012.png 32686325.013.png 32686325.014.png 32686325.015.png 32686325.016.png 32686325.017.png
K U  R S
s.
- Wpisaniu do rejestru kontrolnego
wartoúci 0x02.
- Odczekaniu oko³o 10
s.
- Sukcesywnym odczytywaniu za-
wartoúci rejestru Statusu do cza-
su aø kontroler wyzeruje flagÍ
BUSY i†ustawi flagÍ DRDY. Mak-
symalny czas odpowiedzi na re-
set moøe†wynieúÊ oko³o 500 ms.
- Kontrolnego odczytu rejestru Nu-
mer sektora (offset 3), ktÛry po
prawid³owym resecie karty przyj-
muje wartoúÊ 1.
Jeúli procedura ta zakoÒczy siÍ
sukcesem, mamy pewnoúÊ, øe karta
jest gotowa do przyjÍcia wybranej
przez nas komendy.
Wszystkie podane dotychczas in-
formacje powinny pozwoliÊ na na-
pisanie konkretnych procedur ko-
munikacji z†kart¹ CF, wiÍc w†ko-
lejnej czÍúci kursu przedstawiÍ
sposÛb†implementacji komend zapi-
su i†odczytu sektora dla kart typu
Compact Flash, oparty o†procedury
w†jÍzyku ìCî.
Romulad Bia³y
Rys. 13. Struktura kodu polecenia zapis sektora/ów
li chcemy zapisaÊ wiÍcej niø 1†sek-
tor ( Sector Count rÛøny od 1), to
moøemy wys³aÊ do karty zawartoúÊ
kolejnego sektora, czyli kolejne 512
bajtÛw danych do Rejestru danych
(offset 0).
0x30 lub 0x31 - Zapis sektora/
Ûw ( Write Sector(s) ) - rys. 13 .
ZawartoúÊ rejestrÛw przy wywo-
³aniu komendy jest identyczna jak
dla komendy odczytu, z†wy³¹cze-
niem kodu komendy.
Zasada dzia³ania jest identyczna
jak w†przypadku komendy Read
Sector , ale w†tym przypadku dane
s¹ zapisywane do karty. Po wys³a-
niu zawartoúci jednego sektora mu-
simy zaczekaÊ, aø kontroler karty
wyzeruje flagÍ BUSY, po czym jeú-
Programowe zerowanie
sterownika karty CF
Po za³¹czeniu zasilania karty,
przed rozpoczÍciem komunikacji
z†kart¹ lub w†przypadku wyst¹pie-
nia b³ÍdÛw komunikacji naleøy wy-
konaÊ programowe zerowanie ste-
rownika karty. W†praktyce polega
ono na:
86
Elektronika Praktyczna 3/2004
- Wpisaniu do rejestru kontrolnego
(offset E) wartoúci 0x06.
- Odczekaniu oko³o 10
µ
µ
misjÍ, jeúli prÛbowaliúmy odczyty-
waÊ wiÍcej niø 1†sektor.
32686325.018.png 32686325.019.png
Zgłoś jeśli naruszono regulamin