4.1. Pojednanie o SD karte

Na internete nie je ucelený dokument, ktorý by popisoval komunikáciu jednoduchých mikroprocesorových systémov s SD kartou.

Väčšina informácií pochádza zo stránky elm-chan.org , kde je popísaný základný pricíp komunikácie a je to vynikajúca stránka na začatie bádania s SD kartou. Avšak riešenia ďalších problémov spôsobených nejednotnou implementáciu štandardov medzi výrobcami (príkladom sú staršie karty Kingston), treba prácne hľadať na množstve fór po celom svete. Tento článok popisuje spôsob inicializácie SD/MMC karty a spôsob riešenia neštandardných situácií.

Ako pripojiť SD kartu

Väčšina amatérskych riešení beží na mikroporcesoroch s 5V napájacím napätím, SD karty však vyžadujú 3,6V alebo menej. Google vyhľadá riešenia s odporovým deličom 1:2, alebo s IO 74HC125 (zapojenie je však v rozpore s katalógovými hodnotami, v praxi však nevykazuje žiadny problém), 74CHC4050 (ktorý sa ťažšie hľadá), prípadne ešte so Zenerovými diódami. Keďže amatérske riešenia komunikujú s SD kartou výlučne protokolom SPI, vystačia (z pohľadu karty) tri vstupné signály (MOSI, CLK, CS) a jeden výstupný (MISO). Podľa špecifikácie SD Association karty class 9 nepodporujú SPI mód, také však na trhu štandrdne nie sú.

Ako komunikovať s SD, príp. MMC kartou

Karta reaguje na definované príkazy CMD s väčšinou 4 parametrami ukončený kontrolným súčtom, na ktoré reaguje niekoľkými možnými odpoveďami R.

Príkaz je číslo, zvýšené o 40h, najvyšší bit je nulový, ďalší má hodnotu 1 (01xxxxxx).

Prvou fázou komunikácie je incializácia karty. Po pripojení je potrebné vyčkať čas asi 1s na vnútorné procesy karty. Potom môže začať samostná komunikácia s kartou. Počiatočná frekvencia hodinových impulzov by nemala prekročiť 400kHz. Na začiatok je potrebných najmenej 74 taktov, pričom karta ešte nesmie byť aktivovaná signálom CS.

Následne môže byť aktivovaný signál CS a vyslaný prvý príkaz CMD0 s parametrom 00 00 00 00. Je to jediný príkaz, ktorý vyžaduje správny kontrolný súčet (čo ako bude uvedené neskôr, nie je celkom pravda), tento súčet je však vždy 95h. Správne pripojená karta reaguje odpoveďou 01h. Signál CS je potrebné následne deaktivovať (log. 1).

Doplnené: Niektoré karty vrátia odpoveď 3Fh, čo nie je popísané v žiadnom dokumente od SD asociácie. Riešením je načítanie ďalšieho bajtu (ten je zväčša 01h), deaktivácia CS a opakovanie inicializácie vrátane úvodných taktov hodín.

Ďalší postup inicializácie nie je jednotný a podľa rôznych sa zdrojov líši. Dobrý postup ukazuje vo vývojom diagrame elm-chan.org . Karty totiž podliehajú vývoju a novšie verzie majú aj nové príkazy. Treba teda zistiť, o aký typ karty ide. Vhodným príkazom je CMD8 s parametrom 00 00 01 AA, ktorý však opäť musí mať správny CRC súčet (87h). Predtým však treba 8 hodinových impulzov pri neaktívnom CS.

Ak karta daný príkaz nepozná, vráti hodnotu 05h (MMC karty), Ak je príkaz známy, vráti hodnotu 00 00 00 01 (SD ver. 1) alebo 00 00 01 AA (SD ver. 2). To sú tri možnosti, na základe ktorých je možné posúdiť typ karty. Pre každú z nich sa líši ďalší postup, ktorým je čakanie na ukončenie inicializačného procesu.

Pre MMC karty sa opakovaním príkazu CMD1 čaká na návratovú hodnotu 00h (čo značí, že karty je pripravená na použitie). Pre SD karty je to príkaz ACMD41 (čo sú dva príkazy CMD55 a CMD41), v prípade ver. 1 s parametrom 00 00 00 00, pre ver. 2. s parametrom 40 00 00 00.

Upozornenie: niektoré karty nereagujú na žiadny z týchto príkazov, teda ani na CMD1 a zdá sa byť všetko stratené (tu by už podľa diagramu mal algoritmus končiť a vyhlásiť kartu za chybnú). Každý výrobca si trochu štandard prispôsobil. Netreba to vzdávať. Ďalší príkaz CMD1 to možno zvráti. Opäť mu musí predchádzať 8 hodinových impulzov pri neaktívnom CS.

Správna reakcia SD karty ver. 2.

Prvý príkaz CMD1 skončil s chybou. Netreba to vzdať!

Prvé opakovanie CMD1 prinieslo svoje ovocie!

Starším kartám trvá stovky milisekúnd, kým sa iniciujú. Až potom príkazy CMD1 alebo ACMD41 vrátia dlhoočakávanú odpoveď 00.

 

Tejto karte trvalo 400ms, kým skončila inicializácia.

Ukončenie inicializácie príkazom ACMD41.

Na záver ešte treba nastaviť veľkosť bloku na 512b (ako využíva FAT) príkazom CMD 16 s parametrom 00 00 02 00. Ale pozor, niektoré karty zareagujú tak, že sa opäť vrátia do inicializačného módu.Preto treba inicializáciu zopakovať (napr. od príkazu CMD8), druhýkrát však už bez CMD16.

Príkaz CMD16 niektoré karty vráti späť do inicializácie,

ale väšina kariet to zvládne na prvý pokus.

Toto ale nie je potrebné pri kartách ver.2, ktoré majú štandardne veľkosť bloku 512 bajtov (SDHC). Tu však treba zistiť, či karta podporuje adresáciu na bajty alebo bloky. Použije sa príkaz CMD58, ktorý v prípade, že vráti aktívny 30. bit (druhý zľava), karta vyžaduje blokovú adresáciu pamäťového priestoru.

Príkaz CMD58 vracia parametre karty.

V tejto fáze je karta pripravená na použitie a môže nasledovať čítanie alebo zápis.

Po úspešenej inicializácii možno čítať parametre file systému.

Zdrojové kódy knižníc SD a FAT32 sú zverejnené na stránke sd89x51