Mmc (sd) és avr

Tudnia kell, hogy SPI módban csak az olvasási / írási parancsok támogathatók egyetlen blokkban vagy több blokk üzemmódban (az MMC mód támogatja az olvasási / írási módot). Az olvasás / írás blokkmérete lehet a memóriakártya szektorának nagysága és 1 bájt mérete. Az adatblokk részleges leolvasására / írására vonatkozó műveletek támogatása a memóriakártya CSD regiszterében van tárolva.
Szinte elfelejtettem beszélni olyan regiszterekrõl, amelyek memóriakártyát tartalmaznak a szabványos MMC (SD) memóriakártyáról. Ezek a regiszterek valamivel nagyobbak, mint amit felsorolok, de azokat, amelyeket nem jelezek vagy nem különösebben szükségesek, vagy SPI módban nem állnak rendelkezésre. A legfontosabb nyilvántartások, amelyek érdekesek számunkra a következők:

- CID (kártyaadatok): olyan adatokat tartalmaz, amelyekkel a memóriakártya azonosítható (sorszám, gyártói azonosító, gyártási dátum stb.)
- CSD (kártya-specifikus adatok): mindenféle információt tartalmaz a memóriakártyáról (a memóriakártya-ágazat méretétől az olvasási / írási mód fogyasztásáig).
- OCR (Operation Conditions Register): tartalmazza a memóriakártya tápfeszültségét, a memóriakártya tápellátását, a kártya inicializálásának állapotát.

Sokan valószínűleg észrevették, hogy néhány parancs hiányzik a táblázatban. Mint korábban említettem, SPI módban bizonyos funkciók, amelyek MMC módban állnak rendelkezésre, nem állnak rendelkezésre. Ezért egyes parancsok szintén nem érhetők el. Az asztalról is világos, hogy az "Resp" mezőben minden csapat rendelkezik R1 rövidítéssel (2, 3, 7 stb.). Ez az úgynevezett kártya válasz a küldött csapatnak. A fentiek szemléltetésére egy kis példát adok az információcserére egy memóriakártyán.

Tekintsük ezt a példát részletesebben. Látjuk, hogy egy parancsot küldünk a térképre (a DataIn vonalra), miután elfogadtuk, a kártya egy bizonyos időre (DataOut vonal) ad választ. A válasz mérete az elküldött parancstól függ, és saját formátumú. Adok neked a válaszok formáját, amit a memóriakártyáról kaphatunk.

Mmc (sd) és avr

Mmc (sd) és avr

Mmc (sd) és avr

Most érintse meg a memóriakártya parancsokat. A parancs táblából egyértelmű, hogy minden csapatnak van saját indexe. Ez az érték arra szolgál, hogy a parancs valódi értékét elküldjük a memóriakártyára. A parancs általános nézete az alábbiakban látható (a parancs SPI módban 6 bájt hosszúságú):

Érdemes megjegyezni, hogy az MMC protokollban az összes adatcserét a CRC mező végzi, ami szükséges. Ami az SPI módot illeti, alapértelmezés szerint, amikor belép az üzemmódba, a CRC vezérlés le van tiltva. Ez alól kivételt képeznek CMD0 csapat és CMD8, mivel elküldik a kártya, amely még MMC módban, így a CRC mező ezek a csapatok igaznak kell lennie. Mivel CMD0 küldött egyszer és mind a hat bájt a csapat előre ismertek, és nem változik, akkor a CRC mező olyan csapat, küldünk CRC hogy CMD0 csapat (ez egyenlő a 0x95). Ami a CMD8-at illeti, a benne lévő CRC mező nem konstans, és az átadott paraméterektől függ. Szeretném tudni, hogy a CRC mező SPI módban is ellenőrizhető. Ez a megfelelő parancs segítségével történik (CMD59).
Az elméletnek kevés megértése, nézzük meg a memóriakártya inicializálásának folyamatát. Megpróbálom bemutatni ezt folyamatábra formájában. Ez az, amit a datasheet'a-ból kaptam ki (csak a lényeget mondom, miután kivontam néhány olyan pillanatot, amelyet a folyamatábra után festek):

Mmc (sd) és avr

Nos, egyesek azt mondták, hogy nem értették, miért, de te vagy azért, hogy megértsd;) De minden nem olyan rossz. Az első dolog, amit tisztázni kell ebben a rendszerben, hogy a kártyák nem tűnnek tetszenek, más (ezért valószínűleg másképp hívják őket). És ebben a diagram, azt látjuk, hogy azok nem kevésbé, és amennyire csak 4: MMC, SD változatok 1.x normál kapacitású SD 2.x normál kapacitású SD kártya 2.x High Capacity (SD kártya kapacitásbővítés vagy SDHC). Minden nem lenne semmi, de mindegyiknek más inicializálásra van szüksége, és ez a leginkább sértő. Elvileg van egy közös utat inicializálni mindet, kivéve SDHC, de ez nem helyes, mert a munka SD kártya 2.x normál kapacitás és MMC kártyák azonos kártyát helyesen (ellentétben a struktúrák CID és CSD). Természetesen építhet egy algoritmust, hogy külön-külön dolgozzon az egyes kártyákkal, de az egyetemes utat (és a legnehezebb pillantásokat) megyünk.
A fenti felépítésből az alábbi munkaterületet vázoljuk fel (megmutatom a főbb pontokat, amelyeket végre kell hajtani, de ezek nem szerepelnek ebben a diagramban). Megállapítottuk, hogy néhány szemetet helyeztek be a kártyaolvasó nyílásába. Mi viszont a következőket tesszük: 2,7-3,6 V-os teljesítményt nyújtunk

1 ms (nem tudom biztosan, hogy mennyi, de a hatalom kimerül). Az SPI úgy van konfigurálva, hogy (azt hiszem, mindenki tudja, hogyan kell ezt csinálni), és a _CS memóriakártya kimenete logikai "1" -re van állítva. Ezt követően legalább 74 óraimpulzust kell alkalmazni az SCLK SPI vonalra. Miután mindezt elvégezte, beállítjuk a logikai "0" értéket a _CS memóriakártya kimenetén és elküldi a CMD0 parancsot. A parancs táblából látjuk, hogy a CMD0-re adott válasz R1, amelynek struktúrája tudjuk. Egy kicsit vissza a gondolattól, és fogok figyelni arra, hogy az összes választ tartalmaz az első bájt az R1, 7. bit, amely mindig 0. Így tudjuk megkülönböztetni válaszokat séta a MISO sorban bájtok 0xFF. Tehát az R1 elfogadása után ellenőrizzük a "készenléti állapot" bitjét az "1" egyenlőséghez. Ha igen, a kártya az inicializálási fázisban van. És most jött az első lépés a memóriakártya típusának meghatározására. Benyújtása parancsot CMD8, ami azt jelzi, a támogatott kártya MC feszültséget, és kéri a kiválasztott kártya, hogy tud működni egy adott tartományon belüli feszültségek, várjon, amíg R7 választ. Amint a blokkdiagramból látható, az 1.x verziójú MMC és SD memóriakártyák nem támogatják ezt a parancsot, és ennek megfelelően válaszukban az "illegális parancs" bitet tartalmazzák. Ha a fenti igaz, akkor a telepített kártya MMC vagy SD 1.x verzió. Most eljött az ideje annak felismerése, hogy a két kártya közül melyik van beillesztve a kártyaolvasóba. Ehhez küldjön egy ACMD41 parancsot a memóriakártyára, amely kezdeményezi a kártya inicializálásának folyamatát. Ezt a parancsot hurokba küldi, vagy egy időzítő végrehajtja azt, ami ellenőrzi a parancs válaszát. Mindenesetre az MMC kártya nem támogatja az ACMD41-et, és válaszában "illegális parancsot" ad vissza. Ebben az esetben a behelyezett kártya MMC, és az inicializálásához szüksége van a CMD1 parancsra (ez is egy ciklusban van elküldve, amíg a válasz 0-ra van állítva). Miután CMD1 válasz érkezett 0x00-ra, az MMC kártya üzemkész. Ha az ACMD41-re adott válasz nem tartalmaz set biteket (azaz 0x00), akkor az SD kártya 1.x verziójú, és készen áll a használatra. Most hátráljunk egy kicsit, és feltételezzük, hogy a CMD8 parancsra adott válasz nem tartalmazta az "illegális parancs" bitet, azaz. Van egy SD memóriakártya a szabványos kapacitás 2.x verziójával (SDSC 2.x verzió) vagy SDHC-vel. Ebben az esetben a következő lépés az ACMD41 parancs elküldése a memóriakártyát jelző paraméterrel, függetlenül attól, hogy a készülék támogatja-e az SDHC memóriakártyákat. Függetlenül attól, hogy van-e SDHC támogatás, vagy sem, ciklikusan elküldjük ezt a parancsot a térképre mindaddig, amíg a (kártya) nem fejezi be az inicializálási folyamatot. Amikor az ACMD41 válasz 0x00, a memóriakártya inicializálódik és készen áll. De annak érdekében, hogy megtudjuk, melyik van a kártyán, küldjük CMD58 parancsát. Ebből a parancsból az R3 válasz, amely viszont az OCR regisztert tartalmazza. Miután elemezte az OCR-t a CSS bit beállításához, meghatározhatja a kártya típusát: CCS == 1 - SDHC vagy SDXC kártya, CCS == 0 - SDSC kártya. Annak érdekében, hogy ne legyen megalapozatlan, elhozom a memóriakártya inicializáló kódját:

Ui Egy kicsit előre, egy pár screenshot, amely információkat olvas a memóriakártyáról:

Mmc (sd) és avr