Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:storage:sdcard [2015/01/16 11:05] raivo.sellet:examples:storage:sdcard [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-~~PB~~ 
 ====== SD kaart ====== ====== SD kaart ======
 +//Vajalikud teadmised: 
 +[HW] [[et:hardware:homelab:controller]], [HW] [[et:hardware:homelab:digi]], \\
 +[LIB] [[et:software:homelab:library:pin]], [LIB] [[et:software:homelab:library:module:lcd_graphic]]//
  
 ===== Teooria ===== ===== Teooria =====
  
-[{{  :et:examples:storage:dscn0633.jpg?220|Standardsuuruses SD kaart altvaates (Sinine).  Lisaks mikro SD kaart ja selle standardsuuruses adapter.}}]+{{ :et:examples:storage:sdcard.png?200|SD kaardi viigud}}
  
-Secure Digital (SD) on mälukaardi formaat, mille töötas välja SD Card Association (SDA) kasutamiseks kaasaskantavates seadmetes. SD kaart töötab 3,3 V tööpingega. Kaartiga suhtlemiseks saab kasutada kaarti enda SD nimelist liidest ja ka SPI siini. Viimane on hea võimalus kasutada SD kaarti lihtsamates süsteemides. +Secure Digital (SD) on mälukaardi formaat, mille töötas välja SD Card Association (SDA) eesmärgiga kasutada seda kaasaskantavates seadmetes. Kaartiga suhtlemiseks saab kasutada kaarti enda SD nimelist liidest või SPI siini. Viimane on hea võimalus kasutada SD kaarti lihtsamates süsteemides. SD kaardi tööpinge on 3,3 V.
  
-SD kaart on iseenesest suur hulk mälupitte, mida saab küll muuta, aga muud seadmed ei oska salvestatud andmetega seljuhul midagi peale hakata. Probleemi lahendamiseks kasutatakse failisüsteemi, mis annab võimaluse töötada kogu kaardi mälumaatriksi asemel failidega. Failisüsteemi üks tähtsamaid ülesandeid on organiseerida loogilisi faile füüsilisel salvestusseadmel. Salvestusseadmel olev ruum on jaotatud sektoriteks, mille suurus on enamasti 512 baiti. Kuna failisüsteemil on otstarbekas töötada suuremate üksustega, grupeeritakse sektoreid klastriteks. Klaster on mingi täisarvuline hulk järjestikuliselt asuvaid sektoreid. Suurema klastri kasutamisel väheneb suuremate failide puhul fragmentatsioon, kuid väiksemate failide puhul suureneb raisatud ruum, kuna osa klastreid jääb ainult osaliselt täidetuks.+SD kaart on iseenesest suur hulk mälubitte, mida saab küll muuta, aga muud seadmed ei oska salvestatud andmetega seljuhul midagi peale hakata. Probleemi lahendamiseks kasutatakse failisüsteemi, mis annab võimaluse töötada kogu kaardi mälumaatriksi asemel failidega. Failisüsteemi üks tähtsamaid ülesandeid on organiseerida loogilisi faile füüsilisel salvestusseadmel. Salvestusseadmel olev ruum on jaotatud sektoriteks, mille suurus on enamasti 512 baiti. Kuna failisüsteemil on otstarbekas töötada suuremate üksustega, grupeeritakse sektoreid klastriteks. Klaster on mingi täisarvuline hulk järjestikuliselt asuvaid sektoreid. Suurema klastri kasutamisel väheneb suuremate failide puhul fragmentatsioon, kuid väiksemate failide puhul suureneb raisatud ruum, kuna osa klastreid jääb ainult osaliselt täidetuks.
  
-Portatiivsetel mäluseadmetel ja mälukaartidel on laialt levinud FAT (File Allocation Table) failisüsteem, mida toetavad kõik enamlevinud operatsioonisüsteemid. FAT failisüsteemi failipaigutustabel sisaldab iga kettal oleva faili algusklastri kannet, mis omakorda sisaldab viita järgmisele failiga seotud klastrile ja nii edasi, kuni faililõpu klastrini. FAT-i koral on klastrid adresseeritud n-bitiste kannetega aadressiruumi tabelisse, kus n on sõltuvalt FAT-i versioonist 12 (FAT12), 16 (FAT16) või 32 bitti (FAT32). Seega vanemate FAT versioonide korral muutusid suurte kettamahtude korral klastrid mahult suureks ja seega kettamahu kasutamine ebaeffektiivseks.+Portatiivsetel mäluseadmetel ja mälukaartidel on laialt levinud FAT (File Allocation Table) failisüsteem, mida toetavad kõik enamlevinud operatsioonisüsteemid. FAT failisüsteemi failipaigutustabel sisaldab iga kettal oleva faili algusklastri kannet, mis omakorda sisaldab viita järgmisele failiga seotud klastrile ja nii edasi, kuni faililõpu klastrini. FAT-i korral on klastrid adresseeritud n-bitiste kannetega aadressiruumi tabelisse, kus n on sõltuvalt FAT-i versioonist 12 (FAT12), 16 (FAT16) või 32 bitti (FAT32). Seega vanemate FAT versioonide korral muutusid suurte kettamahtude korral klastrid mahult suureks ja seega kettamahu kasutamine ebaefektiivseks.
  
-===== Praktika =====+SD mälukaardid on saadaval kolmes füüsilises korpuses, millest kõige suurem on nn tavaline SD kaart, väiksem miniSD kaart ja kõige väiksem microSD kaart. microSD kaart on levinud mobiiltelefonides ja tahvelarvutites. Samuti on see formaat kasutusel ka Robootika Kodulabori Kontrollermoodulil. Lisaks välisele korpusele jagatakse SD kaardid veel põlvkondadeks: 
 +  * I põlvkond: SD - mahuga kuni 2 GB 
 +  * II põlvkond: SDHC - mahuga kuni 32 GB 
 +  * III põlvkond: SDXC - mahuga kuni 2 TB
  
-[{{  :et:examples:storage:sd_card_skeem.png?300|Mikro SD kaardi  ühendamine SPI siiniga.}}]+<pagebreak>
  
-Kodulabori Kontrollermooduli plaadil on pesa Micro SD mälukaardi sisestamiseks. Ühendatud on see samale SPI siinile koos etherneti kontrolleriga.+SD kaardid on erineva kiirusega, mille määratlemiseks kasutatakse klasside süsteemi (inglise keeles //Speed Class Rating//, lühend SCR) 
 +Levinumad kiiruse klassid on
 +  * 2 MB/s 
 +  * 4 MB/s 
 +  * 6 MB/s 
 +  * 10 MB/s
  
-Kodulabori teeki on integreeritud FatFs failisüsteemi moodul millega on võimalik lähemalt tutvuda [[http://elm-chan.org/fsw/ff/00index_e.html|siit]]. +===== Praktika =====
- +
-FatFs failisüsteemi moodulis on SD kaardiga suhtlemiseks kaks kihti. Esimene ketta kiht paikneb failides diskio.h ja mmc.c. See on otseselt seotud kettaga suhtlemise ja selle initsialiseerimisega. Lisaks paiknevad seal madala taseme kettale kirjutamise ja lugemisega seotud funktsioonid. Lõppkasutaja jaoks kõige tähtsam funktsioon on //disk_initialize//, mis seadistab valitud ketta töökorda. +
- +
-Failisüsteemi tööks on vaja funktsiooni //disk_timerproc// sagedusega 100 Hz välja kutsuda. Selleks on seadistatud TIMER5 katkestus. Kodulaboril puudub reaalaja kell, mis tähendab, et failidega seotud kellaajad on konstantsed.  +
- +
-Teine failisüsteemi kiht (FatFs) paikneb failis ff.c ja ff.h. Teine kiht suhtleb esimese kihiga madala taseme funktsioonide kaudu ja võimaldab teha failidega seotud toiminguid. Failisüsteemi saab ühendada alles peale ketta töökorda seadmist funktsiooniga //f_mount//. Funktsioonile tuleb ette anda failisüsteemi objekt ja see tagastab tulemuse koodi.+
  
-Peale ketta ja failisüsteemi töökorda seadmist saab alustada tööd konkreetsete failidegaFaili avamiseks on funktsioon //f_open//, millele saab ette anda, millises režiimis see avatakseValikuid on mitmeid, näiteks FA_WRITE  tähendab, et fail avatakse kirjutusrežiimis. Seejärel saab faili kirjutada funktsiooniga //f_write//, või hoopis lugeda funktsiooniga f_readKui failiga on töö lõppenud, siis tuleb see sulgeda, kasutades korraldust //f_close//. Toetatud ja testitud on FAT12FAT16 ja FAT32 failisüsteemid.+Kodulabori Kontrollermoodulil on pesa microSD mälukaardi sisestamiseksMälukaart on ühendatud SPI siinile, Kodulabor II Kontrollermoodulil samale siinile Ethernet kontrolleriga. 
 +Kodulabori teeki on integreeritud FatFs failisüsteemi moodul millega on võimalik lähemalt tutvuda aadressil: [[http://elm-chan.org/fsw/ff/00index_e.html|http://elm-chan.org/fsw/ff/00index_e.html]]. FatFs failisüsteemi moodulis on SD kaardiga suhtlemiseks kaks kihti. Esimene ketta kiht paikneb failides //diskio.h// ja //mmc.c//. See on otseselt seotud kettaga suhtlemise ja selle algväärtustamisega. Lisaks paiknevad seal madala taseme kettale kirjutamise ja lugemisega seotud funktsioonid. Lõppkasutaja jaoks on kõige tähtsam funktsioon //disk_initialize//mis seadistab valitud kaardi töökorda.
  
-Järgmine näide demonstreerib tekstifaili lugemist ja kirjutamistNupule S1 vajutades initsialiseeritakse ketas ja failissüsteemNupu S3 vajutamine loob kettale kaustakuhu omakorda luuakse fail. Faili kirjutatakse ka sisu. Nupp S2 kuvab tekitatud faili sisu ekraanile.+Failisüsteemi tööks on vaja välja kutsuda funktsioon //disk_timerproc// sagedusega 100 HzSelleks on seadistatud taimeri katkestusKodulabori Kontrollermoodulil puudub reaalaja kellmis tähendab, et failidega seotud kellaajad on konstantsed
  
-~~PB~~+Teine failisüsteemi kiht paikneb failides //ff.c// ja //ff.h//. See kiht suhtleb esimese kihiga madala taseme funktsioonide kaudu ja võimaldab teha failidega seotud toiminguid. Failisüsteemi saab ühendada alles peale ketta töökorda seadmist, milleks on funktsioon //f_mount//. Funktsioonile tuleb ette anda failisüsteemi objekt ja see tagastab tulemuse koodi.
  
 +Peale ketta ja failisüsteemi töökorda seadmist saab alustada tööd konkreetsete failidega. Faili avamiseks on funktsioon //f_open//, millele saab ette anda, millises režiimis see avatakse. Valikuid on mitmeid, näiteks //FA_WRITE// tähendab, et fail avatakse kirjutusrežiimis. Seejärel saab faili kirjutada funktsiooniga //f_write//, või hoopis lugeda funktsiooniga //f_read//. Kui failiga on töö lõppenud, siis tuleb see sulgeda, kasutades funktsiooni //f_close//. Toetatud ja testitud on FAT12, FAT16 ja FAT32 failisüsteemid.
  
 +Järgmine näide demonstreerib tekstifaili lugemist ja kirjutamist. Nupule S1 vajutades initsialiseeritakse kaart ja failisüsteem. Nupu S3 vajutamisel luuakse kettale kaust, kuhu omakorda luuakse fail. Faili kirjutatakse ka sisu. Nupp S2 kuvab tekitatud faili sisu ekraanile.
 +\\
 +\\
 +\\
 <code c> <code c>
 +// Kodulabori SD kaardi kasutamise näidisprogramm
 #include <stdio.h> #include <stdio.h>
 #include <homelab/module/ff.h> #include <homelab/module/ff.h>
Line 41: Line 52:
 #include <homelab/module/lcd_gfx.h> #include <homelab/module/lcd_gfx.h>
  
 +// Põhiprogramm
 int main (void) int main (void)
 { {
- int f_err_flag = -1; //Ketta vea lipp + // Ketta vea lipp 
- int d_err_flag = -1; //Failisüsteemi vea lipp+ int f_err_flag = -1; 
 + // Failisüsteemi vea lipp 
 + int d_err_flag = -1; 
  char f_err_buf[16];  char f_err_buf[16];
  char d_err_buf[16];  char d_err_buf[16];
Line 59: Line 73:
  unsigned char new_value3, old_value3 = 0;  unsigned char new_value3, old_value3 = 0;
   
- // Seab LEDid töökorda ja lülitab välja+ // LED-ide töökorda seadmine ja välja lülitamine
  pin_setup_output(led_red); pin_set(led_red);  pin_setup_output(led_red); pin_set(led_red);
  pin_setup_output(led_yellow); pin_set(led_yellow);  pin_setup_output(led_yellow); pin_set(led_yellow);
  pin_setup_output(led_green); pin_set(led_green);  pin_setup_output(led_green); pin_set(led_green);
    
- // Ekraani seadistamine+ // LCD ekraani seadistamine ja teksti kuvamine
  lcd_gfx_init();  lcd_gfx_init();
-  
- // Kursori (nähtamatu) ekraani keskele viimine 
  lcd_gfx_goto_char_xy(3, 2);  lcd_gfx_goto_char_xy(3, 2);
-  
- // Programmi nime kuvamine 
  lcd_gfx_write_string("SD Card");  lcd_gfx_write_string("SD Card");
   
 + // Lõputu tsükkel
  while (1)   while (1) 
  {  {
- // Loeb nuppude väärtused. + // Nuppude väärtuste lugemine 
-   new_value1 = pin_get_debounced_value(button1);+ new_value1 = pin_get_debounced_value(button1);
  new_value2 = pin_get_debounced_value(button2);  new_value2 = pin_get_debounced_value(button2);
  new_value3 = pin_get_debounced_value(button3);  new_value3 = pin_get_debounced_value(button3);
Line 83: Line 94:
  if((!new_value1) && (old_value1))  if((!new_value1) && (old_value1))
  {  {
- // SD kaardi initsialiseerimineEbaõnnestumise korral seatakse vealipp.+ // SD kaardi initsialiseerimine 
 + // Ebaõnnestumise korral seatakse vealipp.
  d_err_flag = disk_initialize(0);  d_err_flag = disk_initialize(0);
  sw_delay_ms(2);  sw_delay_ms(2);
  
- // Failisüsteemi initsialiseerimineEbaõnnestumise korral seatakse vealipp.+ // Failisüsteemi initsialiseerimine 
 + // Ebaõnnestumise korral seatakse vealipp.
  f_err_flag = f_mount(0, &FATFS_Obj);  f_err_flag = f_mount(0, &FATFS_Obj);
  sw_delay_ms(2);  sw_delay_ms(2);
  
   
-     // Nupp S2 vajutatud. Registreeritakse ainult üks vajutus.+ // Nupp S2 vajutatud. Registreeritakse ainult üks vajutus
  if((!new_value2) && (old_value2))  if((!new_value2) && (old_value2))
  {  {
- // Faili "fail.txt" avamine lugemisreziimis.+ // Faili "fail.txt" avamine lugemisrežiimis
  f_open(&fil_obj, "/Homelab/fail.txt", FA_READ);  f_open(&fil_obj, "/Homelab/fail.txt", FA_READ);
  
- // Failist esimese 14 tähemärgi lugemine.+ // Failist esimese 14 tähemärgi lugemine
  f_gets (read_buf,14, &fil_obj);  f_gets (read_buf,14, &fil_obj);
  f_close(&fil_obj);  f_close(&fil_obj);
  
- // Faili esimese 14 tähemärgi ekraanile kirjutamine.+ // Faili esimese 14 tähemärgi ekraanile kirjutamine
  lcd_gfx_goto_char_xy(0, 0);  lcd_gfx_goto_char_xy(0, 0);
  lcd_gfx_write_string(read_buf);  lcd_gfx_write_string(read_buf);
Line 111: Line 124:
  if((!new_value3) && (old_value3))  if((!new_value3) && (old_value3))
  {  {
- // Suvaline muutuja, mis salvestatakse faili.+ // Suvaline muutuja, mis salvestatakse faili
  variableName = 4;   variableName = 4;
  
- // Kettale luuakse kaust "Homelab".+ // Kettale luuakse kaust "Homelab"
  f_mkdir("Homelab");   f_mkdir("Homelab");
   
- // Loodud kausta tekitatakse tekstifail "fail.txt".+ // Loodud kausta tekitatakse tekstifail "fail.txt"
  f_open(&fil_obj, "/Homelab/fail.txt", FA_CREATE_NEW);  f_open(&fil_obj, "/Homelab/fail.txt", FA_CREATE_NEW);
  
- // Fail avatakse kirjutusreziimis.+ // Fail avatakse kirjutusrežiimis
  f_open(&fil_obj, "/Homelab/fail.txt", FA_WRITE);   f_open(&fil_obj, "/Homelab/fail.txt", FA_WRITE);
  
- // Faili kirjutamine.+ // Faili kirjutamine
  f_printf(&fil_obj, "Variable: %d", variableName);  f_printf(&fil_obj, "Variable: %d", variableName);
    
Line 130: Line 143:
  }  }
   
- // Jätab eelmise nupu väärtuse meelde+ // Eelmise nupu väärtuse meelde jätmine
  old_value1 = new_value1;  old_value1 = new_value1;
  old_value2 = new_value2;  old_value2 = new_value2;
  old_value3 = new_value3;   old_value3 = new_value3;
  
- // Kui SD-kaart on initsialisseritud ja töökorras, siis põleb roheline LED + // Kui SD-kaart on initsialiseeritud ja töökorras, siis põleb  
- // ja vastupidisel juhul punane LED.+ // roheline LED ja vastupidisel juhul punane LED
  if((f_err_flag == 0) && (d_err_flag == 0))  if((f_err_flag == 0) && (d_err_flag == 0))
  {  {
Line 162: Line 175:
  sw_delay_ms(2);   sw_delay_ms(2);
  }  }
- 
 } }
 </code> </code>
et/examples/storage/sdcard.1421406357.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0