This is an old revision of the document!


Table of Contents

 

SD kaart

Teooria

Standardsuuruses SD kaart altvaates (Sinine). Lisaks mikro SD kaart ja selle standardsuuruses adapter.

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.

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 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 ebaeffektiivseks.

Praktika

Mikro SD kaardi ühendamine SPI siiniga.

Kodulabori Kontrollermooduli plaadil on pesa Micro SD mälukaardi sisestamiseks. Ühendatud on see samale SPI siinile koos etherneti kontrolleriga.

Kodulabori teeki on integreeritud FatFs failisüsteemi moodul millega on võimalik lähemalt tutvuda siit.

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 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 korraldust 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 ketas ja failisüsteem. Nupu S3 vajutamine loob kettale kausta, kuhu omakorda luuakse fail. Faili kirjutatakse ka sisu. Nupp S2 kuvab tekitatud faili sisu ekraanile.

 

#include <stdio.h>
#include <homelab/module/ff.h>
#include <homelab/module/diskio.h>
#include <homelab/delay.h>
#include <homelab/pin.h>
#include <homelab/module/lcd_gfx.h>
 
int main (void)
{
	int f_err_flag = -1; //Ketta vea lipp
	int d_err_flag = -1; //Failisüsteemi vea lipp
	char f_err_buf[16];
	char d_err_buf[16];
 
	int variableName = 0;
 
	static FATFS FATFS_Obj;
        FIL fil_obj;
 
	char read_buf[20];
 
	unsigned char new_value1, old_value1 = 0;
	unsigned char new_value2, old_value2 = 0;
	unsigned char new_value3, old_value3 = 0;
 
	// Seab LEDid töökorda ja lülitab välja
	pin_setup_output(led_red); pin_set(led_red);
	pin_setup_output(led_yellow); pin_set(led_yellow);
	pin_setup_output(led_green); pin_set(led_green);
 
	// Ekraani seadistamine
	lcd_gfx_init();
 
	// Kursori (nähtamatu) ekraani keskele viimine
	lcd_gfx_goto_char_xy(3, 2);
 
	// Programmi nime kuvamine
	lcd_gfx_write_string("SD Card");
 
	while (1) 
	{
		// Loeb nuppude väärtused.
   		new_value1 = pin_get_debounced_value(button1);
		new_value2 = pin_get_debounced_value(button2);
		new_value3 = pin_get_debounced_value(button3);
 
		// Nupp S1 alla vajutatud. Registreeritakse ainult üks vajutus.
		if((!new_value1) && (old_value1))
		{
			// SD kaardi initsialiseerimine. Ebaõnnestumise korral seatakse vealipp.
			d_err_flag = disk_initialize(0);
			sw_delay_ms(2);
 
			// Failisüsteemi initsialiseerimine. Ebaõnnestumise korral seatakse vealipp.
			f_err_flag = f_mount(0, &FATFS_Obj);
			sw_delay_ms(2);
		} 
 
	    // Nupp S2 vajutatud. Registreeritakse ainult üks vajutus.
		if((!new_value2) && (old_value2))
		{
			// Faili "fail.txt" avamine lugemisreziimis.
			f_open(&fil_obj, "/Homelab/fail.txt", FA_READ);
 
			// Failist esimese 14 tähemärgi lugemine.
			f_gets (read_buf,14, &fil_obj);
			f_close(&fil_obj);
 
			// Faili esimese 14 tähemärgi ekraanile kirjutamine.
			lcd_gfx_goto_char_xy(0, 0);
			lcd_gfx_write_string(read_buf);
 
		}
 
		// Nupp S3 vajutatud. Registreeritakse ainult üks vajutus
		if((!new_value3) && (old_value3))
		{
			// Suvaline muutuja, mis salvestatakse faili.
			variableName = 4;			
 
			// Kettale luuakse kaust "Homelab".
			f_mkdir("Homelab");	
 
			// Loodud kausta tekitatakse tekstifail "fail.txt".
			f_open(&fil_obj, "/Homelab/fail.txt", FA_CREATE_NEW);
 
			// Fail avatakse kirjutusreziimis.
			f_open(&fil_obj, "/Homelab/fail.txt", FA_WRITE);		
 
			// Faili kirjutamine.
			f_printf(&fil_obj, "Variable: %d", variableName);
 
 			// Faili sulgemine
			f_close(&fil_obj);
		}
 
		// Jätab eelmise nupu väärtuse meelde
		old_value1 = new_value1;
		old_value2 = new_value2;
		old_value3 = new_value3;		
 
		// Kui SD-kaart on initsialisseritud ja töökorras, siis põleb roheline LED
		// ja vastupidisel juhul punane LED.
		if((f_err_flag == 0) && (d_err_flag == 0))
		{
			pin_clear(led_green);
			pin_set(led_red);			
		}
		else
		{			
			pin_set(led_green);
			pin_clear(led_red);
		}
 
		// Ekraanile kuvatakse vealippude olekud. Need on järgnevad:
		// -1 initsialiseerimata
		//  0 viga ei ole
		//  1 (või suurem) viga		
		sprintf(f_err_buf, "Error_f: %02d", f_err_flag );
		sprintf(d_err_buf, "Error_d: %02d", d_err_flag );
 
		lcd_gfx_goto_char_xy(0, 4);
		lcd_gfx_write_string(f_err_buf);
		lcd_gfx_goto_char_xy(0, 5);
		lcd_gfx_write_string(d_err_buf);
 
		sw_delay_ms(2);		
	}
 
}
et/examples/storage/sdcard.1421406395.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