Pinout karty Secure Digital (SD). Pripojenie karty SD k mikrokontroléru Správa karty SD

Karty SD sú založené na staršom formáte Multi Media Card (MMC), ale väčšina je fyzicky o niečo hrubšia ako karty MMC. Môžu sa tiež pochváliť vyššou rýchlosťou prenosu dát. Funkcie DRM sú dostupné, ale málo používané. Karty SD zvyčajne merajú 32 mm × 24 mm × 2,1 mm, ale môžu byť tenké až 1,4 mm, rovnako ako karty MMC.

K dispozícii sú rôzne stupne rýchlosti. Označujú sa rovnakou notáciou nx ako disky CD-ROM; násobok 150 kB/s. Zariadenia so slotmi SD môžu používať tenšie karty MMC, ale štandardné karty SD sa do tenších slotov MMC nezmestia. MiniSD a MicroSD karty je možné použiť priamo v SD slotoch s adaptérom. Existujú čítačky, ktoré umožňujú prístup k SD kartám prostredníctvom mnohých portov pripojenia, ako je USB, FireWire.

Pin Režim SD Režim SPI
názov Typ Popis názov Typ Popis
1 CD/DAT3 I/O/PP Detekcia karty / dátová linka konektora 3 C.S. ja Výber čipu v nízkom stave
2 CMD PP Príkazový riadok/riadok odozvy D.I. ja Zadávanie údajov
3 Vss1 S GND VSS S GND
4 Vdd S Zdroj VDD S Zdroj
5 CLK ja Hodiny SCLK ja Hodiny
6 Vss2 S GND VSS2 S GND
7 DAT0 I/O/PP Dátová linka konektora 0 DO O/PP Dátový výstup
8 DAT1 I/O/PP Dátová linka konektora 1 RSV
9 DAT2 I/O/PP Dátová linka konektora 2 RSV

Rozhranie kariet SD je kompatibilné so štandardnými operáciami s kartami MMC. Všetky SD pamäte a SDIO karty musia podporovať starší režim SPI/MMC, ktorý podporuje o niečo pomalšie štvorvodičové sériové rozhranie (hodiny, sériový vstup, sériový výstup, výber čipu), ktoré je kompatibilné s portami SPI na mnohých mikrokontroléroch. Mnoho digitálnych fotoaparátov, digitálnych audio prehrávačov a iných prenosných zariadení pravdepodobne používa výlučne režim MMC. Režim MMC neposkytuje prístup k vlastným šifrovacím funkciám kariet SD a bezplatná dokumentácia SD tieto funkcie nepopisuje. Keďže šifrovanie SD existuje predovšetkým pre producentov médií, nie je príliš užitočné pre spotrebiteľov, ktorí zvyčajne používajú karty SD na uchovávanie nechránených údajov.

SD podporuje tri režimy prenosu: režim SPI (oddelený sériový vstup a sériový výstup), jednobitový režim SD (samostatné príkazové a dátové kanály a proprietárny formát prenosu) a štvorbitový režim SD (používa ďalšie kolíky plus niektoré preradené kolíky) na podporu paralelných prenosov so šírkou štyroch bitov. Nízkorýchlostné karty podporujú prenosovú rýchlosť 0 až 400 kbit/s a režimy prenosu SPI a jednobitovej SD. Vysokorýchlostné karty podporujú prenosovú rýchlosť 0 až 100 Mbit/s v štvorbitovom režime a 0 až 25 Mbit/s v režimoch SPI a jednobitových SD.

Funkcie zabezpečenia kariet SD zahŕňajú:

  • Mechanizmus ochrany autorských práv so štandardom SDMI (Secure Digital Music Initiative)
  • Integrovaná ochrana súborov a systém šifrovania CPRM (CPRM je ochrana obsahu pre nahrávateľné médiá)

Použitie zariadení na báze mikrokontrolérov externá pamäť. Ak potrebujete uložiť jednotky megabajtov, potom sú vhodné sériové pamäťové čipy flash. Pri veľkých objemoch (desiatky až stovky megabajtov) sa však zvyčajne používa nejaký druh pamäťovej karty. V súčasnosti sú najrozšírenejšie karty SD a microSD, o ktorých by som rád hovoril v sérii materiálov. V tomto článku si povieme niečo o pripojení SD kariet k mikrokontroléru a v ďalšom prídeme na to, ako na ne čítať alebo zapisovať dáta.

Pinout kariet SD a microSD

SD karty môžu fungovať v dvoch režimoch – SD a SPI. Účel kolíkov karty a schéma zapojenia závisí od použitého režimu. 8-bitové mikrokontroléry AVR nemajú hardvérovú podporu pre režim SD, takže karty s nimi sa zvyčajne používajú v režime SPI. 32-bitové mikrokontroléry založené na jadre ARM, napríklad AT91SAM3, majú rozhranie pre prácu s kartami v režime SD, takže tam môžete použiť ľubovoľný prevádzkový režim.

Priradenie kontaktov na SD karte v režime SD


Priradenie kontaktov SD karty v režime SPI

Priradenie kontaktov karty microSD v režime SD



Priradenie kontaktov microSD karty v režime SPI



Pripojenie kariet SD a microSD k mikrokontroléru v režime SPI

Napájacie napätie SD kariet je 2,7 - 3,3 V. Ak je použitý mikrokontrolér napájaný rovnakým napätím, potom je možné SD pripojiť k mikrokontroléru priamo. Rasovo správny diagram, zostavený štúdiom špecifikácií na SD kartách a schém rôznych vývojových dosiek, je znázornený na obrázku nižšie. Podľa tejto schémy sú karty pripojené k vývojové dosky spoločnosti Olimex a Atmel.

Diagram zobrazuje kolíky SD karty, nie konektor.


L1 - ferit alebo tlmivka, dimenzovaný na prúd >100 mA. Niekto si ho nainštaluje, niekto sa zaobíde bez neho. Čo by ste však naozaj nemali zanedbávať, je polárny kondenzátor C2. Pretože pri pripojení karty dôjde k prúdovému rázu, napájacie napätie „klesne“ a mikrokontrolér sa dá resetovať.

V súvislosti s pull-up odpormi existuje určitá nejednoznačnosť. Keďže SD karty vyrába viacero výrobcov, existuje pre ne viacero špecifikácií. Niektoré dokumenty jasne uvádzajú potrebu pull-up rezistorov (aj pre nepoužívané linky - 8, 9), zatiaľ čo iné dokumenty tento návod neobsahujú (alebo som ich nenašiel).

Zjednodušená verzia obvodu (bez pull-up odporov) je znázornená na obrázku nižšie. Tento obvod bol odskúšaný v praxi a používa sa v doskách Microelectronica. Používa sa aj v mnohých amatérskych projektoch, ktoré možno nájsť na internete.



Tu sú signálové vedenia SD karty držané vysoko mikrokontrolérom a nepoužívané vedenia (8, 9) nie sú nikde pripojené. Teoreticky by mali byť vytiahnuté vo vnútri SD karty. Ďalej budem stavať na tejto schéme.

Ak je mikrokontrolér napájaný napätím odlišným od napájacieho napätia SD karty, napríklad 5 V, potom je potrebné logické úrovne zladiť. Nižšie uvedený diagram ukazuje príklad prispôsobenia úrovní karty a mikrokontroléra pomocou rozdeľovačov napätia. Princíp porovnávania úrovní je jednoduchý – z 5 voltov potrebujete získať 3,0 – 3,2 V.



Linka MISO - DO neobsahuje delič napätia, keďže údaje na ňom sa prenášajú z SD karty do mikrokontroléra, ale na ochranu pred hlupákmi si tam môžete pridať podobný delič napätia, na fungovanie to nebude mať vplyv. obvode.

Ak použijete vyrovnávací čip, ako napríklad CD4050 alebo 74AHC125, aby sa úrovne zhodovali, týmto nevýhodám sa dá vyhnúť. Nižšie je obvod, kde sa vyrovnanie úrovne vykonáva pomocou 4050 IC Tento IC má 6 neinvertujúcich vyrovnávacích pamätí. Nepoužité nárazníky čipov sú „tlmené“.

Pripojenie microSD kariet je podobné, len ich číslovanie pinov je mierne odlišné. Dám len jeden diagram.



V schémach som sa pozrel na pripojenie SD kariet k mikrokontroléru priamo - bez konektorov. V praxi sa bez nich samozrejme nezaobídete. Existuje niekoľko typov konektorov a navzájom sa mierne líšia. Piny konektora spravidla opakujú piny SD karty a obsahujú aj niekoľko ďalších - dva piny na detekciu karty v slote a dva piny na určenie blokovania zápisu. Tieto piny nie sú nijako elektricky spojené s SD kartou a nie je potrebné ich zapájať. Ak sú však potrebné, môžu byť pripojené ako bežné dotykové tlačidlo - jeden kolík na zem, druhý cez odpor na napájací klad. Alebo použite vyťahovací odpor mikrokontroléra namiesto externého odporu.

Pripojenie kariet SD a microSD k mikrokontroléru v režime SD

Na dokončenie obrázku uvediem schému pripojenia SD karty v jej natívnom režime. Umožňuje výmenu dát vyššou rýchlosťou ako režim SPI. Nie všetky mikrokontroléry však disponujú hardvérovým rozhraním pre prácu s kartou v režime SD. Majú ho napríklad mikrokontroléry ARM SAM3/SAM4 od Atmelu.



Dátovú zbernicu DAT je možné použiť v 1-bitovom alebo 4-bitovom režime.

Pokračovanie nabudúce...

Pekný deň všetkým! Dnes budeme hovoriť o pripojenie pamäťovej SD karty k mikrokontroléru STM32.

Zdalo by sa, že ovládače STM32F10x majú dostatok pamäte, prečo by ich malo byť viac, ale tento dojem klame) Napríklad potrebujeme zobraziť niekoľko rôzne obrázky– formát 320*240 – teda 76800 pixelov, z ktorých každý zodpovedá až 2 bajtom. Takže dostaneme približne 150 kB na obrázok. A to je podľa štandardov mikrokontroléra veľa a nie je pravda, že do jeho pamäte Flash je možné vložiť dva rôzne obrázky. Alebo potrebujeme uchovávať veľké množstvo informácií, dát napríklad z nejakého senzora. Navyše, aby boli tieto údaje dostupné aj po vypnutí napájania. Tu prichádza vhod externá pamäť. A skvelé riešenie by bolo SD pamäťová karta alebo MMC. Mimochodom, v tomto článku budeme vykonávať experimenty micro SD kartu.

Najprv pár slov o samotnej pamäťovej karte, presnejšie o jej pinoute. Celé to vyzerá takto:

Tak čo tu máme? No, hneď je jasné, že má osem kolíkov. Priradenia pinov sú nasledovné (zľava doprava):


Stĺpec SPI Mode nám naznačuje, že interaguje s mikrokontrolérom pomocou rozhrania SPI. ALE! Pôjdeme inou cestou 😉 Ide o to, že STM32 majú na palube hotový periférny modul na prácu s pamäťovými kartami a volá sa SDIO.

Vo všeobecnosti interakcia s pamäťovými kartami zahŕňa odosielanie určitých príkazov. Niektoré príkazy vyžadujú argument, niektoré nie. Príkazy nájdete v oficiálnej dokumentácii ku konkrétnej karte. Vstavaný modul SDIO teda umožňuje výrazne zjednodušiť proces prenosu príkazov a vlastne aj proces práce s externými pamäťovými kartami. Napríklad tu je register SDIO_CMD– tam jednoducho napíšeme kód príkazu, ktorý chceme preniesť na kartu. Alebo tu je register stavu SDIO_STA– na každé kýchnutie je až 24 vlajok, teda na veľké množstvo podujatí.

Mimochodom, STM poteší aj dobrou dokumentáciou k celej tejto záležitosti. Tu je napr. Detailný popis inicializácia pre pamäťovú kartu SD (pre ostatné typy kariet je všetko popísané podobne):

V skutočnosti je čas prejsť na praktický príklad. Poďme sa ponoriť do štandardnej periférnej knižnice.

V súbore stm32f10x_sdio.h Tradične nájdeme štruktúry pre všetky druhy nastavení – teda pre výber zdroja hodinového signálu, frekvenciu SDIO ovládača a nastavenie počtu prenášaných bajtov. Všetko je tam tak veľkoryso komentované, že to ani nechcem samostatne opakovať)) Len sa pozrite:

typedef struct (uint32_t SDIO_ClockEdge; /* Určuje hodinový prechod, na ktorom sa vykoná zachytenie bitov. Tento parameter môže mať hodnotu @ref SDIO_Clock_Edge */ uint32_t SDIO_ClockBypass; /* Určuje, či je zapnuté alebo vypnuté vynechanie deliča hodín SDIO. Tento parameter môže mať hodnotu @ref SDIO_Clock_Bypass */ uint32_t SDIO_ClockPowerSave; /* Určuje, či je výstup hodín SDIO povolený alebo zakázaný, keď je zbernica nečinná. Tento parameter môže mať hodnotu @ref SDIO_Clock_Power_Save */ uint32_t SDIO_BusWide; /* Určuje šírku zbernice SDIO. Tento parameter môže mať hodnotu @ref SDIO_Bus_Wide */ uint32_t SDIO_HardwareFlowControl; /* Určuje, či je povolené alebo zakázané riadenie toku hardvéru SDIO. Tento parameter môže mať hodnotu @ref SDIO_Hardware_Flow_Control */ uint8_t SDIO_ClockDiv; /* Určuje frekvenciu hodín ovládača SDIO. Tento parameter môže mať hodnotu medzi 0x00 a 0xFF. */) SDIO_InitTypeDef; typedef struct (uint32_t SDIO_Argument; /* Určuje argument príkazu SDIO, ktorý sa odošle na kartu ako súčasť správy príkazu. Ak príkaz obsahuje argument, musí byť načítaný do tohto registra pred zápisom príkazu do príkazového registra */ uint32_t SDIO_CmdIndex; /* Určuje index príkazu SDIO. Musí byť menšie ako 0x40. */ uint32_t SDIO_Response; /* Určuje typ odpovede SDIO. Tento parameter môže mať hodnotu @ref SDIO_Response_Type */ uint32_t SDIO_Wait; /* Určuje, či je povolená alebo zakázaná požiadavka čakania na prerušenie SDIO. Tento parameter môže mať hodnotu @ref SDIO_Wait_Interrupt_State */ uint32_t SDIO_CPSM; /* Určuje, či je povolený alebo zakázaný stavový stroj SDIO Command path state machine (CPSM). Tento parameter môže mať hodnotu @ref SDIO_CPSM_State */) SDIO_CmdInitTypeDef; typedef struct (uint32_t SDIO_DataTimeOut; /* Určuje časový limit údajov v intervaloch hodín zbernice karty. */ uint32_t SDIO_DataLength; /* Určuje počet dátových bajtov, ktoré sa majú preniesť. */ uint32_t SDIO_DataBlockSize; /* Určuje veľkosť bloku údajov pre prenos bloku. Tento parameter môže mať hodnotu @ref SDIO_Data_Block_Size */ uint32_t SDIO_TransferDir; /* Určuje smer prenosu údajov, či ide o prenos na čítanie alebo zápis. Tento parameter môže mať hodnotu @ref SDIO_Transfer_Direction */ uint32_t SDIO_TransferMode; /* Určuje, či je prenos údajov v režime prúdenia alebo blokovania. Tento parameter môže mať hodnotu @ref SDIO_Transfer_Type */ uint32_t SDIO_DPSM; /* Určuje, či je povolený alebo zakázaný stavový stroj SDIO Data path State Machine (DPSM). Tento parameter môže mať hodnotu @ref SDIO_DPSM_State */) SDIO_DataInitTypeDef;

Všimnime si, ako SPL implementuje prenos príkazov na pamäťovú kartu. Na tieto účely bola vyčlenená samostatná štruktúra. SDIO_CmdInitTypeDef. V teréne SDIO_CmdIndex do poľa zadajte kód príkazu SDIO_Argument– argument príkazu, vyplňte aj zvyšné polia. Ostáva už len tieto dáta nejako napchať mikro karta SD 😉 A k tomu si pre nás pripravili funkciu:

SDIO_SendCommand (SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)

Ako argument mu odovzdávame štruktúru, ktorú sme vytvorili. Na zaznamenávanie údajov existuje funkcia - SDIO_WriteData(uint32_t údaje). Po vyvolaní tejto funkcie budú údaje v registri špeciálne navrhnutom na tento účel - SDIO_FIFO.

Takto pracujete s modulom SDIO v STM32F10x)

Teraz prejdime konečne k praxi. Opäť budem pracovať s doskou Mini STM32, keďže milí Číňania si lámali hlavu nad tým, že na ňu osadili slot pre pamäťovú kartu micro SD. Tu je schéma pripojenia konektora karty k mikrokontroléru:

Na napísanie programu použijeme hotový príklad pre Keil - zoberieme si odtiaľ dva súbory, v ktorých je implementované niečo ako ovládač pre prácu s kartami - to sú súbory sdcard.c A sdcard.h. Tvoríme nový projekt, tam prikladáme tieto súbory a okrem toho samozrejme aj súbory CMSIS a SPL. Tu je hotový projekt, v ktorom už bolo všetko pridané - zostáva už len napísať kód pre funkciu main()

Súbor sdcard.c implementuje najrôznejšie funkcie pre prácu s pamäťovou kartou, teraz ich už len musíme použiť 😉 Poďme napísať kód! Napríklad zapíšme 512 bajtov testovacích údajov na micro SD a potom ich skúsme prečítať:

// Prepojte potrebné súbory#include "stm32f10x.h" #include "sdcard.h" /*******************************************************************/ // Pole vstupných a výstupných údajov a premenná na ukladanie údajov// o našej karte uint8_t writeBuffer[ 512 ] ; uint8_t readBuffer[ 512]; SD_CardInfo SDCardInfo; /*******************************************************************/ int main() ( // Testovanie údajov na zápis pre (uint16_t i = 0; i< 512 ; i++ ) { writeBuffer[ i] = i % 256 ; readBuffer[ i] = 0 ; } // Inicializujte mapu SD_Init() ; // Získanie informácií o karte SD_GetCardInfo(& SDCardInfo) ; // Výber karty a nastavenie prevádzkového režimu SD_SelectDeselect((uint32_t ) (SDCardInfo.RCA<< 16 ) ) ; SD_SetDeviceMode(SD_POLLING_MODE) ; // A nakoniec písanie a čítanie SD_WriteBlock(0x00, writeBuffer, 512) ; SD_ReadBlock(0x00, readBuffer, 512) ; zatiaľ čo (1) ()) /*******************************************************************/

Upozorňujeme, že SD karta podporuje záznam v 512 bajtových blokoch.

Ak spustíme program pod debuggerom, uvidíme, že načítané údaje sa zhodujú so zapísanými =) Experiment teda môžeme považovať za úspešný. To je na dnes všetko, čoskoro sa uvidíme!

Ako viete, pamäťové karty SD sú kompatibilné s rozhraním SPI, takže ich možno jednoducho pripojiť k mikrokontroléru a komunikovať s nimi. Dostupné sú aj adaptéry pre microSD karty, z takého adaptéra si vieme vyrobiť slot na microSD kartu pre naše rozloženie. Nižšie uvedené fotografie zobrazujú vzhľad vyrobeného adaptéra na pripojenie k doštičke.

Projekt pôvodne používal pamäťovú kartu microSD s kapacitou 1 GB. Mikrokontrolér je ATmega8 alebo ATmega32, pracujúci na frekvencii 8 MHz z interného RC oscilátora. Okrem toho bolo použité rozhranie RS-232 na pripojenie prototypu k osobnému počítaču na sledovanie údajov. Na prevod logických úrovní rozhrania sa používa čip MAX232. Pre napájanie obvodu je potrebný stabilizovaný 3,3 V napájací zdroj (čip MAX232 je určený pre napájacie napätie 5 V, avšak ako prax ukázala, zostáva funkčný pri 3,3 V). Pripojenie pamäťovej karty pomocou 7-vodičového obvodu podľa pinoutu (pozri obrázok).

Schematický diagram pre mikrokontrolér ATmega8.

Lepšiu stabilitu pri práci s rôznymi kartami poskytujú pull-up odpory R1, R2 s nominálnou hodnotou 51 kOhm rozhrania SPI. Zenerove diódy D1, D2 sú určené na ochranu pamäťovej karty počas prevádzky obvodového programátora (ISP). Kolíky mikroobvodu MAX232 VCC a GND nie sú na diagramoch uvedené, ale musia byť pripojené k príslušným bodom na diagrame.

Schéma zapojenia pre mikrokontrolér ATmega32

Schematický diagram pre mikrokontrolér ATmega32 (pridané hodiny reálneho času na čipe DS1307)

Ako ste si všimli, najnovšia verzia zariadenia je napájaná z 12 V zdroja a doska má dva regulátory napätia 5,0 V (LM7805) a 3,3 V (LM1117-3,3). Na napájanie rozhrania SD karty slúži 3,3 V, zvyšok obvodu je napájaný z 5,0 V zdroja Čip hodín reálneho času DS1307 je v štandardnej konfigurácii a je pripojený k I2C rozhraniu mikrokontroléra.

Najprv sa študoval „surový“ formát prenosu údajov na príklade operácií čítania ľubovoľného bloku údajov, čítania a zápisu niekoľkých blokov údajov, vymazania niekoľkých blokov, zápisu údajov do ľubovoľného bloku pamäte SD. Zariadenie, zostavené na doske, bolo pripojené k počítaču cez rozhranie RS-232. Na zobrazenie načítaných údajov z pamäťovej karty, ako aj na zadávanie a zapisovanie údajov na kartu použite program HyperTerminal (alebo podobný) v počítači.

Po úspešnej implementácii výmeny dát bez špecifikácie bola pamäťová karta naformátovaná (FAT32) v operačnom systéme Windows XP, následne bolo na kartu zapísaných niekoľko textových súborov, adresárov a iných typov súborov (v koreňovom adresári karty). Potom boli napísané rutiny a funkcie na prácu so súborovým systémom FAT32 na čítanie súborov, na získanie zoznamu súborov na pamäťovej karte (pomocou HiperTerminal), na získanie informácií o plnom a voľnom množstve pamäte.

Pohľad na okno programu HiperTerminal s funkciami pre prácu s pamäťovou kartou SD:

Používateľovi sa ponúka viac ako 10 možností práce s pamäťovou kartou (pre verziu s hodinami).

Možnosti 0-4 Toto sú funkcie nízkej úrovne. Po použití možností 0 - 3 budete musieť pred použitím postupov FAT32 preformátovať kartu.
Možnosti 5 – 9- pozrite si systém súborov FAT32. V súčasnosti sú podporované iba krátke názvy súborov (8 bajtov - názov súboru, 3 bajty - prípona súboru). Ak sú zapísané súbory s dlhými názvami, zobrazia sa v terminálovom programe v krátkom formáte. Pre testovanie týchto možností nezabudnite naformátovať kartu v súborovom systéme FAT32 a zapísať si niekoľko adresárov a textových súborov.

Popis možností:

0 - Vymazať bloky- vymazanie zvoleného počtu blokov počnúc od zadaného.
1 - Napíšte jeden blok- zápis údajov do bloku s konkrétnou adresou. Údaje sa zadávajú z klávesnice v programe Hiperterminal;
2 - Čítanie jedného bloku- čítanie údajov z bloku s konkrétnou adresou. Načítané údaje sa zobrazia v okne programu terminálu;
3 - Písanie viacerých blokov- zaznamenanie niekoľkých blokov začínajúcich od konkrétnej adresy;
4 - Čítanie viacerých blokov- čítanie niekoľkých blokov od konkrétnej adresy.

Poznámka. Tu sú funkcie viacerých blokov (možnosti 3 a 4) vypnuté z dôvodu obmedzení pamäte na mikrokontroléri ATmega8, pretože tieto funkcie nie sú potrebné na testovanie systému súborov FAT32. Ak chcete povoliť tieto možnosti, musíte odstrániť makro zo súboru SD_routines.h (#define FAT_TESTING_ONLY). A ak používate ATmega8, počas testovania možností 3 a 4 je možné vymazať knižnicu FAT32, aby sa uvoľnila pamäť mikrokontroléra.

5 - Získajte zoznam súborov- zobrazí zoznam dostupných adresárov a súborov s veľkosťou pamäte, ktorú zaberajú (v koreňovom adresári karty);
6 - Prečítajte si súbor- čítanie zadaného súboru a zobrazenie obsahu v okne programu terminálu;
7 - Vytvorenie súboru- vytvoriť/pridať súbor so zadaným názvom;
8 - Odstrániť súbor- odstrániť všetky súbory súbor so zadaným názvom;
9 - Čítacia kapacita pamäte SD- informácia o plnej a voľnej kapacite pamäťovej karty (využíva sa sektor FSinfo SD karty).

V terminálovom programe je sériový port nakonfigurovaný na 19200 baudov, bez riadenia toku a bez kontroly parity.

Pre verziu s hodinami reálneho času (DS1307) na mikrokontroléri ATmega32 sú vlastnosti vytvorených alebo aktualizovaných súborov viazané na dátum a čas (dátum vytvorenia/zmeny), tieto vlastnosti sú registrované v tabuľke súborov a je možné ich kontrolovať pomocou počítača a hodiny môžu byť užitočné pri zbere údajov. Do ponuky možností v programe terminálu boli pridané tri možnosti.

Lekcia 33

Časť 1

SPI. SD karta. TUK

Dnes budeme pokračovať v našej obľúbenej téme o rozhraní SPI. S touto zbernicou spájajúcou ovládače Atmega8a a ATTtiny2313 sme skončili. A dnes si skúsime cez túto zbernicu pomocou tohto rozhrania pripojiť pamäťovú kartu k mikrokontroléru SD (Secure Digital).

Túto kartu je možné pripojiť aj cez rozhranie SDIO, ale keďže takéto rozhranie náš radič hardvérovo nepodporuje, v tejto lekcii sa ho nebudeme dotýkať. Zaujíma nás typ autobusového spojenia SPI, keďže už máme dobré nahromadené znalosti o tejto téme, ako aj hardvérovú podporu v ovládači, ktorý programujeme.

Napriek tomu sa pozrieme na rozloženie nožičiek kariet pri oboch typoch

No keďže nás zaujíma druhý typ, budeme sa mu venovať.

A tu nie je veľa na pochopenie. Všetky tieto skratky poznáme. Všetky štandardné kolíky rozhrania SPI sú tu a tu nie je nič zbytočné.

Teraz o mape všeobecne. Táto karta nám umožňuje ukladať dáta, jej typ pamäte je FLASH, ktorá je v porovnaní s pamäťou typu EEPROM tiež energeticky nezávislá, to znamená, že po vypnutí napájania dáta nikde nezmiznú, ale zostanú uložené. Aj táto pamäť má rozdiely, spoznáme ich počas procesu programovania. Jedným z hlavných rozdielov je, že rovnako ako v pamäti EEPROM nemôžeme do tejto pamäte zapísať jeden bajt. Teoreticky samozrejme môžeme, ale buď sa tam zapíšu len jednotky z nášho bajtu alebo len nuly, podľa typu FLASH - NOR alebo NAND. To znamená, že pred zápisom bajtu ho musíme vymazať a vzhľadom na organizáciu tejto pamäte môžeme mazať len po blokoch, takže môžeme písať len po blokoch. Ale je tu najväčší rozdiel oproti EEPROM - to je cena. Na jednu uloženú jednotku informácie (za megabajt, za gigabajt) je to mnohonásobne lacnejšie, niekedy aj rádovo lacnejšie. Preto má FLASH pamäť zvyčajne vždy oveľa väčšie množstvo informácií.

Existujú 4 typy SD, ale budeme to študovať trochu neskôr.

Pripojme túto kartu v Proteuse

Všetko je tu jednoduché. Vlastne nie celkom tak. Je potrebných viac odporov

Tieto odpory sú potrebné na zabezpečenie vhodnej úrovne, pretože karta je napájaná 3,3 voltmi. Vo všeobecnosti, podľa technickej dokumentácie, od 2,7 do 3,6 voltov.

Tiež to nie je uvedené v proteuse, ale v skutočnosti budeme napájať našu kartu zo samostatného zdroja napájania inštaláciou mikroobvodu, ktorý prevádza 5 voltov na 3,3 voltov.

Alebo skôr nebudeme nič inštalovať, ale použijeme hotový modul, v ktorom je už všetko nainštalované.

Máme pripojený aj displej, ako pri rozširovaní funkcionality knižnice displejov.

Takto to celé vyzerá v praxi:

Takto vyzerá modul s držiakom

Takýto modul nájdete všade, stojí cent. Modul, ktorý sa pripája cez SDIO, stojí viac. Tiež vidíme, že modul už má nainštalovaný mikroobvod na zníženie napätia na 3,3 voltu. A pripájame napájanie iba k 5 voltovému kontaktu a nepripájame nič k 3.3

Na module sú tiež nainštalované všetky rozdeľovače úrovní, to znamená, že tento modul je navrhnutý špeciálne na pripojenie k 5-voltovým zariadeniam.

A vykopal som flash kartu na testovanie s 32 megabajtmi, presne megabajt a nie gigabajt

Túto flash kartu sme dostali ako darček spolu s nejakým fotoaparátom a najlepšie sa hodí na naše testy, aspoň si nebudeme myslieť, že tá či ona chyba je spôsobená príliš veľkým množstvom pamäte na karte.

Celý kód bol prevzatý aj z minulej lekcie spolu s knižnicou displeja, keďže funkciu, ktorú sme vytvorili v minulej lekcii, budeme využívať veľmi aktívne, no samozrejme bol vytvorený nový projekt a podľa toho aj pomenovaný MYSD_SPI.

Odstránime nepotrebné riadky, v main() budeme mať iba toto

intHlavná( neplatné)

nepodpísanéinti;

Port_ini();

LCD_ini(); //inicializácia displeja

Clearlcd(); //vymazať displej

Setpos(0,0);

Str_lcd( "reťazec 1");

Setpos(2,1);

Str_lcd( "reťazec 2");

Setpos(4,2);

Str_lcd( "Reťazec 3");

Setpos(6,3);

Str_lcd( "Reťazec 4");

Oneskorenie_ms(2000);

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

Zatiaľ čo(1)

Keďže nebudeme vypisovať text znak po znaku, môžeme použiť typ char v premennej

nepodpísanéchar i;

Teraz ešte jedna nuansa.

Na to, aby sme v Proteuse mohli pracovať s SD kartou, nám nestačí pridať samotný držiak s kartou, musíme v jej vlastnostiach pripojiť aj obrazový súbor flash karty.

Nie je ťažké ho vytvoriť. Jedným zo spôsobov je vytvorenie pomocou programu WinImage.

V ňom vytvoríme nový súbor pomocou položky menu Súbor -> Nový. Vyberte poslednú položku v dialógovom okne a kliknite na tlačidlo "OK"

Na test v Proteuse nám stačí veľkosť 4 megabajty, takže v ďalšom dialógu zmeníme pole s počtom sektorov a vyberieme aj formát FAT12/16, pretože špecifiká práce s 32- bitový súborový systém sa mierne líši a tiež klikneme na „OK“

Vo všeobecnosti samozrejme môžeme nechať FAT32, keďže so súborovým systémom ešte nepracujeme, ale v ďalších častiach lekcie budeme pracovať so súborovým systémom a budeme pracovať s 16.12.

Potom ušetríme naše náklady tento súbor pomocou položky ponuky Súbor -> Uložiť ako. A uložíme do priečinka, kde máme uložený projekt proteus. Pomenujeme súbor a klikneme na „Uložiť“

Potom sa tiež budeme musieť uistiť, že tento súbor nie je s atribútom „len na čítanie“, a potom ho budeme môcť pripojiť v Proteus. Budete musieť ručne zadať názov súboru, pretože Proteus vyžaduje nejaký formát a náš súbor jednoducho nebude viditeľný

Nepotrebujeme žiadnu cestu, pretože súbor sa nachádza v priečinku projektu. Kliknite na „OK“.

Nemusíme inicializovať zbernicu, pretože naše SPI bude založené na softvéri, nie všetky flash karty fungujú správne s hardvérom, takže nebudeme musieť používať žiadne registre. Hardvér je samozrejme lepší, ale aby ste dôkladne pochopili, ako protokol funguje, musíte pracovať aj so softvérom, teda šklbať nohami portov. Vo všeobecnosti sa pri pohľade na diagram môže zdať, že máme všetko v hardvéri, keďže som si vybral presne tieto nohy, je to preto, že som si to tak vybral, takže neskôr možno niekto vyskúša prácu s pneumatikami implementácie hardvéru .

Pridajme makro substitúcie pre portové nohy

#include"main.h"

#definovaťMOSI3

#definovaťMISO4

#definovaťSCK5

#definovaťSS2

Pridajme kód na inicializáciu nôh do funkcie inicializácie portu

neplatnéport_ini( neplatné)

PORTD=0x00;

DDRD=0xFF;

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

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

MISO pin necháme na vstupe, keďže štandardne sú všetky bity v registri nulové a jednoducho sa ho nedotkneme. Okamžite tiež zapneme vysokú úroveň v MOSI a SS a vytiahneme odpor na MISO.

Napíšme si funkciu na prenos bajtu cez SPI zbernicu

neplatnéSPI_SendByte( nepodpísanécharbyte)

{

}

Pridajme premennú pre cyklus a samotný cyklus

neplatnéSPI_SendByte( nepodpísanécharbyte)

nepodpísanéchari;

pre( i=0; i<8; i++) //presun po bitoch bajtu

{

}

Myslím, že je jasné, prečo počítame do 8, keďže prenášame presne 8 bitov.

No, začnime ich postupne prenášať.

Najprv skontrolujeme bit úplne vľavo, izolujeme ho od celého bajtu maskovaním, a ak sa rovná 1, nastavíme ho na 1 na zbernici MOSI a ak je 0, zbernice sa nedotkneme.

pre( i=0; i<8; i++) //presun po bitoch bajtu