Pinout kartice Secure Digital (SD). Povezivanje SD kartice na mikrokontroler Upravljanje SD karticom

SD kartice su bazirane na starijem formatu Multi Media Card (MMC), ali većina je fizički nešto deblja od MMC kartica. Takođe se mogu pohvaliti većim brzinama prenosa podataka. DRM funkcije su dostupne, ali se malo koriste. SD kartice općenito imaju dimenzije 32 mm × 24 mm × 2,1 mm, ali mogu biti tanke i do 1,4 mm, baš kao i MMC kartice.

Dostupne su različite brzine. Pominju se istim nx zapisom kao i CD-ROM-ovi; višekratnik od 150 kB/s. Uređaji sa SD slotovima mogu koristiti tanje MMC kartice, ali standardne SD kartice neće stati u tanje MMC utore. MiniSD i MicroSD kartice se mogu koristiti direktno u SD slotovima sa adapterom. Postoje čitači koji omogućavaju pristup SD karticama preko mnogih portova za povezivanje kao što su USB, FireWire.

Pin SD mod SPI Mode
Ime Tip Opis Ime Tip Opis
1 CD/DAT3 I/O/PP Detekcija kartice / linija podataka konektora 3 C.S. I Odabir čipa u niskom statusu
2 CMD PP Komandna/odgovorna linija D.I. I Unos podataka
3 Vss1 S GND VSS S GND
4 Vdd S Napajanje VDD S Napajanje
5 CLK I Sat SCLK I Sat
6 Vss2 S GND VSS2 S GND
7 DAT0 I/O/PP Linija podataka konektora 0 DO O/PP Izlaz podataka
8 DAT1 I/O/PP Linija podataka konektora 1 RSV
9 DAT2 I/O/PP Linija podataka konektora 2 RSV

Interfejs SD kartice je kompatibilan sa standardnim operacijama MMC kartica. Sve SD memorije i SDIO kartice su potrebne da podržavaju stariji SPI/MMC način rada koji podržava nešto sporiji četverožični serijski interfejs (sat, serijski ulaz, serijski izlaz, odabir čipa) koji je kompatibilan sa SPI portovima na mnogim mikrokontrolerima. Mnogi digitalni fotoaparati, digitalni audio plejeri i drugi prenosivi uređaji verovatno koriste isključivo MMC režim. MMC način rada ne pruža pristup vlasničkim funkcijama šifriranja SD kartica, a besplatna SD dokumentacija ne opisuje ove funkcije. Kako SD enkripcija postoji prvenstveno za proizvođače medija, nije od velike koristi za potrošače koji obično koriste SD kartice za držanje nezaštićenih podataka.

Postoje tri načina prijenosa koje podržava SD: SPI način (odvojeni serijski ulaz i serijski izlaz), jednobitni SD način (odvojeni komandni i podatkovni kanali i vlasnički format prijenosa) i četverobitni SD način (koristi dodatne pinove plus nešto ponovo dodijeljeni pinovi) za podršku paralelnih prijenosa širine četiri bita. Kartice male brzine podržavaju brzinu prenosa podataka od 0 do 400 kbit/s i SPI i jednobitni SD način prijenosa. Kartice velike brzine podržavaju brzinu prenosa podataka od 0 do 100 Mbit/s u četvorobitnom režimu i 0-25 Mbit/s u SPI i jednobitnom SD režimu.

Sigurnosne funkcije SD kartica uključuju:

  • Mehanizam zaštite autorskih prava sa SDMI standardom (Secure Digital Music Initiative)
  • Integrirana CPRM zaštita datoteka i sistem šifriranja (CPRM je zaštita sadržaja za medije za snimanje)

Koriste se uređaji bazirani na mikrokontrolerima eksternu memoriju. Ako trebate pohraniti jedinice megabajta, tada su prikladni serijski čipovi flash memorije. Međutim, za velike količine (desetine do stotine megabajta) obično se koristi neka vrsta memorijske kartice. Trenutno su najrasprostranjenije SD i microSD kartice i o njima bih želeo da govorim u nizu materijala. U ovom članku ćemo govoriti o povezivanju SD kartica na mikrokontroler, a u nastavku ćemo shvatiti kako čitati ili pisati podatke na njih.

Pinout SD i microSD kartica

SD kartice mogu raditi u dva načina rada - SD i SPI. Namjena pinova kartice i dijagram povezivanja ovise o korištenom načinu rada. 8-bitni AVR mikrokontroleri nemaju hardversku podršku za SD način rada, tako da se kartice sa njima obično koriste u SPI modu. 32-bitni mikrokontroleri bazirani na ARM jezgri, na primjer AT91SAM3, imaju interfejs za rad sa karticama u SD modu, tako da tamo možete koristiti bilo koji način rada.

Dodjeljivanje kontakata na SD kartici u SD modu


Dodjela kontakata SD kartice u SPI modu

Dodjela kontakata microSD kartice u SD modu



Dodjela kontakata microSD kartice u SPI modu



Povezivanje SD i microSD kartica na mikrokontroler u SPI modu

Napon napajanja SD kartica je 2,7 - 3,3 V. Ako se mikrokontroler koji se koristi napaja istim naponom, tada se SD može direktno povezati na mikrokontroler. Rasno ispravan dijagram, sastavljen proučavanjem specifikacija na SD karticama i šema raznih razvojnih ploča, prikazan je na donjoj slici. Prema ovoj šemi, kartice su povezane na razvojne ploče kompanije Olimex i Atmel.

Dijagram prikazuje pinove SD kartice, a ne konektor.


L1 - ferit ili prigušnica, nominalno za struju >100 mA. Neki ga instaliraju, neki bez njega. Ali ono što zaista ne biste trebali zanemariti je polarni kondenzator C2. Jer kada je kartica povezana, dolazi do strujnog udara, napon napajanja „pada“ i mikrokontroler se može resetirati.

Postoji određena nejasnoća oko pull-up otpornika. Budući da SD kartice proizvodi nekoliko proizvođača, postoji nekoliko specifikacija za njih. Neki dokumenti jasno ukazuju na potrebu za pull-up otpornicima (čak i za neiskorištene vodove - 8, 9), dok drugi dokumenti ne sadrže ove upute (ili ih nisam našao).

Pojednostavljena verzija kola (bez pull-up otpornika) prikazana je na donjoj slici. Ovo kolo je testirano u praksi i koristi se u Microelectronika pločama. Također se koristi u mnogim amaterskim projektima koji se mogu naći na internetu.



Ovdje se signalne linije SD kartice drže visoko od strane mikrokontrolera, a neiskorištene linije (8, 9) nisu nigdje spojene. U teoriji, trebalo bi ih povući unutar SD kartice. Dalje ću graditi na ovoj šemi.

Ako se mikrokontroler napaja naponom drugačijim od napona napajanja SD kartice, na primjer 5 V, tada je potrebno uskladiti logičke razine. Dijagram ispod prikazuje primjer usklađivanja nivoa kartice i mikrokontrolera pomoću razdjelnika napona. Princip usklađivanja nivoa je jednostavan - potrebno je da dobijete 3,0 - 3,2 V od 5 volti.



MISO - DO linija ne sadrži djelitelj napona, jer se podaci na njemu prenose sa SD kartice na mikrokontroler, ali da biste se zaštitili od budale, možete i tu dodati sličan razdjelnik napona, to neće utjecati na funkcionisanje krug.

Ako koristite bafer čip, kao što je CD4050 ili 74AHC125, za usklađivanje nivoa, ovi nedostaci se mogu izbjeći. Ispod je sklop u kojem se usklađivanje nivoa vrši pomoću IC 4050. Ovaj IC ima 6 neinvertirajućih bafera. Neiskorišteni baferi čipa su "prigušeni".

Povezivanje microSD kartica je slično, samo se njihov broj pinova malo razlikuje. Daću samo jedan dijagram.



Na dijagramima sam gledao direktno povezivanje SD kartica na mikrokontroler - bez konektora. U praksi, naravno, ne možete bez njih. Postoji nekoliko vrsta konektora i oni se malo razlikuju jedni od drugih. Po pravilu, pinovi konektora ponavljaju pinove SD kartice, a sadrže i nekoliko dodatnih - dva pina za detekciju kartice u slotu i dva pina za određivanje blokade upisivanja. Ovi pinovi nisu ni na koji način električno povezani sa SD karticom i ne moraju biti povezani. Međutim, ako su potrebni, mogu se povezati kao obično taktično dugme - jedan pin na masu, drugi preko otpornika na pozitivnu snagu. Ili koristite mikrokontrolerski pull-up otpornik umjesto vanjskog otpornika.

Povezivanje SD i microSD kartica na mikrokontroler u SD modu

Pa, da upotpunim sliku, dat ću dijagram za povezivanje SD kartice u njenom izvornom načinu rada. Omogućava razmjenu podataka većom brzinom od SPI moda. Međutim, nemaju svi mikrokontroleri hardverski interfejs za rad sa karticom u SD modu. Na primjer, Atmelovi ARM mikrokontroleri SAM3/SAM4 ga imaju.



DAT sabirnica podataka može se koristiti u 1-bitnom ili 4-bitnom načinu rada.

Nastavlja se...

Dobar dan svima! Danas ćemo razgovarati o povezivanje SD memorijske kartice na STM32 mikrokontroler.

Čini se da STM32F10x kontroleri imaju dovoljno memorije, zašto bi ih bilo više, ali ovaj utisak je varljiv) Na primjer, trebamo prikazati nekoliko različite slike– format 320*240 – odnosno 76800 piksela, od kojih svaki odgovara čak 2 bajta. Tako dobijamo oko 150 kB po slici. A to je mnogo po standardima mikrokontrolera i nije činjenica da se u njegovu Flash memoriju mogu strpati dvije različite slike. Ili trebamo pohraniti velike količine informacija, podataka s nekog senzora, na primjer. Štaviše, tako da su ovi podaci dostupni čak i nakon što je napajanje isključeno. Ovdje eksterna memorija dolazi u obzir. I bilo bi odlično rješenje SD memorijska kartica ili MMC. Usput, u ovom članku ćemo provesti eksperimente na micro SD kartica.

Prvo, nekoliko riječi o samoj memorijskoj kartici, tačnije o njenom pinoutu. Cela stvar izgleda ovako:

Pa šta mi imamo ovde? Pa, odmah je jasno da ima osam pinova. Dodjela pinova je kako slijedi (s lijeva na desno):


Stupac SPI Mode nam nagovještava da je u interakciji sa mikrokontrolerom koristeći SPI interfejs. ALI! Mi ćemo krenuti drugim putem 😉 Stvar je u tome što STM32 u sebi ima gotov periferni modul za rad sa memorijskim karticama, a zove se SDIO.

Općenito, interakcija s memorijskim karticama uključuje slanje određenih komandi. Neke naredbe zahtijevaju argument, neke ne. Komande se mogu naći u službenoj dokumentaciji za određenu karticu. Dakle, ugrađeni SDIO modul omogućava značajno pojednostavljenje procesa prenošenja naredbi, a zapravo i procesa rada s vanjskim memorijskim karticama. Na primjer, ovdje je registar SDIO_CMD– tu jednostavno zapišemo šifru komande koju želimo prenijeti na karticu. Ili ovdje je registar statusa SDIO_STA– postoje čak 24 zastavice za svako kijanje, odnosno za veliki broj događaja.

Inače, STM takođe raduje dobrom dokumentacijom o cijeloj ovoj stvari. Evo, na primjer, Detaljan opis inicijalizacija za SD memorijsku karticu (sve je opisano slično za druge vrste kartica):

Pa, zapravo, vrijeme je da prijeđemo na praktičan primjer. Zaronimo po Standardnoj perifernoj biblioteci.

U fajlu stm32f10x_sdio.h Tradicionalno, nalazimo strukture za sve vrste podešavanja – to jest, za odabir izvora signala takta, frekvencije SDIO kontrolera i podešavanje broja bajtova koji se prenose. Sve je tamo tako velikodušno komentarisano da ne želim ni da ponavljam posebno)) Samo pogledajte:

typedef struct (uint32_t SDIO_ClockEdge; /* Određuje tranziciju sata na kojoj se vrši hvatanje bita. Ovaj parametar može biti vrijednost @ref SDIO_Clock_Edge */ uint32_t SDIO_ClockBypass; /* Određuje da li je zaobilaženje razdjelnika SDIO sata omogućena ili onemogućena. Ovaj parametar može biti vrijednost @ref SDIO_Clock_Bypass */ uint32_t SDIO_ClockPowerSave; /* Određuje da li je izlaz SDIO sata omogućen ili onemogućen kada je magistrala neaktivna. Ovaj parametar može biti vrijednost @ref SDIO_Clock_Power_Save */ uint32_t SDIO_BusWide; /* Određuje širinu SDIO magistrale. Ovaj parametar može biti vrijednost @ref SDIO_Bus_Wide */ uint32_t SDIO_HardwareFlowControl; /* Određuje da li je SDIO hardverska kontrola toka omogućena ili onemogućena. Ovaj parametar može biti vrijednost @ref SDIO_Hardware_Flow_Control */ uint8_t SDIO_ClockDiv; /* Određuje taktnu frekvenciju SDIO kontrolera. Ovaj parametar može biti vrijednost između 0x00 i 0xFF. */) SDIO_InitTypeDef; typedef struktura (uint32_t SDIO_Argument; /* Određuje argument SDIO komande koji se šalje na karticu kao dio komandne poruke. Ako naredba sadrži argument, mora se učitati u ovaj registar prije pisanja naredbe u registar komandi */ uint32_t SDIO_CmdIndex; /* Određuje indeks SDIO komande. Mora biti manji od 0x40. */ uint32_t SDIO_Response; /* Određuje tip SDIO odgovora. Ovaj parametar može biti vrijednost @ref SDIO_Response_Type */ uint32_t SDIO_Wait; /* Određuje da li je SDIO zahtjev čekanja na prekid omogućen ili onemogućen. Ovaj parametar može biti vrijednost @ref SDIO_Wait_Interrupt_State */ uint32_t SDIO_CPSM; /* Određuje da li je mašina stanja staze SDIO komande (CPSM) omogućena ili onemogućena. Ovaj parametar može biti vrijednost @ref SDIO_CPSM_State */) SDIO_CmdInitTypeDef; typedef struct (uint32_t SDIO_DataTimeOut; /* Određuje period vremena čekanja podataka u časovima sabirnice kartice. */ uint32_t SDIO_DataLength; /* Određuje broj bajtova podataka koji će se prenijeti. */ uint32_t SDIO_DataBlockSize; /* Određuje veličinu bloka podataka za prijenos bloka. Ovaj parametar može biti vrijednost @ref SDIO_Data_Block_Size */ uint32_t SDIO_TransferDir; /* Određuje smjer prijenosa podataka, bilo da je prijenos čitanje ili pisanje. Ovaj parametar može biti vrijednost @ref SDIO_Transfer_Direction */ uint32_t SDIO_TransferMode; /* Određuje da li je prijenos podataka u stream ili blok modu. Ovaj parametar može biti vrijednost @ref SDIO_Transfer_Type */ uint32_t SDIO_DPSM; /* Određuje da li je SDIO Data path state machine (DPSM) omogućen ili onemogućen. Ovaj parametar može biti vrijednost @ref SDIO_DPSM_State */) SDIO_DataInitTypeDef;

Zapazimo kako SPL implementira prijenos komandi na memorijsku karticu. Za ove namjene je dodijeljena posebna struktura. SDIO_CmdInitTypeDef. Na terenu SDIO_CmdIndex unesite komandni kod u polje SDIO_Argument– argument naredbe, također popunite preostala polja. Ostaje samo da se nekako uguraju ti podaci mikro kartica SD 😉 I za to su nam pripremili funkciju:

SDIO_SendCommand (SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)

Kao argument, prenosimo mu strukturu koju smo kreirali. Za snimanje podataka postoji funkcija - SDIO_WriteData(uint32_t Data). Nakon pozivanja ove funkcije, podaci će biti u registru posebno dizajniranom za ovu svrhu - SDIO_FIFO.

Ovako radite sa SDIO modulom u STM32F10x)

Sada konačno pređimo na praksu. Opet ću raditi sa Mini STM32 pločom, pošto su ljubazni Kinezi bili zbunjeni instaliranjem utora za micro SD memorijsku karticu na njoj. Evo dijagrama povezivanja konektora kartice na mikrokontroler:

Za pisanje programa koristit ćemo gotov primjer za Keil - odatle ćemo uzeti dvije datoteke u kojima je implementirano nešto poput drajvera za rad s karticama - ovo su datoteke sdcard.c I sdcard.h. Mi stvaramo novi projekat, mi prilažemo ove datoteke tamo, a pored toga, naravno, CMSIS i SPL datoteke. Evo gotovog projekta, u koji je već sve dodato - preostaje samo napisati kod za funkciju main())

Datoteka sdcard.c implementira sve vrste funkcija za rad sa memorijskom karticom, sada samo treba da ih koristimo 😉 Hajde da napišemo kod! Na primjer, zapišimo 512 bajtova testnih podataka na mikro SD, a zatim ih pokušajmo pročitati:

// Povežite potrebne datoteke#include "stm32f10x.h" #include "sdcard.h" /*******************************************************************/ // Nizovi ulaznih i izlaznih podataka i varijabla za pohranjivanje podataka// o našoj kartici uint8_t writeBuffer[ 512 ] ; uint8_t readBuffer[ 512 ] ; SD_CardInfo SDCardInfo; /*******************************************************************/ int main() ( // Testirajte podatke za pisanje za (uint16_t i = 0; i< 512 ; i++ ) { writeBuffer[ i] = i % 256 ; readBuffer[ i] = 0 ; } // Inicijaliziranje mape SD_Init() ; // Dobijte informacije o kartici SD_GetCardInfo(& SDCardInfo) ; // Odabir kartice i podešavanje načina rada SD_SelectDeselect((uint32_t ) (SDCardInfo.RCA<< 16 ) ) ; SD_SetDeviceMode(SD_POLLING_MODE) ; // I na kraju, pisanje i čitanje SD_WriteBlock(0x00, writeBuffer, 512) ; SD_ReadBlock(0x00, readBuffer, 512) ; dok (1 ) ( ) ) /*******************************************************************/

Imajte na umu da SD kartica podržava snimanje u blokovima od 512 bajta.

Ako pokrenemo program pod debagerom, vidjet ćemo da se očitani podaci poklapaju sa pisanim podacima =) Tako da eksperiment možemo smatrati uspješnim. To je to za danas, vidimo se uskoro!

Kao što znate, SD memorijske kartice su kompatibilne sa SPI interfejsom, tako da se lako mogu spojiti na mikrokontroler i komunicirati s njima. Dostupni su i adapteri za microSD kartice, od takvog adaptera možemo napraviti slot za microSD karticu za naš izgled. Fotografije ispod prikazuju izgled proizvedenog adaptera za povezivanje na matičnu ploču.

Projekt je u početku koristio microSD memorijsku karticu od 1 GB. Mikrokontroler je ATmega8 ili ATmega32, radi na 8 MHz od internog RC oscilatora. Dodatno, RS-232 interfejs je korišćen za povezivanje prototipa sa personalnim računarom za praćenje podataka. Za konvertovanje logičkih nivoa interfejsa koristi se MAX232 čip. Za napajanje kruga potrebno je stabilizirano napajanje od 3,3 V (čip MAX232 je dizajniran za napon napajanja od 5 V, međutim, kao što je praksa pokazala, ostaje u funkciji na 3,3 V). Povezivanje memorijske kartice pomoću 7-žičnog kola, prema pinoutu (vidi sliku).

Šematski dijagram za ATmega8 mikrokontroler.

Pull-up otpornici R1, R2 nominalne vrijednosti 51 kOhm SPI sučelja pružaju bolju stabilnost pri radu sa različitim karticama. Zener diode D1, D2 su dizajnirane da zaštite memorijsku karticu tokom rada programatora u krugu (ISP). Pinovi mikrokola MAX232 VCC i GND nisu naznačeni na dijagramima, ali moraju biti povezani na odgovarajuće tačke na dijagramu.

Šema za mikrokontroler ATmega32

Šematski dijagram za ATmega32 mikrokontroler (dodat sat realnog vremena na DS1307 čipu)

Kao što ste primijetili, najnovija verzija uređaja se napaja iz izvora od 12 V, a ploča ima dva regulatora napona 5,0 V (LM7805) i 3,3 V (LM1117-3,3). Za napajanje interfejsa SD kartice koristi se 3,3 V, ostatak kola se napaja iz izvora od 5,0 V. Čip sata realnog vremena DS1307 je u standardnoj konfiguraciji i povezan je na I2C interfejs mikrokontrolera.

Najprije je proučavan “sirov” format prijenosa podataka, na primjeru operacija čitanja bilo kojeg bloka podataka, čitanja i pisanja nekoliko blokova podataka, brisanja nekoliko blokova, upisa podataka u bilo koji SD memorijski blok. Uređaj, sastavljen na matičnoj ploči, bio je povezan sa računarom preko RS-232 interfejsa. Za prikaz pročitanih podataka sa memorijske kartice, kao i za unos i upisivanje podataka na karticu, koristite HyperTerminal (ili sličan) program na računaru.

Nakon uspješne implementacije razmjene podataka bez specifikacije, memorijska kartica je formatirana (FAT32) u operativnom sistemu Windows XP, zatim je na karticu upisano nekoliko tekstualnih datoteka, direktorija i drugih vrsta datoteka (u korijenski direktorij kartice). Nakon toga, napisane su rutine i funkcije za rad sa sistemom datoteka FAT32 za čitanje datoteka, za dobivanje liste datoteka na memorijskoj kartici (pomoću HiperTerminala), za dobivanje informacija o punoj i slobodnoj količini memorije.

Pogled na prozor programa HiperTerminal sa funkcijama za rad sa SD memorijskom karticom:

Korisniku se nudi preko 10 opcija za rad sa memorijskom karticom (za verziju sa satom).

Opcije 0 - 4 Ovo su funkcije niskog nivoa. Nakon korištenja opcija 0 - 3, morat ćete ponovo formatirati karticu prije korištenja FAT32 rutina.
Opcije 5 - 9- pogledajte FAT32 sistem datoteka. Trenutno su podržana samo kratka imena datoteka (8 bajta - naziv datoteke, 3 bajta - ekstenzija datoteke). Ako su datoteke sa dugim imenima napisane, one će biti prikazane u terminalskom programu u kratkom formatu. Da biste testirali ove opcije, ne zaboravite formatirati karticu u sistemu datoteka FAT32 i zapisati nekoliko direktorija i tekstualnih datoteka.

Opis opcija:

0 - Izbriši blokove- brisanje odabranog broja blokova počevši od navedenog.
1 - Upišite jedan blok- upisivanje podataka u blok sa određenom adresom. Podaci se unose sa tastature u program Hiperterminal;
2 - Čitanje jednog bloka- čitanje podataka iz bloka sa određenom adresom. Očitani podaci se prikazuju u prozoru terminalskog programa;
3 - Pisanje više blokova- snimanje nekoliko blokova počevši od određene adrese;
4 - Čitanje više blokova- čitanje nekoliko blokova počevši od određene adrese.

Bilješka. Ovdje su funkcije više blokova (opcije 3 i 4) onemogućene zbog ograničenja memorije na ATmega8 mikrokontroleru, jer ove karakteristike nisu potrebne za testiranje FAT32 sistema datoteka. Da biste omogućili ove opcije, morate ukloniti makro u datoteci SD_routines.h (#define FAT_TESTING_ONLY). I, ako koristite ATmega8, dok testirate opcije 3 i 4, FAT32 biblioteka se može izbrisati kako bi se oslobodila memorija mikrokontrolera.

5 - Preuzmite listu datoteka- prikazuje listu dostupnih direktorija i datoteka s količinom memorije koju zauzimaju (u korijenskom direktoriju kartice);
6 - Pročitajte datoteku- čitanje navedene datoteke i prikazivanje sadržaja u prozoru terminalskog programa;
7 - Kreirajte datoteku- kreiranje/dodavanje datoteke sa navedenim imenom;
8 - Izbriši datoteku- brisanje svih datoteka fajl sa navedenim imenom;
9 - Pročitajte kapacitet SD memorije- informacije o punom i slobodnom kapacitetu memorijske kartice (koristi se FSinfo sektor SD kartice).

U terminalskom programu, serijski port je konfigurisan na 19200 baudova, bez kontrole protoka i provjere pariteta.

Za verziju sa satom realnog vremena (DS1307) na ATmega32 mikrokontroleru, svojstva kreiranih ili ažuriranih datoteka su vezana za datum i vrijeme (datum kreiranja/promjene), ova svojstva se registruju u tabeli datoteka i mogu se provjeriti korištenjem računara, a sat može biti koristan prilikom prikupljanja podataka. Tri opcije su dodane u izbornik opcija u terminalskom programu.

Lekcija 33

Dio 1

SPI. Sd kartica. DEBEO

Danas ćemo nastaviti našu omiljenu temu o SPI interfejsu. Završili smo sa ovom magistralom koja povezuje Atmega8a i ATTtiny2313 kontrolere jedan s drugim. A danas ćemo pokušati da povežemo memorijsku karticu sa mikrokontrolerom preko ove magistrale koristeći ovaj interfejs SD (Secure Digital).

Ova kartica se može spojiti i preko SDIO sučelja, ali pošto takav interfejs nije hardverski podržan od strane našeg kontrolera, nećemo ga se doticati u ovoj lekciji. Zanima nas vrsta autobuske veze SPI, pošto već imamo dobro akumulirano znanje o ovoj temi, kao i hardversku podršku u kontroleru koji programiramo.

Ipak, pogledaćemo pinout nogu kartice za oba tipa

Pa, pošto nas zanima druga vrsta, bavićemo se njome.

I tu nema mnogo za razumjeti. Znamo sve ove skraćenice. Svi standardni pinovi SPI interfejsa su ovde i tu nema ničeg suvišnog.

Sada o mapi općenito. Ova kartica nam omogućava pohranjivanje podataka, njezin tip memorije je FLASH, koji je u poređenju sa EEPROM tipom memorije također nepostojan, odnosno kada se napajanje isključi podaci ne nestaju nigdje, već ostaju pohranjeni. Takođe, ova memorija ima razlike, upoznaćemo ih tokom procesa programiranja. Jedna od glavnih razlika je u tome što, baš kao u EEPROM memoriji, ne možemo upisati jedan bajt u ovu memoriju. Teoretski, naravno da možemo, ali će tu biti zapisane samo jedinice iz našeg bajta ili samo nule, u zavisnosti od tipa FLASH-a - NOR ili NAND. Odnosno, prije nego što napišemo bajt, moramo ga obrisati, a zbog organizacije ove memorije možemo brisati samo u blokovima, pa stoga možemo pisati samo u blokovima. Ali postoji najveća razlika u odnosu na EEPROM - ovo je cijena. To je višestruko jeftinije, ponekad čak i za redove veličine jeftinije za jednu pohranjenu jedinicu informacije (po megabajtu, po gigabajtu). Stoga FLASH memorija obično uvijek ima mnogo veću količinu informacija.

Postoje 4 vrste SD-a, ali to ćemo proučiti malo kasnije.

Povežimo ovu karticu dok smo u Proteusu

Ovdje je sve jednostavno. Zapravo ne baš tako. Treba još otpornika

Ovi otpornici su potrebni da bi se osigurali odgovarajući nivoi, budući da se kartica napaja od 3,3 volta. Općenito, prema tehničkoj dokumentaciji, od 2,7 do 3,6 volti.

Također, to nije naznačeno u proteusu, ali u stvari ćemo našu karticu napajati iz zasebnog napajanja ugradnjom mikrokola koji pretvara 5 volti u 3,3 volta.

Ili bolje rečeno, nećemo ništa instalirati, već ćemo koristiti gotov modul u kojem je sve već instalirano.

Takođe imamo povezan ekran, kao u proširenju funkcionalnosti biblioteke ekrana.

Ovako sve to izgleda u praktičnom smislu:

Ovako izgleda modul sa držačem

Takav modul možete pronaći svuda, košta peni. Modul koji se povezuje preko SDIO košta više. Također vidimo da modul već ima ugrađeno mikrokolo za smanjenje napona na 3,3 volta. I spajamo napajanje samo na kontakt od 5 volti, a ne spajamo ništa na 3.3

Također, svi razdjelnici nivoa su instalirani na modulu, odnosno ovaj modul je dizajniran posebno za povezivanje sa 5-voltnim uređajima.

I iskopao sam fleš karticu za testiranje sa 32 megabajta, tačno megabajt a ne gigabajt

Ova fleš kartica je poklonjena uz neki fotoaparat i najprikladnija je za naše testove, barem nećemo pomisliti da je ovaj ili onaj kvar nastao zbog previše memorije na kartici.

Cijeli kod je također preuzet iz prošle lekcije zajedno sa bibliotekom prikaza, budući da ćemo funkciju koju smo kreirali u prošloj lekciji koristiti vrlo aktivno, ali je, naravno, kreiran novi projekat i imenovan u skladu s tim MYSD_SPI.

Uklonimo nepotrebne linije, u main() ćemo imati samo ovo

intmain( void)

nepotpisaninti;

Port_ini();

LCD_ini(); //inicijaliziranje prikaza

Clearlcd(); //brisanje ekrana

Setpos(0,0);

Str_lcd( "String 1");

Setpos(2,1);

Str_lcd( "String 2");

Setpos(4,2);

Str_lcd( "String 3");

Setpos(6,3);

Str_lcd( "String 4");

Delay_ms(2000);

// za (i=0;i<=22;i++) {str80_lcd(buffer2+i*20);_delay_ms(1000);}

Dok(1)

Pošto tekst nećemo ispisivati ​​znak po znak, možemo koristiti tip char u varijabli

nepotpisanchar i;

Sada još jedna nijansa.

Da bismo mogli da radimo sa SD karticom u Proteusu, nije nam dovoljno da uz karticu dodamo i sam držač, već moramo da priložimo i datoteku slike fleš kartice u njena svojstva.

Nije ga teško stvoriti. Jedan od načina je kreiranje pomoću programa WinImage.

U njemu kreiramo novu datoteku koristeći stavku menija File -> New. Odaberite posljednju stavku u dijalogu i kliknite "OK"

Za test u Proteusu nam je dovoljna veličina od 4 megabajta, pa ćemo u sljedećem dijalogu promijeniti polje sa brojem sektora, te odabrati i format FAT12/16, jer su specifičnosti rada sa 32- bitni sistem datoteka se malo razlikuje, a mi ćemo kliknuti i na “OK”

Generalno, naravno, možemo napustiti FAT32, pošto još ne radimo sa sistemom datoteka, ali u daljnjim dijelovima lekcije ćemo raditi sa sistemom datoteka i radićemo sa 12/16.

Onda čuvamo naše cos ovaj fajl koristeći stavku menija File -> Save As. I mi ga spremamo u fasciklu u kojoj imamo sačuvani proteus projekat. Dajte ime fajlu i kliknite na "Sačuvaj"

Takođe, tada ćemo morati da se uverimo da ovaj fajl nije sa atributom „samo za čitanje“, a nakon toga ćemo moći da ga povežemo u Proteusu. Morat ćete ručno unijeti naziv datoteke, jer Proteus zahtijeva neku vrstu formata i naš fajl jednostavno neće biti vidljiv

Ne treba nam nikakva putanja, jer se datoteka nalazi u fascikli projekta. Kliknite na "OK".

Ne moramo inicijalizirati sabirnicu, budući da će naš SPI biti zasnovan na softveru; ne rade sve flash kartice ispravno s hardverom, tako da nećemo morati koristiti nikakve registre. Hardver je, naravno, bolji, ali da biste temeljno razumjeli kako protokol funkcionira, morate raditi i sa softverom, odnosno trzati nožice portova. Općenito, gledajući dijagram, može se činiti da imamo sve u hardveru, pošto sam odabrao upravo ove noge, to je zato što sam ga upravo tako odabrao, da bi kasnije, možda neko pokušao da radi sa gumama za implementaciju hardvera .

Dodajmo makro zamjene za noge porta

#include"main.h"

#defineMOSI3

#defineMISO4

#defineSCK5

#defineSS2

Dodajmo kod za inicijalizaciju nogu funkciji inicijalizacije porta

voidport_ini( void)

PORTD=0x00;

DDRD=0xFF;

PORTB|=(1<< SS)|(1<< MISO)|(1<< MOSI);

DDRB|=(1<< SS)|(1<< MOSI)|(1<< SCK);

MISO pin ostavljamo na ulazu, pošto su po defaultu svi bitovi u registru nula, i jednostavno ga ne dodirujemo. Također odmah uključujemo visoki nivo u MOSI i SS, i povlačimo otpornik na MISO.

Napišimo funkciju za prijenos bajta preko SPI magistrale

voidSPI_SendByte( nepotpisancharbajt)

{

}

Dodajmo varijablu za petlju i samu petlju

voidSPI_SendByte( nepotpisancharbajt)

nepotpisanchari;

za( i=0; i<8; i++) //pomicanje po bitovima bajta

{

}

Mislim da je jasno zašto brojimo do 8, pošto prenosimo tačno 8 bita.

Pa, hajde da ih prenosimo malo po malo.

Prvo provjerimo krajnji lijevi bit, izolirajući ga od cijelog bajta maskiranjem, i ako je jednak 1, onda ćemo ga postaviti na 1 na MOSI magistrali, a ako je 0, onda nećemo dirati sabirnicu

za( i=0; i<8; i++) //pomicanje po bitovima bajta