SD-muistikortin käyttö mikrokontrollerissa

Alunperin julkaistu: 11.2.2017

Viimeksi muokattu: keskiviikko 26.5.2021

Sulautetuissa laitteissa usein tarvitaan tallentaa tai lukea suuri määrä tietoa joltakin medialta. Tietokoneella tietojen lukeminen ja tallentaminen on helppoa, sillä kaikenlaisia lisälaitteita ja liityntätapoja medioiden käyttöön on kehitetty.

Sulautetussa elektroniikassa liitäntätapana on lähes väistämättä jokin sarjamuotoinen väylä, kuten sarjaportti, I2C, SPI, 1-Wire tai jokin muu tapa (rinnakkaisväylää harvemmin näkee).

Koska sulautetuissa laitteissa yleensä rajoittavana tekijänä on muisti, ei suurta määrää tietoa voida tallentaa tai lukea mikroprosessorin omaan sisäiseen flash-muistiinsa, eikä se itse asiassa ole kovin fiksu tapakaan tietoa tallentaa.

Tarve tiedon tallennukselle tai lukemiselle voi taas olla hyvinkin monisyinen. Joku esimerkiksi tarvitsee dataloggeria, joka kirjaa tietyin aikavälein ylös lämpötilatietoja. Toisella voi taas olla näyttölaite, jonka grafiikat ja fontit on tallennettu ulkoiselle medialle (kuvat etenkin vaativat paljon tilaa koska 1 pikseli voi olla tallennettu RGB-tietona (3 tavua)).

Nykypäivänä muisti on kuitenkin halpaa, varsinkin kun se on ulkoisena "itsenäisenä" palikkana järjestelmästä. Muistikortit ja USB-tikut lienevät tästä hyvä käytännön esimerkki.

Tässä pienessä värkkäilyssä luetaan ja tallennetaan tietoa MSP430 Launchpadin avulla SD-muistikortille, omatekoisen liittimen ja alustan kautta.

Elektroniikka ja tarvittavat osat

SD-muistikorttina toimii tässä tapauksessa Kingstonin 128 MB muistikortti. Kortti on jäänne entisestä digikamerasta joten en tuota varsinaisesti tarvitse mihinkään, eikä näin ollen haittaa jos vähän kikkailen tuon kanssa.

Muistikortin kiinnikkeenä ja liittimenä toimii kaksirivisestä piikkirimasta tehty "liitin". Piikkiriman päitä on taivutettu J:n muotoon jotta katkotut päät eivät pahasti raavi muistikortin kontaktipintoja. Tämän lisäksi piikkirima on hieman lytätty kasaan muistikortin pysyvyyden ja kontaktipintojen takia.

Muistikortin lukija on kasattu tuollaiselle verolevylle, joita elektroniikkakaupoista saa. Lisäksi levyltä on vedetty johtimet Launchpadille, että kehitystä voidaan tehdä sen kautta.

Oikeastaanhan debug-ominaisuus ei vaatisi näinkään montaa piuhaa, mutta mukavampihan se on, kun tämän levyn voi tökätä Launchpadin selkään. Launchpadin pohjasta lähtee vielä piikkirimat, joiden avulla sen saa kytkettyä koekytkentäalustalle, joten tätä on helppo laajentaa muuksikin laitteeksi kuin pelkästään muistikortin käsittelijäksi.

Mikroprosessoriksi on valittu MSP430G2553, sillä siinä on 16 kilotavua ohjelmamuistia ja muutenkin se on ns. "kuningas" TI:n Value Line -perheestä (no tästä voidaan olla montaa mieltä toki).

Rautaahan saa kasaan kuka vain, mutta mitä tekee raudalla ilman ohjelmistoa. Alle on selitetty omia havaintoja, käytettyjä ohjelmia sekä muita asioita joihin törmäsin tämän värkin kanssa.

Yleistä muistikortille tallentamisesta

Ensiksikin, koska kyseessä on muistikortti niin sen oletetaan olevan yhteensopiva PC:n kanssa. Toisin sanoen, tietoja pitää pystyä lukemaan ja käsittelemään tietokoneelta käsin. Tämä ei tietenkään ole välttämättömyys, mutta ilman tätä ominaisuutta muistikortilla ei oikein käytännössä tee mitään.

Kun tietoja pitää pystyä käsittelemään tietokoneelta, niin tarvitaan tiedostojärjestelmä. Tätä ei onneksi tarvitse itse luoda, sillä tiedostojärjestelmiä on olemassa useita jo valmiiksi, täytyy vain valita mitä käyttää.

Tiedostojärjestelmä otetaan muistikortilla käyttöön sen alustuksessa, joka voidaan ihan hyvin Windowsissa (tai muussakin käyttöjärjestelmässä) tehdä.

Alustettaessa muistikorttia, käyttöjärjestelmä luo muistikortille halutunlaisen tiedostojärjestelmän. Tiedostojärjestelmäksi muistikortille on valittu FAT ja yleensä se on muissakin medioissa FAT, kun median koko on alle 4 gigabittiä.

Ohjelmistorunko ja PetitFS

Internet on pullollaan valmista tavaraa jota hyödyntää, joten tässäkin on hyödynnetty valmiiksi kirjoitettua PetitFS FAT-tiedostonkäsittelykirjastoa.

Kyseinen softapaketti käsittelee tiedostojärjestelmän tietoja ja kirjasto mahtuu alle 4:ään kilotavuun. Kirjaston avulla voidaan mountata levy, avata tiedosto sekä lukea, kirjoittaa ja hakea.

PetitFS-kirjasto toimii mikropiirin IO:n ja sovelluksen välisenä rajapintana, joten käyttäjän tarvitsee "vain" kirjoittaa HW-tason koodi, joka kommunikoi fyysisesti SD-kortin kanssa.

 (kuva petitFS kotisivulta)

Periaatteessa kirjaston avulla pystyy luomaan muitakin sovelluksia, kuin vain SD-muistikortin lukijan.

Kirjastoa voidaan räätälöidä omiin tarpeisiin sopiviksi, joten kaikkia toiminnalluuksia ei tarvitse toteuttaa jos ei halua. Kirjastosta voidaan jättää pois esimerkiksi luku tai kirjoitustoiminnot, sillä esimerkiksi näyttölaite ei välttämättä tarvitse muistikortilta muuta kuin lukea näytettävät kirjaimet ja grafiikat. Toisaalta lämpötilaloggeri ei tarvitse lukutoimintoa sillä se vain tallentaa tietoa käyttäjän määrittelemään paikkaan. Niin ja tietysti jotkin muut sovellukset, kuten esimerkiksi tämä sovellus josta kirjoitan, tarvitsee toimiakseen molemmat toiminnot.

PetitFS-kirjastolla on ikävä kyllä omat pienet rajoituksensa, joista on kerrottu alla olevassa kappaleessa.

Tyhjän tiedoston luominen

Suurin ongelma kirjaston käyttöönotossa oli saada SD-muistikortille kirjoitus toimimaan. Aluksi yritin kirjoittaa alustetulle muistikortille test.txt tiedostoon (jonka koko oli 0 tavua) testirimpsua, mutta koska PetitFS-kirjasto ei kykene muokkaamaan tiedostoja isommaksi kirjoitushetkellä, tai minä muunakaan hetkenä, niin tämä ei onnistunut.

Kirjoituksen sai kuitenkin toimimaan, kun kortille loi tiedoston, joka oli tarpeeksi suuri tiedon tallentamista varten. Tätä tiedoston luomista varten kirjoitinkin oman ohjelman, joka luo käyttäjälle halutun kokoisen tiedoston. Ohjelman voit ladata onedrivesta, mutta se täytyy ensin asentaa. Ohjelman lähdekoodin saa myös ottamalla minuun yhteyttä.

Kun tyhjä tiedosto on luotu ja siirretty muistikortille, niin sulautettu ohjelma pystyy korttia ja sen tiedostoja hyödyntämään kirjoituksessa.

Fyysinen kommunikointitaso: SPI

Fyysinen kommunikointitaso on hoidettu MSP430G2553:n SPI-väylällä. SPI-väylää ohjaa MCU:n USCI-yksikkö (Universal Serial Communication Interface). Väylä toimii tässä esimerkissä 4 MHz:n nopeudella, joten tiedonsiirtonopeus on teoreettisesti 4 megabittiä sekunnissa (oikeasti näin ei ole koska tämä riippuu kortista ja koodista ja tähtien asennosta).

Fyysinen kommunikointitaso löytyy projektikansion drivers -kansiosta, missä on kaksi tiedostoa: spi.c ja spi.h. Nämä ovat molemmat alkuperäisen tekijän käsialaa ja lisätietoa alkuperäisestä koodista löytyy tästä linkistä.

Muistikortin kytkentä prosessorille

Muistikortti toimii tässä projektissa SPI-moodissa, mutta muistikortti ei vakio-asetuksilla ole SPI-moodissa vaan SD-moodissa. Ohjelman alustuksessa muistikortti käsketään SPI-moodiin erillisellä komennolla ja monet sulautetut järjestelmät käyttävätkin tätä, sillä SPI-moodissa muistikortin käyttö on hieman yksinkertaisempaa.

Alla olevassa kuvassa nähdään SD-muistikortin kytkentä.

MSP430G2553 porttipinneihin kytketyt nastat ovat seuraavat:

CS-nasta voi olla mikä tahansa IO-pinni, tässä on huvin vuoksi käytetty P1.4:sta.

Lisätietoja muistikorteista ja niiden käyttämisestä löytyy tältä sivulta.

SDCard BoosterPack

SDCard BoosterPack

Launchpadille on myös saatavilla Boosterpack, joka asettuu vastaavalla tavalla Launchpadin selkään. Kyseisen piirilevyn osineen voi ostaa 43oh -kaupasta hintaan 8,99 dollaria. Tai sitten voi käyttää mielikuvitusta ja tehdä kuten tässä on tehty ja yhdistää SD-kortti omalla adapterilla mikrokontrollerin kylkeen.

Demo-ohjelma: kirjoitus ja tallennus

Ohjelmiston rakenne näkyy kuvassa alla:

43oh-foorumilta löytyneeltä koodilta sain hyvän pohjan testailua varten ja pienen pähkinöinnin jälkeen SD-kortin mounttaus, luku ja kirjoitus alkoi toimimaan.

Lisäsin ohjelmaan oman printtifunktion, koska en tykännyt olemassa olevasta. Lisäksi alkuperäinen koodari on kirjoittanut koodin tympeän epäselvästi ja jättänyt käyttämättä monessa paikkaa haka sulkeita {} koodin lohkojen erottelemiseen. Pääohjelmaan hieman näitä korjailinkin ja jatkossa korjaan loputkin, kun seuraavassa projektissa tätä koodia tulen tarvitsemaan.

Parannuksia koodiin voisi tehdä varmasti paljonkin ja koodin kokoa pystyy varmaan jonkun verran karsimaan käymällä se perusteellisesti läpi, mutta tässä on vain karsittu nopeasti kasaan tarvittavat palikat, että ohjelma toimii.

Ohjelma kääntyy ja debuggautuu Code Composer Studiossa (v5) ja projektitiedoston voit ladata tästä: SD-MemoryCardReader.zip.

Ohjelman toiminta

Ohjelma toimii sarjaportista syötettävien komentojen avulla ja mahdollisia syötettäviä komentoja ovat di, fi, fo, fd, fl, ft, fw. Komento syötetään yksitellen ja komentosarja päätetään enterin painalluksella.

Sarjaportin nopeus on tässä tapauksessa 9600 baudia ja yksi stop-bitti sekä 8 databittiä eikä pariteettia (8N1).

di -alustaa SD-kortin ja mahdollistaa kommunikoinnin SD-kortin ohjaimen kanssa. Ilman tätä komentoa ei kannata lähteä liikkeelle, eikä oikeastaan kannata muuta aluksi yrittääkään kuin di -komentoa. Kun di-komentoon saadaan vastaus rc=0, niin voidaan siirtyä eteenpäin ja alustaa tiedostojärjestelmä kuntoon komennolla fi.

fi -komento "mounttaa" median jolloin tiedostot ovat käytettävissä. Tämän voi rinnastaa vaikka CD-levyn syöttämiseen CD-asemaan, mistä nimi mounttauskin lienee tullut.

fo -komennolla avataan haluttu tiedosto lukua tai kirjoitusta varten.

fd lukee avatusta tiedostosta 64 tavua (kirjainta) ja seuraavan kerran kommennettuna seuraavat 64 tavua (aina tiedoston loppuun asti 64 tavua kerrallaan).

fl puolestaan listaa kaikki tiedostot jotka kortin juuresta löytyvät (kansioiden listausta en ole kokeillut).

ft dumppaa kaikki tiedostosta löytyvät tavut näytölle yksittäin, joten jos käytössä on 1 megatavun tiedosto, niin esimerkiksi ft log.txt näyttäisi kaiken log.txt tiedostosta löytyvän tiedon näytöllä. Tässä tapauksessa tähän tuhraantuisi aikaa noin 14,5 tuntia, joten en suosittele käyttämään tätä suurille tiedostoille.

fw tiedoston_nimi tekee testikirjoituksen haluttuun tiedostoon.

Alla olevassa kuvassa nähdään komentojen fl ja fw käyttö.

Huomaa, että tiedostojen koko ei muutu vaikka niihin kirjoitetaan. Kuten aiemmin jo mainittu, PetitFS ei muuta tiedoston kokoa, ainoastaan sen sisältöä!

Lopuksi

Tämä ei varsinaisesti mikään suuri projekti ole tehdä ja tutkia, mutta tätä kannattaa hyödyntää mikäli on tarvetta SD-kortin käyttämiselle. Ohjelman perusrunko antaa hieman osviittaa siitä, kuinka PetitFS-kirjastoa voidaan käyttää.

Mikäli muistikortti ei tunnistu, varmista että olet alustanut sen FAT-kortiksi. Lisäksi muista, että kirjoitusta ja lukua varten kortilla tulee olla tiedostoja. PetitFS ei kykene tekemään uusia tiedostoja muistikortille, ainoastaan hyödyntämään olemassa olevia.

Lisätietoa muistikortin käytöstä löytyy osoitteesta: http://elm-chan.org/docs/mmc/mmc_e.html