Mmc (sd) și avr

Trebuie să fiți conștienți de faptul că în modul SPI numai comenzile de citire / scriere sunt acceptate într-un singur bloc sau în mai multe moduri de blocare (modul MMC acceptă modul citire / scriere). Dimensiunea blocului pentru citire / scriere poate fi dimensiunea unui sector al cartelei de memorie și dimensiunea unui octet. Suportul pentru operațiile de citire / scriere parțială a blocului de date este stocat în registrul CSD al cartelei de memorie.






Aproape că am uitat să vorbesc despre registrele care conțin o cartelă de memorie a MMC standard (SD). Aceste registre sunt puțin mai mari decât cele pe care le voi lista, dar cele pe care nu le indic sau nu sunt în mod special necesare sau nu sunt disponibile în modul SPI. Principalele registre care ne interesează sunt următoarele:

- CID (date de identificare a cardului): conține date prin care poate fi identificată cartela de memorie (numărul de serie, ID-ul producătorului, data fabricării etc.)
- CSD (date specifice cardului): conține toate tipurile de informații despre cardul de memorie (de la dimensiunea sectorului cartelei de memorie până la consumul în modul citire / scriere).
- OCR (Registrul condițiilor de funcționare): conține tensiunea de alimentare a cardului de memorie, tipul sursei de alimentare a cardului de memorie, starea procesului de inițializare a cardului.

Mulți, probabil, au observat că unele comenzi lipsesc în tabel. Așa cum am spus mai devreme, în modul SPI, unele funcții care sunt disponibile în modul MMC nu sunt disponibile. Prin urmare, unele comenzi nu sunt, de asemenea, disponibile. De asemenea, din tabel este clar că toate echipele din câmpul "Resp" au abrevierea R1 (2, 3, 7, etc.). Acesta este așa-numitul răspuns de card la echipa trimisă. Voi da un mic exemplu de schimb de informații cu un card de memorie pentru a ilustra cele de mai sus.

Să luăm în considerare acest exemplu în detaliu. Vedem că trimitem o comandă la hartă (linia DataIn), după acceptare, cardul va da un răspuns într-o anumită perioadă de timp (linia DataOut). Dimensiunea răspunsului depinde de comanda trimisă și are propriul format. Vă dau formatul răspunsurilor pe care le putem obține de pe cartela de memorie.

Mmc (sd) și avr

Mmc (sd) și avr

Mmc (sd) și avr

Acum, atingeți comenzile pentru cartela de memorie. Din tabelul de comenzi este clar că fiecare echipă are propriul index. Această valoare este folosită pentru a obține adevărata valoare a comenzii care trebuie trimisă pe cartela de memorie. Vederea generală a comenzii este prezentată mai jos (comanda în modul SPI are o lungime de 6 octeți):

Trebuie remarcat faptul că în protocolul MMC se termină toate CRC câmp de comunicare, ceea ce este necesar. În ceea ce privește modul SPI, în mod implicit, când intrați în acest mod, controlul CRC este dezactivat. Excepție fac echipa CMD0 și CMD8, deoarece acestea sunt trimise la card, care este încă în modul MMC, astfel încât câmpul CRC pentru aceste echipe trebuie să fie adevărat. Deoarece CMD0 a trimis o dată și toate cele șase octeți ai echipei sunt cunoscute în prealabil și nu se schimba, atunci câmpul CRC pentru orice echipa, vom trimite CRC la echipa CMD0 (este egal cu 0x95). În ceea ce privește CMD8, câmpul CRC, nu este constantă și depinde de parametrii trecut. Vreau să observ că puteți verifica, de asemenea, câmpul CRC în modul SPI. Acest lucru se face cu ajutorul comenzii corespunzătoare (CMD59).






O mică înțelegere a teoriei, să ne uităm la procesul de inițializare a cartelei de memorie. Voi încerca să prezint acest lucru sub forma unei scheme. De asta am ieșit din fișa cu date (am afirmat numai esența, după scăderea momentelor pe care le voi picta după diagramă):

Mmc (sd) și avr

Ei bine, unii spun, au tras nu înțeleg ce, dar sunteți aici să înțelegeți) Dar totul nu este atât de rău. Primul lucru care trebuie clarificat în această schemă este că cardurile nu par să le placă, sunt diferite (prin urmare, probabil ele sunt numite în mod diferit). Și în această diagramă, putem vedea că lor nu este mai puțin, și la fel de mult ca 4: MMC, SD versiuni 1.x Capacitate standard, capacitate standard de 2.x SD și versiunea pentru card SD 2.x de mare capacitate (card SD pentru a extinde capacitatea sau SDHC). Toate nu ar fi nimic, dar toate necesită o inițializare diferită și aceasta este cea mai ofensivă. În principiu, există o cale comună de a inițializa toate acestea, cu excepția SDHC, dar nu este corect, pentru că lucrul cu o capacitate standard de card SD 2.x și carduri MMC cu carduri identice corect (spre deosebire de structurile CID și CSD). Desigur, puteți construi un algoritm pentru a lucra cu fiecare card separat, dar vom merge calea universală (și cea mai dificilă la prima vedere).
Din structura de mai sus este prezentată următoarea cale de lucru (voi indica punctele principale care trebuie efectuate, dar acestea nu sunt indicate în această diagramă). Am stabilit că niște gunoaie au fost introduse în slotul cititorului de carduri. Noi, la rândul nostru, facem următoarele: furnizăm putere în intervalul de la 2,7-3,6 V, ne așteptăm

1ms (nu știu sigur cât de mult, dar pentru puterea de a obține epuizarea). SPI este configurat așa cum ar trebui (cred că toată lumea știe cum să facă acest lucru), iar ieșirea cardului de memorie _CS este setată la "1" logică. După aceasta, trebuie să aplicăm un minim de 74 de impulsuri de ceas la linia SCLK SPI. După ce terminăm toate acestea, setăm logica "0" la ieșirea cardului de memorie _CS și trimitem comanda CMD0. Din tabelul de comandă, vedem că răspunsul la CMD0 este R1, a cărui structură știm. Un pic înapoi de la gândul, și voi acorda o atenție la faptul că toate răspunsurile conțin primul octet al R1, al 7-lea bit, care este întotdeauna 0. Astfel, putem distinge între răspunsurile la mersul pe jos pe linia MISO de octeți 0xFF. Deci, după acceptarea lui R1, verificăm bitul "În stare inactivă" pentru egalitate "1". Dacă da, cardul se află în faza de inițializare. Și acum a venit prima etapă de determinare a tipului de card de memorie. Trimiterea comenzii CMD8, care indică tensiunea de card MC sprijinit să-l și solicită cardul selectat dacă acesta poate funcționa într-un interval dat de tensiuni, așteptați până când răspunsul R7. După cum se poate observa din diagrama bloc, carduri de memorie și standardul MMC și SD versiunile 1.x ei nu acceptă această comandă și, în consecință, în răspunsul său va conține un pic de «comandă ilegale». Dacă cele de mai sus sunt adevărate, atunci cardul instalat este fie MMC, fie SD versiunea 1.x. Acum este timpul să recunoaștem care dintre aceste două tipuri de carduri este introdus în cititorul de carduri. Pentru aceasta, trimiteți o comandă ACMD41 pe cardul de memorie, care inițiază procesul de inițializare a cardului. Această comandă este trimisă într-o buclă sau un cronometru este forțat să o execute, care verifică răspunsul la această comandă. În orice caz, cardul MMC nu acceptă ACMD41 și va returna o "comandă ilegală" în răspunsul său. În acest caz, cardul introdus este MMC, iar pentru inițializarea acestuia aveți nevoie de comanda CMD1 (este trimisă și într-o buclă până când răspunsul la acesta este 0). După ce a primit un răspuns la CMD1 egal cu 0x00, cardul MMC este gata de funcționare. Dacă răspunsul la ACMD41 nu conține nici un set de biți (adică 0x00), cardul SD este versiunea 1.x și este gata de utilizare. Acum faceți o copie de rezervă și presupuneți că, ca răspuns la comanda CMD8 nu conținea bitul "comanda ilegală", adică Avem o cartelă de memorie SD în versiunea 2.x a capacității standard (SDSC versiunea 2.x) sau SDHC. Următorul pas în acest caz este trimiterea comenzii ACMD41 cu parametrul indicând cardul de memorie, indiferent dacă aparatul acceptă carduri de memorie SDHC. Indiferent dacă suportul SDHC există sau nu, trimitem ciclic această comandă pe hartă atâta timp cât aceasta (cardul) nu termină procesul de inițializare. Când răspunsul de la ACMD41 este 0x00, cartela de memorie este inițializată și gata de plecare. Dar pentru a afla care este pe card, îi vom trimite comanda CMD58. Răspunsul din această comandă este R3, care la rândul său conține registrul OCR. După analiza biții de instalare OCR CSS vă poate determina tipul de card: CCS == 1 - cardul SDHC sau SDXC, CCS == 0 - carte de SDSC. Pentru a nu fi neîntemeiat, îmi voi aduce partea din codul de inițiere a cartelei de memorie:

P.S. Rularea un pic înainte, câteva screenshot-uri de citire a informațiilor de pe cartela de memorie:

Mmc (sd) și avr







Trimiteți-le prietenilor: