Fórum témák

» Több friss téma
Cikkek » SD kártyás zenelejátszó
SD kártyás zenelejátszó
Szerző: gabi20, idő: Márc 14, 2014, Olvasva: 22192, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   2 / 8

A követekezőkben röviden leírom az SD kártya működését SPI módban. Akit nem érdekel az SD kártya működése, nyugodtan lapozzon...

Az SD kártya 3V tápfeszültséggel működik. Áramfelvétele normál működés közben ~70 mA, alvó üzemmódban ~0,25 mA. Az SPI portot 0. módban használtam, 8Mbit/s sebesség mellett. Az adatátvitelnél mindig az MSB-t küldjük először. Természetesen az AVR a master, az SD kártya pedig a slave. Íme az SD kártya lábkiosztása:

sdcardpinout.jpg

Az SD kártyát alapvetően kétféle módban lehet használni:

  • SD mode (az adatátvitel  párhuzamos 4 bites porton keresztül történik)                                  
  • SPI mode (az adatátvitel SPI porton keresztül történik) 

 A 4GB-nál kisebb kapacitású SD kártyáknál 32 bit van használva címezésre.

Parancsok formátuma

 command_format.jpg

Minden parancs 6 byteból áll. Az első byte maga a parancs. A felső két bit értéke mindig 01 . Ezután következik a parancshoz tartozó sorszám. Példa:

RESET CMD0 0100 0000
READ CSD REGISTER CMD9 0100 1001
READ MULTIPLE BLOCK  CMD18   0101 0010 

 

A következő 4 byte a parancshoz tartozó operandust tartalmazza. Az olvasás parancs kiküldésénél például ide kell beírni a 32 bites címet. Vannak olyan parancsok is, melyek nem tartalmaznak semilyen operandust (pl. RESET), ilyenkor nullákat kell ide írni.

A 6. és egyben az utolsó bájt a 7 bites CRC (hibajavító) kódot tartalmazza. A legutolsó bit a stop bit, ennek mindig 1–nek kell lennie. A CRC hibajavító kód használata alapértelmezetten le van tiltva, így nem kell vele foglalkozni. Bekapcsolni a CRC_ON_OFF (CMD59) parancsal lehet.

A legtöbb parancs kiküldése után az SD kártya a MISO lábon keresztül küld visszajelzést az állapotáról (R1, R2, R3 response).

r1_response.jpg

Az R1 különböző hibajelző biteket tartalmaz. Ha minden megfelelően működik, akkor ennek a bájtnak az értéke 0x00. Alvó üzemmódban 0x01, ha hibás címet küldünk ki: 0x20, ha nemlétező parancsot küldünk ki: 0x04 stb...

Bizonyos parancsok után az SD kártya R2 vagy R3 választ ad. Az R2 és R3 formátum több bájtból áll, melyeket most nem részletezek.

Az inicializáció

Az SD kártyán a bekapcsolását követően inicializációt kell végrehajtani. Az inicializáció SPI módban több lépésből áll: 

• Bekapcsolást követően várunk ~10 ms–ot, majd a Chip Select (CS) és a MOSI lábat magas szintre húzva minimum 74 órajelet kiküldünk. Ezt a legegyszerűbben a következőképpen tehetjük meg:

program1.png 

Így kiküldünk 10 bájtot (80 órajelet), miközben a MOSI láb magas szinten lesz.

• Ezután kiküldjük a RESET parancsot:

program2.png

Figyelem! A bekapcsolást követő RESET (CMD0) parancs kiküldése után érvényes CRC kódot kell küldeni (0x95)! A továbbiakban azonban már nem fog kelleni CRC kódot küldeni, hiszen az alapértelmezetten ki van kapcsolva. A CMD0 parancs kiküldése után az SD kártya alvó üzemmódba kerül, és R1 visszajelzést ad. Az R1 értéke ekkor 0x01, hiszen alvó üzemmódban vagyunk.

• Felébreszteni a CMD1 parancs kiküldésével lehet:

program3.png

Ekkor már nem kell érvényes CRC kódot küldeni. A CRC kód helyére írhatunk nullákat vagy egyeseket, ügyeljünk azonban arra, hogy a legalsó bit (stop bit) mindig 1 legyen. A CMD1 parancs kiküldése után az SD kártya R1 visszajelzést ad. Az R1 értéke ekkor 0x00, hiszen felébresztettük az alvó üzemmódból.

Ezzel az inicializáció véget ért, az SD kártya készen áll a további parancsok fogadására.

Adatok olvasása SD kártyáról

Az SD kártya blokkokra van felosztva. Alapértelmezetten a blokkok mérete 512 B. Az adatok olvasásához én a READ_MULTIPLE_BLOCK (CMD18) parancsot használtam. Ezzel a parancsal folyamatosan lehet olvasni az kártyáról. Ha azonban csak egy adott blokkot akarunk kiolvasni, akkor a READ_SINGLE_BLOCK (CMD17) parancsot is használhatjuk. Továbbá ki kell küldenünk a 32 bites címet is, ahonnan olvasni akarunk. A CMD17 vagy CMD18 parancs kiküldése után az SD kártya R1 visszajelzést ad, melynek értéke – ha mindent jól csináltunk – 0x00.

program4.png

Az R1 response után az SD kártya fog küldeni egy bájtot, aminek az értéke 0xFE lesz. Ez jelzi azt, hogy a következő byte már érvényes adat lesz a memóriából. Ezután már nincs más teendőnk, mint küldeni az órajeleket, a kártya pedig a MISO lábon keresztül küldi nekünk az adatokat. Az adatátvitelt leállítani a STOP_TRANSMISSION (CMD12) parancsal lehet. A teljes parancsok listája részletes leírással az SD kártya adatlapjában találhatóak meg.

További információ:

SD card datasheet  How to use MMC/SDC  Simple SD audio player


A cikk még nem ért véget, lapozz!
Következő: »»   2 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem