Rad sa SD karticom. Povezivanje sa mikrokontrolerom. Dio 1. Povezivanje SD kartice na mikrokontroler Povezivanje sd mmc kartica na mikrokontroler

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 će nam dobro doći eksternu memoriju. 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 sa eksterne kartice memorija. 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. Radit ću sa ponovo Mini board STM32, jer su dobri Kinezi bili zbunjeni instaliranjem utora za micro SD memorijsku karticu na njega. Evo dijagrama povezivanja konektora kartice na mikrokontroler:

Za pisanje programa ćemo koristiti gotov primjer za Keil - uzmimo dva fajla odatle, u kojima je implementirano nešto poput drajvera za rad sa karticama - ovo su fajlovi 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!

  • Andreas kaže:

    Sastavljanje Memory Stick adaptera vlastitim rukama nije teško ako znate svrhu funkcionalnih pinova određene memorijske kartice. Obično se naziva pinout memorijske kartice ili, na primjer, mikro kruga, čipa itd. Općenito, tehnologija je jednostavna. Izgled MMC (MultiMedia Card) memorijske kartice je izrezan iz PCB-a. Na matičnoj ploči je izrezano 7 staza (MMC ima 7 pinova). Zatim, u skladu sa pinoutom prikazanim na donjoj slici, staze se zalemljuju na pinove SD memorijske kartice (ima 9 pinova, od kojih se 2 ne koriste), microSD (ima 8 pinova, od kojih 2 također nisu koristi se, ali imajte na umu da microSD memorija kartice nema Vcc izlaz) ili microM2 (microM2 pinout u povezanoj temi Memory Stick Micro M2 adapter). To je sve. Memory Stick adapter je spreman.

    P.S. Na zalihama imamo MMC memorijske kartice od 1 i 2 GB. Trošak je 285 i 360 rubalja. Dostava je uključena u navedenu cijenu.

    Također možete jeftino kupiti sljedeće veličine memorijskih kartica:
    - Memory Stick i Memory Stick M2;
    - Secure Digital (SD);
    - Mini SD;
    - Micro SD (TF);
    - Compact Flash;
    -XD;
    - USB fleš diskovi različitih dizajna i kapaciteta.
    Na primjer, ove:

  • slava kaže:

    Inače, nisam baš jasan u ovim spisima. Ne možete dobiti numere sa MicroCD-a na MMC na toj stranici, bit ću vam jako zahvalan.

  • Andreas kaže:

    Ovako će izgledati microSD na MMC adapter:

  • slava kaže:
  • Kao što se vidi sa slike, nakon prenošenja komandnog okvira potrebno je nastaviti čitanje bajtova (Ncr) sa microSD kartice do prijema odgovora (R1), pri čemu CS nivo mora biti aktivan "0".

    Ovisno o indeksu komande, odgovor može biti ne samo R1(vidi skup osnovnih komandi) na CMD58 odgovor R3(R1 i završna 32-bitna OCR vrijednost), a neke naredbe zahtijevaju više NCR vremena i reagovaće R1b. Ovo je odgovor R1, praćen oznakom zauzetosti (signal na liniji "DO" se drži niskim od strane kartice dok se interni proces nastavlja). Domaćin kontroler mora čekati da se proces završi dok "DO" ne postane visoko (tj. čekati 0xFF). I također R2 kada se traži status registra STATUS.

    Odgovor R1 sadrži 1 bajt, njegova struktura se može vidjeti u donjoj tabeli. Odgovor R2 se sastoji od dva bajta, prvi bajt je R1, a drugi R2 (pogledajte tabelu strukture R2). A odgovor R3 je 5 bajtova.


    Odgovor R1 sa vrijednošću 0x00 znači da je naredba uspješno završena, inače će se postaviti odgovarajuća zastavica.

    Struktura odgovora R1.


    R2 struktura odgovora.


    Inicijalizacija u SPI modu.

    Nakon resetiranja i napajanja, kartica je po defaultu postavljena na radni način koristeći MMC (Serial Peripheral Interface) protokol; da biste se prebacili na SPI način rada, morate učiniti sljedeće:

    1. Nakon dostizanja 2,2 V, pričekajte najmanje milisekundu, postavite DI i CS linije visoko i izdajte oko 80 impulsa na CLK pin. Nakon ove procedure, kartica će biti spremna za prihvatanje domaćeg tima.
    2. Pošaljite naredbu CMD0 (soft reset). Kartica mora odgovoriti (R1) sa postavljenim bitom čekanja (0x01).
    3. Pošaljite naredbu CMD1 (za početak inicijalizacije kartice). Sačekajte odgovor 0x00 da potvrdite završetak procesa inicijalizacija.

    Dozvolite mi da vas podsjetim da naredba CMD0 mora sadržavati ispravno CRC polje. Nema smisla računati, jer u ovoj naredbi nema argumenata, pa je konstantna i ima vrijednost 0x95. Kada kartica uđe u SPI mod, CRC funkcija će biti onemogućena i neće biti provjerena. CRC opcija se može ponovo omogućiti sa CMD59.

    Kao rezultat, naredba CMD0 će izgledati ovako: 0x40.0x00.0x00.0x00.0x00.0x95.

    • timski indeks - 0x40.
    • argument - 0x00.0x00.0x00.0x00.
    • CRC-0x95.

    Što se tiče 80 impulsa, oni se mogu generirati prenošenjem vrijednosti 0xFF preko SPI10 puta za redomna visokim nivoima postavljenim na linije DI i CS.

    Nakon što je neaktivna duže od 5 ms, memorijska kartica prelazi u režim štednje energije i može prihvatiti samo CMD0, CMD1 i CMD58 komande. Stoga se proces inicijalizacije (CMD1) mora ponoviti gotovo svaki put kada čitate/upisujete blok podataka ili provjeravate status kartice.

    Za SDC kartice ako je komanda odbijenaCMD1 se preporučuje da koristi naredbu ACMD41.

    Sam proces inicijalizacije može potrajati relativno dugo (ovisno o veličini kartice) i može doseći stotine milisekundi.

    Čitanje i pisanje bloka podataka.

    Podrazumevano, u SPI modu, razmena između mikrokontrolera i kartice se odvija u blokovima od 512 bajtova, tako da da biste upisali čak i jedan bajt morate prvo da pročitate ceo blok i, promenom bajta, ponovo ga prepišete. Veličina bloka se može promijeniti u CSD registru memorijske kartice.

    Da bi se izbjegle greške u adresiranju pri izvršavanju naredbi za čitanje/pisanje, potrebno je da adresa bude jasno naznačena na početku sektora. Da biste to uradili, možete resetovati bit "0" 3 bajta adrese sektora, tj. ujednačiti, a manji uvijek treba imati vrijednost 0x00.

    Čitanje bloka podataka.

    Algoritam za čitanje bloka podataka je sljedeći:

    • Nakon potvrde inicijalizacije, prenosimo naredbu CMD17 (odgovor R1), sa adresom traženog sektora.
    • Prenosimo 0xFF prije nego što primimo početni bajt 0xFE.
    • Prihvatamo blok podataka (512 bajtova po defaultu) i 2 bajta CRC-a.

    CRC vrijednost nije potrebna, ali je neophodna procedura prihvatanja (prijenos 0xFF iz MK-a).

    Blok za čitanje.


    Napišite blok podataka.

    Algoritam za pisanje bloka podataka je sljedeći:

    • Ako je kartica bila neaktivna duže od 5 ms, pošaljite CMD1 komandu (odgovor R1).
    • Nakon potvrde inicijalizacije, prenosimo naredbu CMD24 (odgovor R1), sa adresom traženog sektora.
    • Prenosimo početni bajt 0xFE.
    • Prenosimo blok podataka (podrazumevano 512 bajtova) i 2 bajta CRC-a.
    • Primamo bajt potvrde pisanja.
    • Čekamo kraj snimanja (promjena bajta 0x00).

    Blok podataka može biti manji od 512 bajtova kada se mijenja dužina bloka pomoću naredbe CMD16.

    CRC vrijednost nije potrebna, ali je neophodna procedura za prosljeđivanje bilo koje vrijednosti.

    Ne možete programski izvršiti procjenu vremena zastoja, već odmah izdati naredbu za inicijalizaciju. Tokom implementacije softvera naišao sam na netačan zapis, iz nekog razloga su svi bajtovi upisani u lijevo pomjeren sektor. Problem je rešen samo prenošenjem startnog bita (0xFE) dva puta.

    Blokiraj snimanje.


    Bajt potvrde prilikom pisanja bloka podataka.


    Upišite/čitajte nekoliko blokova za redom.

    Korišćenje komandi CMD18, CMD25 možete čitati/pisati nekoliko blokova za redom ili takozvano višeblokovno čitanje/pisanje. Ako broj blokova nije naveden, proces čitanja/pisanja se može zaustaviti korištenjem CMD12 naredbi tokom čitanja, kao i prosljeđivanjem " Stop Tran" kada snimate u skladu s tim.

    Praktična upotreba.

    Praktična upotreba memorijskih kartica je prilično široka. U svom najnovijem dizajnu, koristio je microSD za snimanje očitavanja različitih senzora (temperatura, alarm) tokom dana svakih sat vremena. Podaci se pohranjuju na sljedeći način:

    • Godina se uzima iz posljednje dvije cifre - ovo odgovara prvom (glavnom) bajtu adrese sektora memorijske kartice.
    • Mjesec, dvije cifre - ovo odgovara drugom, najznačajnijem bajtu adrese sektora memorijske kartice.
    • Dan, dvije cifre se množe sa 2 (kako bi se izbjeglo udaranje izvan granice sektora) - ovo je treći, srednji bajt adrese sektora memorijske kartice.
    • Četvrti bajt nižeg reda je uvijek "0".

    Kao rezultat toga, pretraživanje podataka po datumu je pojednostavljeno; samo trebate prevesti zahtjev na adresu sektora i pročitati s kartice. Ovom metodom podaci se mogu čuvati nekoliko godina. Istina, postoje i nedostaci, ostalo je puno neiskorištenog prostora. Iako ga, po želji, možete koristiti i za druge zadatke.

    Kome treba, poslaću vam fragment koda u asembleru za 18 vrhova.

    Pitanja se mogu postavljati na..

    Otkad znam za sebe, oduvijek sam volio čitati, ali ovo je 21. vijek i ponekad se potrebna literatura može pronaći samo na internetu. Da, i možete čitati e-knjige na elektronskom uređaju kao što je tablet, računar ili e-čitač. Rezultat je mali uređaj koji može čitati tekstualne datoteke sa SD ili microSD kartice i prikazati njihov sadržaj na ekranu.

    Mozak uređaja je Atmega32 mikrokontroler koji radi na frekvenciji od 8 MHz. MK ima takt od eksternog kvarca na 8 MHz; koristio sam mali WH1604A LCD indikator na HD44780 kontroleru sa rezolucijom od 4 reda po 16 karaktera kao ekran uređaja. Koristio sam obične tipke sata; što se tiče SD kartice, da bih je spojio na mikrokontroler, koristio sam otporničke razdjelnike kako bi se uskladili logički nivoi.

    Šematski dijagram uređaja:

    Pinout na dijagramu je ispravan samo za SD karticu ili SD adapter; za povezivanje drugih kartica koristite njihov pinout!

    Uređaj podržava SD, miniSD i microSD memorijske kartice do 4GB formatirane u FAT, FAT16 fajl sistemu. Treba imati na umu da uređaj ne podržava direktorije, tako da sve datoteke moraju biti zapisane samo u korijenu flash diska. Tekstualne datoteke moraju biti u običnom txt formatu i bez formatiranja, nazivi datoteka ne smiju biti duži od 8 znakova (ne računajući ekstenziju).

    Kada uključite uređaj, na ekranu će se pojaviti početni ekran:

    Ako SD kartica nije instalirana u uređaju, nije ispravno povezana ili nešto drugo, pojavit će se sljedeća poruka:

    Ako je sve u redu, pojavit će se glavni meni:

    Pomoću dugmadi možete ući u stavku „Pregledaj datoteke“ gdje možete odabrati datoteku koju trebate pročitati.

    U stavci "Postavke" možete odabrati ekstenziju za prikaz datoteka u "Pregledniku datoteka".

    I u zadnjem pasusu “O sistemu...” možete pročitati informacije o uređaju, njegovom autoru itd.

    Firmver za uređaj sam napisao u BASCOM-AVR okruženju koristeći AVRDOS biblioteku, firmver zauzima samo 30% programske memorije mikrokontrolera, tako da ima prostora za kreativnost. Unutra je uređaj sastavljen na dvije štampane ploče: na jednoj se nalazi MK sa body kitom, na drugoj se nalazi konektor za SD karticu i odgovarajući lanci logičkih nivoa.

    Evo fotografije uređaja iznutra:

    Za napajanje koristio sam Ni-Cd bateriju od 4,8V, 600mAh. Nakon flešovanja mikrokontrolera, potrebno je postaviti sljedeće bitove osigurača:

    Spisak radioelemenata

    Oznaka Tip Denominacija Količina BilješkaProdavnicaMoja beležnica
    U1 MK AVR 8-bit

    ATmega32

    1 U notes
    D1, D2 Ispravljačka dioda

    1N4001

    2 U notes
    C1, C2 Kondenzator22 pF2 U notes
    C3 Elektrolitički kondenzator100 µF1 U notes
    C4 Kondenzator100 nF1 U notes
    R1 Otpornik

    10 kOhm

    1 U notes
    R2-R4 Otpornik

    4,7 kOhm

    3 U notes
    R5-R7 Otpornik

    1 kOhm

    3 U notes
    LCD1 LCD ekranLM014L1 U notes
    X1 Kvarc8 MHz1 U notes
    Dugme 4 U notes
    Prekidač 1

    Ažurirano 18.12.15. Zdravo svima. Danas ćemo nastaviti razvoj kontrolera prikupljanja podataka, odnosno pohranjivanje informacija direktno na sd kartica . U prošlom članku je utvrđen rad termometra. Sada ove informacije na vrijeme pri povezivanju V dalji sat u realnom vremenu (član br. 29), stavićemo ga na memorijsku karticu, dobivši neku vrstu baze podataka. Takođe ćemo u budućnosti ove informacije prenositi na PC (članak br. 42), u bazu podataka koja pokreće MySQL (članak br. 48), preko male aplikacije u Javi (članak br. 44). Ali prvo, hajde da shvatimo šta je SD kartica i kako sa njom raditi.Počnimo sa kratkom istorijom. Prethodnica Flash memorije je jedna od nepostojanih vrsta memorije, tipa, koji se dokazao i koristi u mikrokontrolerima. Flash memorija je nastala iz potrebe za povećanjem kapaciteta i promjena u tehnologiji brisanja (u slučaju EPROM memorije). Stoga je 1984. Toshibin inženjer Fujio Masuokoi promijenio tehnologiju brisanja, što je zauzvrat riješilo nedostatke prethodnika Flash memorije. Želio bih dodati da se dalje ova memorija počela dijeliti prema internom uređaju za povezivanje ćelija u niz i algoritme čitanja i pisanja - ovo je NOR i NAND tehnologija. I također razlika u broju pohranjenih bitova u elementarnoj ćeliji. To su SLC uređaji (single-levelcell), tj. jednobitne ćelije razlikuju samo dva nivoa naelektrisanja na plutajućoj kapiji. I MLC uređaji (multi-levelcell) - multi-bitne ćelije razlikuju više nivoa napunjenosti. Drugi tip uređaja je jeftiniji i kapacitetniji od SLC uređaja, ali sa dužim vremenom pristupa i manjim maksimalnim brojem prepisivanja (oko 10 hiljada i 100 hiljada za SLC).

    Općenito, uređaji tehnologije NOR su dvodimenzionalna matrica provodnika, koja omogućava brži pristup svakoj memorijskoj ćeliji, ali se površina ćelije smatra velikom, pa se ova tehnologija koristi za mikroprocesorska programska memorija i za pohranjivanje malih pomoćnih podataka, a specijalizirana oni takođe mogu biti uključeni ovde. Čipovi za pokretanje računara
    (POST i BIOS), DSP procesori i programabilna logika Tipični volumeni - od 1 KB do 1 MB.
    Drugi tip uređaja je NAND tehnologija - trodimenzionalni niz ima malu površinu ćelije, ali relativno dug pristup velikoj grupi ćelija odjednom. Koristi se za velike količine memorije.Ovo je memorija s kojom ćemo raditi.
    Ali prije toga bih želio govoriti o nedostatku. Baš kao što sve ima svoj rok trajanja, memorija takođe ima resurse habanja. Proizvođačima, u trci za kapacitetima i liderstvom na tržištu, uvijek nedostaje pokazatelj kao što je kvalitet, jer... nije kompatibilan s visokom cijenom. Dakle, vraćajući se na habanje, želio bih napomenuti da je vijek skladištenja informacija pri korištenju MLC uređaja otprilike 5 godina, što je povezano s akumulacijom nepovratnih promjena kada se napunjenost promijeni. Ako uzmemo NAND memoriju od SLC uređaja, onda su oni kvalitetniji i samim tim skuplji. Vrijedi napomenuti da vijek skladištenja informacija u velikoj mjeri ovisi o temperaturi, gama zračenju i česticama visoke energije.
    Gore je rečeno da je nedostatak kartice ograničen broj ciklusa ponovnog pisanja. Kada koristimo sistem datoteka za upravljanje datotekama, moramo znati da takvi sistemi pišu podatke na jedno mjesto, prirodno trošeći resurse dodijeljene oblasti, na kraju ih čineći neupotrebljivim i shodno tome smanjujući kapacitet. Ova vrsta memorije koristi NAND kontroler, koji bi trebao ravnomjerno raspodijeliti trošenje. Međutim, radi smanjenja troškova uređaja, kontroler se ne smije koristiti, a njegov rad će obavljati softverski NAND drajver u operativnom sistemu. Nakon ovog otkrića, mnoge kompanije su počele razvijati vlastite standarde za prijenosne kartice.

    Dalje, idemo na gledanje karte.
    Secure Digital Memory Card (SD) je format memorijske kartice dizajniran za korištenje prvenstveno u prijenosnim uređajima. Da bismo razumjeli njegov rad, koristit ćemo specifikaciju koja opisuje ovaj standard i zove se SD specifikacije ver3.01.
    Prvo što trebamo je da shvatimo kako raditi sa ovom karticom, kako je povezati itd. Prvo, izaberimo karticu. Za eksperimente sam uzeo 2GB microSD, standard SDSC kapaciteta. Sabirnica kartica može raditi koristeći dva protokola: SD i SPI. Napominjem da je ova kartica svojevrsna modifikacija MMC kartice, gdje je (kod SD kartice) glavna pažnja posvećena sigurnosnom sistemu. Stoga je algoritam rada za SPI protokol isti, a naravno i jednosmjerno kompatibilni. Odnosno, možemo umetnuti MMC u slot za SD karticu, ali ne i obrnuto.

    Slika ispod prikazuje dijagram povezivanja SD kartice SPI protokol .
    Ovaj interfejs vam omogućava razmenu podataka velikom brzinom, koristeći minimalan broj pinova mikrokontrolera, koji su opremljeni SPI modulom. Od sada ćemo početi koristiti specifikaciju. Prva stvar koja nas zanima je izbor moda. Pogledajmo suptilnosti na Sl. Ispod odeljka 6.4.1.1 je dijagram napona napajanja i redosled slanja komande. Ovdje se jasno vidi da nakon uključivanja kartice treba pričekati nekoliko milisekundi (1ms + od 0,1 do 35 ms (rastući)) za stabilizaciju. Za to vrijeme, na CS, MOSI liniju se mora primijeniti 1. Zatim se javlja kašnjenje inicijalizacije od maksimalno 1 ms kada se 74 impulsa (ciklusa) primjenjuju na CLK ulaz, nakon čega mora uslijediti naredba CMD0. Pređimo na Poglavlje 7 gdje je jasno opisan redoslijed radnji.

    Dijagram napona napajanja

    SPI protokol se bira nakon uključivanja napajanja i izdavanja naredbe za resetovanje CMD0. Sama SD kartica radi u SD modu. U mod se ulazi ako je SC signal 0 kada se izda naredba CMD0. Prilikom prebacivanja u SPI mod, kartica će odgovoriti u R1 formatu (slika ispod). Format odgovora je bajt (u zavisnosti od naredbe, pogledajte tabelu 7.3 u specifikaciji) sa zastavicama koje određuju stanje kartice. Tačni odgovori za nas će biti 1 (u slučaju naredbe CMD0) i 0 u svim ostalim slučajevima.
    1. bit – standby mod
    2. – brisanje greške
    3. – nepoznata ekipa
    4. – timska greška
    5. – greška u nizu brisanja
    6. – greška u adresi
    7. – greška u argumentu

    Tokom procesa resetovanja, kartica treba da odgovori sa 0x01, što odgovara prvom bitu.

    U specifikaciji postoji jasan redoslijed inicijalizacija za SPI. Zašto se naredba CMD8 koristi za provjeru radnog stanja kartice, gdje se odvija prilično komplikovan algoritam verifikacije. Sljedeća je naredba CMD58 za određivanje tipa kartice SDSD ili SDHC i SDXC. I također CMD41 naredba za pokretanje i provjeru inicijalizacije. To je prilično komplikovan proces inicijalizacije sa provjerama, ali mislim da se za jednostavno snimanje podataka može koristiti pojednostavljeni proces. U odjeljku 7.2.7. Rečeno je da su u standby modu jedine važeće komande za karticu CMD41, CMD8, CMD58, CMD59, kao i za SD memorijske kartice (debljine 2,1 mm) CMD1, što je identično komandi CMD41. U standardu se ova naredba smatra zabranjenom za inicijalizaciju i koristi se isključivo za razlikovanje između kartica od 1,4 mm i 2,1 mm.
    Uzmimo jednostavniju rutu i koristimo naredbu CMD1. Sve što je gore opisano prikazat ćemo u kodu u funkciji inicijalizacije, ali prije toga ćemo razmotriti format naredbe. Svaka instrukcija ili blok podataka sastoji se od osam bitova, koji su usklađeni sa CLK signalom. One. svaka instrukcija je poravnata na granici od 8 ciklusa takta. SPI poruke se sastoje od komande, odgovora i podataka. Sva komunikacija je kontrolisana mikrokontrolerom. Sve naredbe su dugačke 6 bajtova. Prijenos počinje s prvim lijevim bitom.

    Slika ispod prikazuje format komande.


    Početni bit – Bilo koja komanda počinje od 0.Preneseni bit je također uvijek jednak 1.
    Indeks – direktno prenesena komanda.
    Argument- Za svaku naredbu, argument je naveden u tabeli specifikacija.
    CRC provjera redundancije koda. Podrazumevano je onemogućen u SPI modu. Stoga ga koristimo samo za naredbu CMD0, koja se šalje prije ulaska u mod i ima CRC vrijednost 0x95.
    Stop bit - kraj prenesene komande.
    Pa počnimo pisati kod.
    Počnimo s 2 potrebne funkcije: prijenos i prijem bajtova.
    1. Prenesite bajt na karticu.
    void trans_byte_sd (nepotpisani char podaci) // proslijediti niz bitova
    {
    za (neoznačeni znak i=0;i<8;i++) //Iteracija kroz bajt
    {
    ako ((podaci&0×80)==0×00)//Ako je najvažniji bit = 0
    PORTB&=~_BV (PB3);//Postavi MOSI (DI) -0
    ostalo
    PORTB|=_BV (PB3);//1
    podaci=podaci<<1; // сдвиг влево
    PORTB|=_BV (PB5); //Puls ili strob
    asm("nop"); //Pauza od 1 otkucaja
    PORTB&=~_BV (PB5);
    }
    }
    2. Prijem bajta od strane mikrokontrolera.
    nepotpisani char receive_byte_sd (void) // Vraća odgovor
    {
    unsigned char podaci = 0; // inicijalizirati niz
    za (neoznačeni znak i=0; i<8; i++)
    {
    PORTB|=_BV (PB5); //Pulsni rub
    podaci=podaci<<1; // Pomak lijevo
    ako ((PINB&_BV (PB4))!=0×00) // Ako je pin stanje 1
    data=podaci|0×01;
    PORTB&=~_BV (PB5); //0
    asm("nop");
    }
    povratne podatke; // Vraća odgovor
    }

    Od gore opisanih osnovnih funkcija, počet ćemo pisati daljnji kod. Zatim ćemo napisati funkciju prijenosa naredbi. Ovdje bih vam skrenuo pažnju na činjenicu da možete proslijediti svih 5 argumenata: direktno samu naredbu i 4 argumenta odgovorna za adresu memorijskih ćelija same kartice. Što se tiče 6. bajta, onda CRC pri ulasku u SPI mod je onemogućen (podrazumevano) i vrijednost je trajno postavljena na 0x95, što se koristi samo za CMD0 kada kartica nije u modu. Možete omogućiti provjeru koda pomoću naredbe CMD58. Za eksperimentisanje iznosim dva argumenta.

    3.Transfer komande.
    unsigned char comand_sd (char CMD, char arg) /*proslijedite naredbu i adresu kojoj pristupamo i vratite odgovor*/
    {
    long int i=0; // varijabla za brojač
    unsigned char r1; // odgovor kartice
    trans_byte_sd(CMD); // tim
    trans_byte_sd(0×00);
    trans_byte_sd(0×00);
    trans_byte_sd(arg); // prijenos adrese
    trans_byte_sd(0×00);
    trans_byte_sd(0×95); // Prijenos CRC
    /* Nakon slanja naredbe čekamo odgovor u R1 formatu.Svaka komanda ima svoj odgovor */
    /* Petlja za čekanje odgovora unutar određenog vremena */
    uradi
    {
    r1=receive_byte_sd();
    i++;
    )dok (((r1&0×80)!=0×00)&&(i<0xffff)); /* Sve dok najznačajniji bit bajta nije 0 i i ne prelazi 65,535 taktova */
    return r1; // Vraća odgovor
    }
    4. I inicijalizacija kartice.

    Sada možemo inicijalizirati mapu. Program je ukratko opisan na sljedeći način: prvo što trebate učiniti je prebaciti karticu u SPI mod. Kada se uključi napajanje, kartica je postavljena na SD način rada. Za odabir SPI moda, logička 0 se primjenjuje na CS ulaz, au isto vrijeme se na ulaz MOSI kartice šalje komanda za resetovanje CMD0 i inicijalizaciju CMD1. Imajte na umu da naredba počinje heksadecimalnim 0x40, kojem morate dodati broj CMD komande u heksadecimalu.

    unsigned char spi_card_init (void)// funkcija vraća odgovor
    {
    unsigned char r1; // varijabla za primanje odgovora
    long int i =0; // varijabla za brojač
    _delay_ms(10); // malo kašnjenje za stabilizaciju napona.
    PORTB|=_BV (PB1); //CS, postavljeno na 1, prilikom slanja ciklusa takta
    PORTB|=_BV (PB3); //komandna linija - 1 MOSI (DI)
    za (neoznačeni znak i=0; i<80;i++) // poslati više od 74 impulsa
    {
    PORTB|=_BV (PB5); //CLK - 1
    asm("nop"); //odgodi jedan sat
    PORTB&=~_BV (PB5); //CLK - 0
    }
    PORTB&=~_BV (PB1); /* uslov za ulazak u SPI mod CS liniju treba biti jednako 0 */
    r1=command_sd (0×40.0×00); // CMD0=0×40, adresa nije bitna
    ako (r1!=0×01) vrati 4;//možete postaviti bilo koje kodove grešaka
    trans_byte_sd(0xff); /* poslati stroboskop, neku vrstu pauze prije primanja odgovora */
    uradi // ciklus primanja odgovora sa kartice
    {
    r1=command_sd (0×41.0×00); /* poslati naredbu za inicijalizaciju */
    trans_byte_sd(0xff); // pauza
    i++; // counter
    )dok ((r1!= 0)&&(i<65535)); /*dok se ne primi odgovor 0 i broj ciklusa ne pređe 0xffff */
    if (i>=0xffff) vrati 5; /* vraća grešku ako je vrijeme glasanja premašilo */
    return 0; //Vrati 0 ako je inicijalizacija uspješna
    }

    Sljedeća važna stvar je da se u specifikaciji navodi da se informacije prenose u blokovima od 512 bita, a ako je SDSC kartica kao u našem slučaju, onda se dužina bloka može podesiti od 1 do 512 bita pomoću naredbe CMD16. Zadana vrijednost je 512 bita. Zatim opisujemo dvije funkcije za prijem i prijenos blokova. Specifikacija sadrži blok dijagrame na osnovu kojih ćemo napisati kod.

    Prijenos bloka informacija na karticu.

    Naredba CMD24 je odgovorna za prijenos ONLY bloka. Nakon izdavanja naredbe čekamo odgovor, zatim slijedi početni bajt, koji priprema kontroler kartice za prijem informacija, na kraju kartica odgovara bajtom o statusu prijenosa, što je opisano u poglavlju 7.3. 3.1. One. tačan odgovor bi trebao biti = 5. Također čekamo da se autobus oslobodi za daljnji prijenos.

    Prenesite bajt povratne informacije o statusu.

    Odjeljak 7.3.3.2 opisuje format poslanog bloka
    nepotpisani char receive_block_sd (char* blok, char arg)/* prosljeđujemo niz za snimanje podataka i adresu kojoj pristupamo */
    {
    long int i = 0;
    unsigned char r1;
    r1=command_sd(0X51,arg);//CMD17
    ako (r1!=0×00) vrati 5;//Izlaz ako odgovor nije 0×00
    trans_byte_sd(0xff);
    uradi //Pričekajte da se paket podataka pokrene
    {
    r1=receive_byte_sd();
    i++;
    )dok ((r1!= 0xfe)&&(i<65535));
    if (i>=0xffff) vrati 5;
    za (int i=0;i<512;i=i+1) //primi podatke
    block[i] = receive_byte_sd();
    receive_byte_sd(); //CRC bajt
    receive_byte_sd(); //CRC bajt
    return 0;
    }

    Prije korištenja programa, pogledajmo hardver. Kao što smo već rekli, kartica je kompatibilna sa mikrokontrolerom u SPI modu. Zapazimo sljedeće nijanse rada s mapom:
    1. Uparivanje logičkih nivoa je neophodno za različite napone napajanja SD kartice i AVR mikrokontrolera. Možete koristiti otporni djelitelj napona koji je linearan, tj. Izlazni napon zavisi od ulaznog napona. Ili možete imati paralelni parametarski stabilizator napona na zener diodi, isto kao i prva opcija, samo u donjem kraku se koristi zener dioda, koja je nelinearni djelitelj i prati referentni napon zbog svojih svojstava, kada je ulaz napon raste, smanjuje se unutrašnji otpor, i obrnuto.
    Koristio sam drugu opciju. U kolu ispod, na signalnoj liniji otpori su balastni (strujni limiteri), napon od 4,5 - 5 V se dovodi na ulaz razdjelnika, a izlaz se uklanja sa donjeg kraka razdjelnika.Strujni limiteri su neophodni za zaštitu kartice i drugih perifernih uređaja u slučaju kvarova mikrokontrolera. Uz uređaj koji dobro radi, oni nisu potrebni.

    Imajte na umu da MISO liniju ne treba pregovarati jer Radi samo u jednom smjeru od kartice do mikrokontrolera.
    2. Druga stvar, ne koristim provjere dostupnosti kartice i zaštite od pisanja. Neki ljudi imaju ove kontakte u slotovima, neki ne.
    3. Poslednja tačka je hrana. Ili napajate 3,3 volta cijelo kolo, uključujući i mikrokontroler, ili stavljate razdjelnik na ulaz kola, što nije baš pouzdano. Ili stabilizator od 3,3 volta, kao što sam uradio na čipu LP2980 . Važna tačka je elektrolitički (tantalski) kondenzator, koji štiti mikrokontroler od resetovanja tokom pada napona.
    Ispod je program i rezultat.Kao i uvek, trudim se da koristim jedan program i da ga stalno menjam. Ova šifra je preuzeta iz artikla br. 5 (indikator sa sedam segmenata).

    #include
    #include
    #include
    #include
    //makroi za rad sa indikatorom
    #definiraj 128
    #defini b 32
    #defini od 8
    #defini d 2
    #define e 1
    #define f 64
    #defini g 16
    #define dp 4

    // Varijable

    char blok =();//bafer za pisanje/čitanje podataka na karticu
    kratki unsigned int j, k = 0; //u makrou prekida
    unsigned char slot; // Niz brojeva za prikaz na indikatoru

    //Deklariraj funkcije

    void trans_byte_sd (nepotpisani char podaci);// funkcija prijenosa bajtova
    nepotpisani char receive_byte_sd (void); //Funkcija primanja bajtova
    unsigned char comand_sd (char,char); // funkcija prijenosa naredbi
    unsigned char spi_card_init (void); //Funkcija inicijalizacije memorijske kartice
    unsigned char receive_block_sd (char* blok, char arg); //Blokiraj funkciju primanja
    unsigned char trans_block_sd (char* blok, char arg); //Funkcija prijenosa bloka
    // Inicijalizacija indikatora
    void Slot_init()
    {…………………….};
    // Varijable za prikaz brojeva
    char Elem1, Elem2, Elem3;
    // Izlaz u indikator
    void Display (float i)
    { …………………………... }
    int main (void) //počinjemo osnovu programa
    {
    DDRB = 0x2A; //0010 1010 – PB1, PB3, PB5
    DDRD = 0xff; //svi pinovi porta su izlazi
    PORTD = 0×00; //postaviti na 0
    PORTB |= 0hdb; //1101 1011 (PB0,1,3,4,6,7)
    slot_init();
    sei(); // ili SREG |= (1<< 7); разрешить общее прерывание
    //inicijaliziranje tajmera T0
    TIMSK = (1</*Omogući zastavicu za prekoračenje T0 brojača*/
    TCCR0 = (0< //1000000/8 = 125000
    unsigned char temp;
    int i;
    za (i=0;i<512;i=i+1)
    blok[i]= i; //pisanje u bafer
    spi_card_init(); //inicijalizacija
    trans_block_sd(block,0×04); //slanje podataka na karticu
    //Resetujte bafer na nulu
    za (int i=0;i<512;i=i+1)
    blok[i]=0;
    // Čitanje podataka sa kartice
    receive_block_sd(block, 0×04); ;//Funkcija primanja bajtova
    za (int i=0;i<512;i=i+1)
    {
    char otv;
    otv = blok[i];
    Displej(otv);
    _delay_ms(100);
    }
    //Upis na memorijsku adresu 0
    za (int i=0;i<512;i=i+1)
    blok[i]=0;
    unsigned char comand_sd (char,0×00); //funkcija prijenosa naredbi
    trans_block_sd(block,0×04); //slanje podataka na karticu
    }
    //Izlaz u indikator
    ISR (TIMER0_OVF_vect)
    { ……………. }

    Važna tačka su tajm-auti. Važno je pratiti vrijeme potrebno za čitanje zapisa i brisanje kartice, jer se mikrokontroler može zamrznuti dok čeka odgovor sa kartice. Specifikacija jasno opisuje vremenska ograničenja kartice. Kartica miruje 5 ms, nakon čega prelazi u režim štednje energije, u kojem vrijede sljedeće komande: CMD0, CMD1, CMD41 i CMD58. Stoga, kada je granica mirovanja prekoračena, prenosimo CMD1, odgovor i nastavljamo rad s karticom.
    Ispod su dva snimka ekrana iz programa WinHex, pomoću kojih možemo vidjeti sadržaj memorijskih ćelija. Program radi na sljedeći način: upisujemo podatke u bafer, šaljemo ih na karticu, resetujemo bafer, čitamo podatke sa kartice u bafer i prikazujemo ih na displeju, čime se uvjeravamo da se podaci prenose na karticu . Pogledamo sadržaj kartice, resetujemo bafer, upišemo 0 na karticu i ponovo otvorimo sadržaj kartice, čime se uvjerimo da program i sklop rade. Kao i uvijek, ne zaboravite na sitnice, kao što je nedovoljno lemljenje, nedostatak velikih pukotina na šinama, itd., koje mogu oduzeti lavovski dio vremena. Stoga, ako imate pri ruci osciloskop, obavezno ga koristite za podešavanje. INČlan 24Dao sam mali primjer dijagnosticiranja kartice u svim fazama njenog rada.srešćemo sesenzor vlage i temperatureDHT11. Nakon toga krećemo sa snimanjem podataka (temperatura i vlažnost) u tekstualni fajl, neku vrstu baze podataka. To je sve za sada. Ćao svima.