Dom sprzęt sieciowy Podłączenie karty SD do mikrokontrolera. Odzyskiwanie danych z monolitycznych kart SD i MicroSD. Pinout gniazda karty SD

Podłączenie karty SD do mikrokontrolera. Odzyskiwanie danych z monolitycznych kart SD i MicroSD. Pinout gniazda karty SD

Artem Makarov, czyli Robin

27.09.2014

Ostatnio coraz częściej do odzyskiwania danych wykorzystuje się dyski flash wykonane na bazie monokryształów, tak zwane monolity. Dzisiaj porozmawiamy o procesie odzyskiwania danych z takiego monolitu - karty pamięci SD przesłanej przez partnera z miasta Kemerowo. Na karcie nagrano wideo ze ślubu, a kiedy uroczystość zakończyła się pomyślnie i nadszedł czas, aby rozpocząć edycję i wydawanie prezentowych płyt DVD, pamięć flash na długo zgasła.

Odzyskiwanie monolitycznych kart pamięci SD

Warto zauważyć, że z zewnątrz nie jest jasne, czy jest to „klasyczna” karta SD, z płytką PCB, pamięcią NAND i kontrolerem, czy też pojedynczy kryształ. Do czasu otwarcia plastikowej obudowy. Najczęściej awaria takich kart pamięci jest spowodowana awarią tabel tłumaczeń. Rzadziej - uszkodzenia elektromechaniczne.

Aby odzyskać pliki z takiej karty, pierwszą rzeczą, którą musisz zrobić, to odczytać zrzuty z kryształu. W tym celu lakier ochronny, który zakrywa ścieżki i pola stykowe monolitu, usuwa się mechanicznie (czyszczenie i szlifowanie). Po czym dysk flash zaczyna wyglądać następująco:

Ścieżki i układ pinów monolitycznej karty SD

Widoczne są pola kontaktowe, do których podłączona jest magistrala danych, włączenie chipa, zajęty odczyt/zapis, zasilanie itp. Oczywiście nic nie jest zaznaczone, a arkusze danych szczegółowo określające, co i gdzie podłączyć, również nie są ogólnodostępne. Pinout można znaleźć albo biorąc dokładnie ten sam działający dysk flash (a jest ich bardzo wiele rodzajów, a po znalezieniu tego samego konwencjonalnego wyglądu Kingston SD, można dostać w środku zupełnie inne urządzenie) i uzbrojony w analizator logiczny, dokładnie dowiedz się, co trafia gdzie i dlaczego. Lub kupując układ pinów od osoby/biura, które już wykonało dla Ciebie taką pracę.

Rezultatem jest coś takiego:

Albo to:

Teraz musimy wyeliminować wewnętrzne przekształcenia w powstałych zrzutach. Pierwszym krokiem jest usunięcie maski XOR, którą zastosował kontroler dysku flash podczas zapisywania informacji do komórek NAND. Dzięki tej masce sektor wygląda następująco:

a kiedy zostanie wybrana i zastosowana wymagana maska ​​​​XOR, sektor nabiera znaczącego wyglądu:

Po wyeliminowaniu transformacji XOR należy ustawić prawidłową geometrię sektora, opisać znaczniki oraz obszar korekcji danych ECC. Popraw błędy bitowe za pomocą algorytmu ECC. Dowiedz się, w jakiej kolejności znajdowały się bloki i ich wielkość. Ponieważ typ sterownika nie jest znany (jest to monolit!), należy określić, jaki kolektor zastosować w tym konkretnym przypadku. Czy będzie to składanie ostatecznego obrazu przy użyciu znacznika sektora, czy przy użyciu pozostałych tabel tłumaczeń?

Po złożeniu obrazu sprawdź trafność bloków konfliktowych, które mają ten sam znacznik i wstaw do obrazu te, z którymi efekt końcowy będzie najlepszy. Po otrzymaniu znajomego obrazu z systemem plików możesz go otworzyć w dowolnym edytorze dysków i przesłać pliki potrzebne użytkownikowi.

Oczywiście wiele operacji jest dość zautomatyzowanych, niemniej jednak ilość pracy związana z odzyskiwaniem danych z monolitów (monokryształów) jest bardzo duża. Nie każdy inżynier czy firma zajmująca się odzyskiwaniem informacji jest chętna do zaangażowania się w taką pracę. A cena tego rodzaju renowacji jest bardzo daleka od koncepcji „budżetu”.

Oto kolejny przypadek na przykładzie odzyskiwania SD Sandisk - ten sam monolit, tylko w środku wykonany trochę inaczej:

Gotowy do przeczytania

Odzyskiwanie dysków flash MicroSD

A oto jak wyglądają pola kontaktowe na karcie Micro SD. Należy od razu zauważyć, że to tylko kilka przykładów wielu opcji układu.

A oto opcja pinów dla monolitycznej karty pamięci Memory Stick Pro Duo

Nie oznacza to, że jest to monolit, ale nie jest też zwykłym pendrivem. Układ pamięci (kryształ) jest wypełniony związkiem (klejem).

A tak wygląda monolityczna karta Olympus XD Picture, z której konieczna była renowacja zdjęć:

Przywracanie uszkodzonych kart Micro SD

Osobno warto wspomnieć o pomyślnym zakończeniu zadań odzyskiwania informacji z dysków flash MicroSD, które zostały rozbite na kawałki, z uszkodzonym kawałkiem, z pęknięciami w korpusie itp. Kilka przykładów na zdjęciach poniżej:

We wszystkich przypadkach, gdy mówimy o dysku flash podzielonym na kawałki, z uszkodzoną częścią itp. Możliwe jest przywrócenie informacji, jeśli kryształ NAND pozostanie nienaruszony. Przykładowo w pendrive'ie Sandisk z poniższego przykładu w wyniku nieostrożnej obsługi odłamała się część i uszkodziła tory oznaczone czerwonym owalem.

Laboratorium Hardmaster jako jedno z nielicznych posiada doświadczenie i kwalifikacje w zakresie odzyskiwania danych z monolitycznych nośników USB, SD, microSD, Memory Stick itp. karty pamięci. Jeśli na Twoim monolitycznym, uszkodzonym dysku flash znajdują się ważne pliki, które chcesz zwrócić, skontaktuj się z nami!

Kilka lat temu w maju 2011 roku twórca kultowej gry „Elite” David Braben przedstawił pierwszą koncepcję komputera jednopłytkowego Raspberry Pi. Ta chwila stała się punktem zwrotnym w moim życiu. Pomysł stworzenia komputera wielkości pendrive'a pojawił się już na powierzchni, ale nabrał rozpędu dopiero dzięki Fundacji Raspberry Pi.

Już 25 lipca 2011 roku do produkcji trafiła wersja alfa komputera. Niestety koncepcja projektu uległa zmianie i obecnie jest on pozycjonowany jako komputer wielkości karty kredytowej. Pomimo tych okoliczności miliony ludzi poszły za nim. Ja też słuchałem efektu tłumu, codziennie zaglądając na oficjalną stronę projektu. Rozpoczęło się długie i bolesne oczekiwanie na „cud”, który nastąpił 29 lutego 2012 r. - rozpoczęcie sprzedaży.

Raspberry Pi można kupić w sieci Farnell lub w firmie RS Components. Jak się okazało, 29 lutego można było złożyć jedynie zamówienie w przedsprzedaży. Żadne z urzędów nie miało na stanie tych tablic. Pierwsza partia urządzeń liczyła zaledwie 10 000 egzemplarzy, więc biorąc pod uwagę szum wokół projektu, złożenie zamówienia było bardzo trudne. Jednak po pokonaniu wszystkich trudności o godzinie 14:06 tego samego dnia komputer został zakupiony od Farnella za 46,73 funtów.

Realizacja któregokolwiek z moich zagranicznych zamówień trwała tak długo. Bardzo się zdenerwowałem, że Farnell, pobierając opłatę w wysokości 20 funtów za dostawę, wysłał paczkę 29 maja 2012 r. (2 miesiące później) zwykłą pocztą bez numeru przesyłki. Co zaskakujące, symbioza Poczty Królewskiej i Poczty Rosyjskiej dostarczyła przesyłkę całą i zdrową 22 czerwca. Była to najbardziej pożądana przesyłka ostatnich miesięcy, więc nie mogąc wytrzymać stresu, musiałam wziąć wolne w pracy i pobiec na pocztę.

Nie ma sensu rozmawiać o tym, jak skonfigurować Raspberry Pi do pierwszego uruchomienia. Spóźniłem się z artykułem na ten temat kilka lat; wiele linijek na ten temat zostało już napisanych w innych zasobach i na youtube Opublikowano wystarczającą liczbę filmów. Chcę porozmawiać o istotnej dla mnie wadzie projektowej - niewygodnej lokalizacji gniazda karty SD. Po włożeniu karta wystaje znacznie poza planszę, co psuje wygląd domowej roboty etui.

Istnieją dwie możliwości rozwiązania tego problemu: przylutuj adapter SD->microSD równolegle do złącza zainstalowanego na Raspberry Pi (o tym, jak wykonać tę operację, możesz przeczytać w artykule na temat Habré), lub użyj niskoprofilowego adaptera MicroSD-> Adapter SD. Pierwsza opcja jest dla mnie po prostu nie do przyjęcia - cóż, nie odważę się lutować płytki, bo... Boję się, że zepsuję prezentację mojej Malinki. Myślę, że najlepszym wyborem będzie zastosowanie adaptera niskoprofilowego.

Początkowo zdecydowano się na zakup takiego adaptera w jednym z zagranicznych sklepów internetowych. Jest wybór, ale koszt takich bibelotów jest po prostu zaporowy. Najtańsze egzemplarze kosztują 10 dolarów, a niektóre próbki szczerze mówiąc wyglądają na domowe. Ostateczna decyzja o samodzielnym wykonaniu adaptera została podjęta po odwiedzeniu strony DIYGadget; zwróćcie uwagę, jak łatwo jest powtórzyć ich tworzenie.

Gotowy? Przejdźmy od słów do czynów. Aby poprawnie wykonać adapter, przestudiujmy specyfikacje kart SD i microSD. Wszystko, co jest niezbędne do produkcji, starałem się usystematyzować w tabelach 1, 2.

Tabela 2: Pinout karty pamięci SD

Łącząc odpowiednie styki na kartach pamięci i łącząc Vss1, Vss2, otrzymujemy schemat obwodu elektrycznego adaptera.

Do wykonania adaptera potrzebujemy:
1) Uchwyt na kartę microSD (CF TFC-WPCE-08 KARTA MICROSD) – 52,22 rub.
2) Kawałek dwustronnej folii laminatu z włókna szklanego o powierzchni około 4 cm 2 (2% pozycji FOLIA SZKLANA TEXTOLITE 1,5MM 2 STRONY) – 3 ruble.
3) Materiały instalacyjne (chlorek żelaza, cyna, topnik) – 10 rubli.

Wtedy koszt projektu wyniesie 65 rubli 22 kopiejek i pewna ilość wolnego czasu. Aby obniżyć koszt projektu, istnieje możliwość wymiany uchwytu karty microSD na kartę CF TFC-WPCER-08 MICROSD. Niestety pozycja ta nie była dostępna w magazynie Promelektronika SA, dlatego zakupiłem droższą opcję. Zwracam uwagę na fakt, że w przypadku zmiany rodzaju uchwytu, zastosowanie mojego szablonu do LUT (technologia prasowania laserowego) może nie być możliwe.

Do zaprojektowania płytki PCB użyłem programu Autocad, ponieważ... mój ulubiony SprintLayout nie mógł mnie zadowolić obecnością wymaganego szablonu. Dla tych, którzy lubią modyfikować płytkę drukowaną, można pobrać źródło w formacie DWG, a jeśli nie ma takiej potrzeby, to blankiet w formacie PDF (polecam sprawdzić wymiary przed zastosowaniem szablonu PDF).

Po przeniesieniu szablonu na deskę polecam wywiercić otwory o średnicy 0,5 mm w celu przejścia z jednej warstwy na drugą.

Przejście z warstwy na warstwę wykonuję cienkim drutem, uprzednio naświetlając ścieżki przyszłego adaptera. W miejscach, w których znajdują się otwory pod uchwytem microSD, konieczne jest zeszlifowanie kropli cyny pilnikiem, aby został zainstalowany bez zniekształceń. Na koniec montujemy uchwyt. Jeśli w procesie produkcji płytki zastosowano różne topniki, pamiętaj o umyciu płytki przed włożeniem jej do Raspberry Pi.

Zrób adapter samodzielnie lub kup – wybór należy do Ciebie. Aby Twój wybór był bardziej świadomy, specjalnie dla Ciebie wybrałem kilka linków do zakupu:
1) Niskoprofilowy adapter microSD (TF) Raspberry Pi Premium na kartę SD. Chroń tablicę.
2) Niskoprofilowy adapter karty microSD do karty SD Raspberry Pi, karta SD nie ulegnie uszkodzeniu!!
3) Adapter MicroSD na „krótki” SD/RS-MMC. Do wózków Everdrive, Raspberry Pi itp.
4) Niskoprofilowy adapter kart MicroSD na SD dla Raspberry Pi.
5) Adapter karty SD dla Raspberry pi REV2 + darmowa wysyłka.

Podsumowując, chciałbym powiedzieć, że cały materiał jest przeznaczony wyłącznie do celów informacyjnych. Wykorzystywanie rozwiązań do celów komercyjnych jest surowo zabronione. Powielanie materiałów możliwe jest wyłącznie za moją zgodą i zgodnie z powołaniem się na oryginalne źródło. Tych, którzy chcą wesprzeć mnie nie tylko słowem, ale i czynem, a także podziękować, proszę o kontakt mailowy.

Aby samodzielnie złożyć urządzenie, należy pobrać następujące pliki:
1. Płytka źródłowa dla LUT w formacie DWG
2. Płatność za LUT w formacie PDF

Powodzenia w Twoich staraniach!!!

Lekcja 33

Część 1

SPI. Karta SD. TŁUSZCZ

Dzisiaj będziemy kontynuować nasz ulubiony temat dotyczący interfejsu SPI. Skończyliśmy z tą magistralą łączącą ze sobą kontrolery Atmega8a i ATTtiny2313. A dzisiaj spróbujemy podłączyć kartę pamięci do mikrokontrolera za pośrednictwem tej magistrali za pomocą tego interfejsu SD (bezpieczny cyfrowy).

Kartę tę można także podłączyć poprzez interfejs SDIO, jednak ponieważ nasz kontroler nie wspiera sprzętowo takiego interfejsu, nie będziemy się nim zajmować w tej lekcji. Interesuje nas rodzaj połączenia autobusowego SPI, ponieważ mamy już dobrą zgromadzoną wiedzę na ten temat, a także wsparcie sprzętowe w sterowniku, który programujemy.

Niemniej jednak przyjrzymy się pinoutowi nóg karty dla obu typów

No cóż, skoro nas interesuje ten drugi typ, to się nim zajmiemy.

I nie ma tu zbyt wiele do zrozumienia. Znamy wszystkie te skróty. Znajdują się tu wszystkie standardowe piny interfejsu SPI i nie ma tu nic zbędnego.

Teraz ogólnie o mapie. Karta ta pozwala na przechowywanie danych, jej rodzaj pamięci to FLASH, która w porównaniu do pamięci typu EEPROM jest także pamięcią nieulotną, czyli po wyłączeniu zasilania dane nigdzie nie znikają, lecz pozostają zapisane. Ta pamięć też ma różnice, poznamy je podczas procesu programowania. Jedną z głównych różnic jest to, że podobnie jak w pamięci EEPROM, nie możemy zapisać do tej pamięci ani jednego bajtu. Teoretycznie oczywiście, że możemy, ale albo zostaną tam zapisane tylko jedynki z naszego bajtu, albo same zera, w zależności od typu FLASH - NOR lub NAND. Oznacza to, że przed zapisaniem bajtu musimy go skasować, a ze względu na organizację tej pamięci możemy kasować tylko blokami, zatem możemy pisać tylko blokami. Ale jest największa różnica w stosunku do EEPROM - to jest cena. Jest to wielokrotnie tańsze, czasem nawet o rząd wielkości tańsze w przypadku jednej przechowywanej jednostki informacji (na megabajt, na gigabajt). Dlatego pamięć FLASH zwykle zawsze zawiera znacznie większą ilość informacji.

Istnieją 4 typy SD, ale przestudiujemy to nieco później.

Podłączmy tę kartę będąc w Proteusie

Tutaj wszystko jest proste. Właściwie to nie do końca tak. Potrzebujesz więcej rezystorów

Rezystory te są potrzebne do zapewnienia odpowiednich poziomów, ponieważ karta zasilana jest napięciem 3,3 V. Ogólnie, zgodnie z dokumentacją techniczną, od 2,7 do 3,6 wolta.

Ponadto nie jest to wskazane w proteusie, ale w rzeczywistości będziemy zasilać naszą kartę z osobnego zasilacza, instalując mikroukład, który konwertuje 5 woltów na 3,3 wolta.

A raczej nic nie będziemy instalować, tylko skorzystamy z gotowego modułu, w którym wszystko jest już zainstalowane.

Mamy też podłączony wyświetlacz, co poszerza funkcjonalność biblioteki wyświetlaczy.

Tak to wszystko wygląda w praktyce:

Tak wygląda moduł z uchwytem

Taki moduł znajdziesz wszędzie, kosztuje grosze. Moduł łączący się poprzez SDIO kosztuje więcej. Widzimy również, że moduł ma już zainstalowany mikroukład obniżający napięcie do 3,3 wolta. I podłączamy zasilanie tylko do styku 5 V i nie podłączamy niczego do 3,3

Ponadto na module zainstalowane są wszystkie dzielniki poziomu, co oznacza, że ​​moduł ten jest zaprojektowany specjalnie do podłączenia do urządzeń 5-woltowych.

I wykopałem kartę flash do testów z 32 megabajtami, dokładnie megabajtem, a nie gigabajtem

Ta karta flash została podarowana w prezencie razem z aparatem i najlepiej nadaje się do naszych testów, przynajmniej nie będziemy myśleć, że ten czy inny błąd jest spowodowany zbyt dużą ilością pamięci na karcie.

Cały kod został również wzięty z ostatniej lekcji wraz z biblioteką wyświetlania, ponieważ będziemy bardzo aktywnie korzystać z funkcji, którą stworzyliśmy na ostatniej lekcji, ale oczywiście został stworzony nowy projekt i odpowiednio nazwany MYSD_SPI.

Usuńmy niepotrzebne linie, w main() będziemy mieli tylko to

wewgłówny( próżnia)

niepodpisanywewI;

Port_ini();

LCD_ini(); //zainicjuj wyświetlacz

Wyczyść LCD(); //wyczyść wyświetlacz

Setpo(0,0);

Str_lcd( „Ciąg 1”);

Setpo(2,1);

Str_lcd( „Ciąg 2”);

Setpo(4,2);

Str_lcd( „Ciąg 3”);

Setpo(6,3);

Str_lcd( „Ciąg 4”);

Opóźnienie_ms(2000);

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

Chwila(1)

Ponieważ nie będziemy wyświetlać tekstu znak po znaku, możemy użyć typu char w zmiennej

niepodpisanyzwęglać I;

Teraz jeszcze jeden niuans.

Abyśmy mogli pracować z kartą SD w Proteusie, nie wystarczy, że dodamy sam uchwyt z kartą, musimy jeszcze załączyć w jej właściwościach plik obrazu karty flash.

Stworzenie takiego nie jest trudne. Jednym ze sposobów jest utworzenie za pomocą programu WinImage.

Tworzymy w nim nowy plik korzystając z pozycji menu Plik -> Nowy. Wybierz ostatni element w oknie dialogowym i kliknij „OK”

Do testu w Proteusie wystarczy nam rozmiar 4 megabajty, dlatego w kolejnym oknie dialogowym zmienimy pole z liczbą sektorów, a także wybierzemy format FAT12/16, ponieważ specyfika pracy z 32- bitowy system plików jest nieco inny i my również klikniemy „OK”

Ogólnie rzecz biorąc, możemy oczywiście wyjść z FAT32, ponieważ nie pracujemy jeszcze z systemem plików, ale w dalszej części lekcji będziemy pracować z systemem plików i będziemy pracować z 12/16.

Następnie zapisujemy utworzony plik za pomocą opcji menu Plik -> Zapisz jako. I zapisujemy go w folderze, w którym mamy zapisany projekt proteus. Nazwijmy plik i kliknij „Zapisz”

Następnie będziemy musieli upewnić się, że plik ten nie ma atrybutu „tylko do odczytu”, po czym będziemy mogli go podłączyć w Proteusie. Będziesz musiał ręcznie wprowadzić nazwę pliku, ponieważ Proteus wymaga pewnego formatu i nasz plik po prostu nie będzie widoczny

Nie potrzebujemy żadnej ścieżki, ponieważ plik znajduje się w folderze projektu. Kliknij OK".

Nie musimy inicjować magistrali, ponieważ nasze SPI będzie oparte na oprogramowaniu; nie wszystkie karty flash działają poprawnie ze sprzętem, więc nie będziemy musieli używać żadnych rejestrów. Sprzętowo jest oczywiście lepiej, ale żeby dokładnie zrozumieć działanie protokołu trzeba też popracować nad oprogramowaniem, czyli pokręcić nóżkami portów. Generalnie patrząc na schemat może się wydawać, że mamy wszystko w hardware, skoro wybrałem dokładnie te nóżki, to dlatego, że tak to po prostu wybrałem, żeby później może ktoś się pokusił o sprzętową realizację opon .

Dodajmy makro podstawienia dla nóg portu

#włączać„główne.h”

#definiowaćMOSI3

#definiowaćMISO4

#definiowaćSCK5

#definiowaćSS2

Dodajmy kod inicjujący nogi do funkcji inicjalizacji portu

próżniaport_ini( próżnia)

PORTD=0x00;

DDRD=0xFF;

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

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

Zostawiamy pin MISO na wejściu, ponieważ domyślnie wszystkie bity w rejestrze mają wartość zerową i po prostu go nie dotykamy. Od razu włączamy także wysoki poziom w MOSI i SS oraz podciągamy rezystor do MISO.

Napiszmy funkcję przesyłającą bajt przez magistralę SPI

próżniaSPI_SendByte( niepodpisanyzwęglaćbajt)

{

}

Dodajmy zmienną dla pętli i samej pętli

próżniaSPI_SendByte( niepodpisanyzwęglaćbajt)

niepodpisanyzwęglaćI;

Do( I=0; I<8; I++) //poruszaj się po bitach bajtu

{

}

Myślę, że jest jasne, dlaczego liczymy do 8, skoro przesyłamy dokładnie 8 bitów.

Cóż, zacznijmy je przekazywać stopniowo.

Sprawdźmy najpierw bit skrajnie lewy, izolując go od całego bajtu poprzez maskowanie i jeśli będzie równy 1, to ustawimy go na 1 na szynie MOSI, a jeśli będzie 0, to nie będziemy dotykać magistrali

Do( I=0; I<8; I++) //poruszaj się po bitach bajtu

Wyświetliliśmy na wyświetlaczu obraz z karty SD, ale zabrakło w nim pewnych punktów, pierwszy polegał na podłączeniu samej karty, drugim było to, że uwzględniono tylko część funkcji biblioteki Petit FatF, przyjrzyjmy się tym punktom bardziej szczegółowo.

Komunikacja z kartą możliwa jest poprzez jeden z dwóch interfejsów, SPI Lub SD.



Trzeba powiedzieć, że interfejs SD może pracować w trybie jednobitowym i czterobitowym.

Schemat podłączenia karty poprzez SPI jest standardowy i wygląda tak: nieużywane piny karty należy podłączyć do zasilacza za pomocą rezystora 10K.


Jednak w projektach amatorskich często zaniedbuje się rezystory podciągające, co upraszcza schemat połączeń.

Należy zauważyć, że karta podłączona przez SPI jest bardzo wymagająca pod względem napięcia zasilania i niewielki spadek napięcia zasilania powoduje, że karta nie działa, zostało to przetestowane na podstawie własnego doświadczenia, o SD nie ma nic do powiedzenia interfejs, jeszcze tego nie próbowałem. Napisałem to wszystko, żeby to mieć na myśli W przypadku zasilania należy zainstalować kondensatory. Jeśli chodzi o cewkę indukcyjną, powinna ona być zaprojektowana na prąd do 100 mA, ale nie jest konieczne jej instalowanie.

Z powyższych diagramów wynika, że ​​karta do działania potrzebuje 3,3 V, w związku z tym napięcie w liniach transmisji danych nie powinno przekraczać zakresu 0 - 3,3 V i tu pojawia się pytanie, co zrobić, jeśli MK jest zasilany przez 5 woltów?
Odpowiedź jest prosta, trzeba dopasować linie danych, a można to zrobić za pomocą konwencjonalnego dzielnika rezystancyjnego.


Z diagramu wynika, że ​​linia MISO nie musi być koordynowana w taki sam sposób, w jaki dane są przesyłane tą linią z karty do MK.
Tak naprawdę niewiele osób podłącza kartę bezpośrednio do MK, znacznie wygodniej jest podłączyć złącze karty do MK lub kupić nakładkę ze złączem i całym niezbędnym okablowaniem.

Ustaliliśmy połączenie, spójrzmy teraz, jak korzystać z biblioteki Petit FatF, który jest przeznaczony dla 8-bitowych mikrokontrolerów z małymi rozmiarami pamięci.

Biblioteka składa się z 5 plików:
liczba całkowita.h- plik nagłówkowy opisujący główne typy danych.

discio.h- plik nagłówkowy, w którym deklarowane są prototypy funkcji niskiego poziomu do pracy z dyskiem i zwracane przez nie kody stanu.

discio.c- w tym pliku muszą być zaimplementowane funkcje niskiego poziomu; początkowo znajdują się tam „odcinki”.

pffсonf.h- plik konfiguracyjny.

pff.h- plik nagłówkowy, w którym deklarowane są prototypy funkcji interakcji z dyskowym systemem plików.

pff.c- plik zawiera implementacje funkcji umożliwiających interakcję z dyskowym systemem plików.

Widać, że aby biblioteka mogła działać, konieczne jest zaimplementowanie funkcji niskiego poziomu. Ale jeśli mówimy o AVR lub PIC, dla nich na stronie można pobrać przykład pracy z biblioteką, w której znajduje się plik mmc, implementuje już funkcje niskiego poziomu. Należy także skonfigurować bibliotekę w pliku pff.h i napisać funkcje niezbędne do działania SPI.

Funkcje Petit FatF.

FRESULT pf_mount (FATFS*)- funkcja montuje/odmontowuje dysk. Tę funkcję należy wywołać przed pracą z dyskiem; jeśli wywołasz funkcję ze wskaźnikiem zerowym, dysk zostanie odłączony. Funkcję można wywołać w dowolnym momencie.

Opcje
FATFS* fs- wskaźnik do obiektu typu FATFS, opis tej struktury można znaleźć w pliku pff.h. Musimy tylko zadeklarować zmienną tego typu.

Zwracane wartości:
FR_OK (0)
FR_NOT_GOTOWY- nie można zainicjować urządzenia
FR_DISK_ERR- wystąpił błąd podczas odczytu z dysku
FR_NO_FILESYSTEM- na dysku nie ma prawidłowej partycji FAT

FATFS fs;//deklaruj obiekt typu FATFS //zamontuj dysk if (pf_mount(&fs) == FR_OK) ( //dysk jest zamontowany, pracujemy z nim //odmontuj dysk pf_mount(NULL); ) else ( //nie udało się zamontować dysku )

FRESULT pf_open (stała char* ścieżka)- funkcja otwiera istniejący plik. Po otwarciu pliku można z nim pracować, to znaczy czytać z niego i pisać do niego. Możesz pracować z otwartym plikiem, dopóki nie zostanie otwarty inny plik. Funkcję można wywołać w dowolnym momencie.

Opcje
const char* ścieżka- wskaźnik do ciągu znaków wskazujący ścieżkę do pliku. Ścieżkę należy określić całkowicie względem katalogu głównego, oddzielając katalogi ukośnikiem.

Zwracane wartości:
FR_OK (0)- zwracany, jeśli funkcja się powiedzie
FR_NO_FILE- nie znaleziono pliku
FR_DISK_ERR- błąd dysku
FR_NOT_ENABLED- dysk nie został zamontowany

FATFS fs;//deklaruj obiekt typu FATFS //zamontuj dysk if (pf_mount(&fs) == FR_OK) ( //otwórz plik znajdujący się w katalogu głównym if(pf_open("hello.txt") == FR_OK ) ( //zrób coś ) //otwórz plik znajdujący się w folderze new if(pf_open("new/hello.txt") == FR_OK) ( //zrób coś ) //odmontuj dysk pf_mount(NULL); ) else ( // Nie udało się zamontować dysku)

FRESULT pf_read(void* buff, WORD btr, WORD* br)- funkcja odczytuje określoną liczbę bajtów z pliku i zapisuje je w buforze. Jeśli liczba odczytanych bajtów jest mniejsza niż wskazana, plik został osiągnięty.
#zdefiniuj _USE_READ 1

Opcje:
unieważnienie* wzmocnienia- wskaźnik do bufora, w którym przechowywane są odczytane dane
SŁOWO btr- liczba bajtów do odczytania
SŁOWO*br- wskaźnik do zmiennej przechowującej liczbę odczytanych bajtów.

Zwracane wartości:
FR_OK (0)- zwracany, jeśli funkcja się powiedzie
FR_DISK_ERR- błąd dysku
FR_NOT_OTWARTE- plik nie został otwarty
FR_NOT_ENABLED- dysk nie został zamontowany

FATFS fs;//deklaracja obiektu typu FATFS BYTE buff;//bufor do odczytu pliku WORD br; //licznik odczytanych bajtów //zamontuj dysk if (pf_mount(&fs) == FR_OK) ( //otwórz plik znajdujący się w katalogu głównym if(pf_open("hello.txt") == FR_OK) ( //odczyt 10 bajtów z tego pf_read(buff, 10, &br); if(br != 10) ( //jeśli br nie jest równe 10 //oznacza to, że dotarliśmy do końca pliku) ) )

FRESULT pf_write(const void* buff, WORD btw, WORD* bw)- funkcja umożliwia zapis danych do otwartego pliku. Aby funkcja działała należy dokonać zapisu w pliku pffconf.h
#define_USE_WRITE 1

Opcje:
unieważnienie* wzmocnienia- wskaźnik do bufora, który chcemy zapisać, wartość zerowa kończy zapis
SŁOWO przy okazji- liczba bajtów, które chcemy zapisać
SŁOWO* bw- wskaźnik do zmiennej przechowującej liczbę bajtów, które można było zapisać. Analizując tę ​​zmienną, możesz dowiedzieć się, czy plik osiągnął koniec.

Zwracane wartości:
FR_OK (0)- zwracany, jeśli funkcja się powiedzie
FR_DISK_ERR- błąd dysku
FR_NOT_OTWARTE- plik nie został otwarty
FR_NOT_ENABLED- dysk nie został zamontowany

Ze względu na to, że biblioteka przeznaczona jest dla mikrokontrolerów z małą ilością pamięci, funkcja ta posiada szereg ograniczeń:

  • Nie możesz tworzyć nowych plików i możesz pisać tylko do już istniejących
  • nie można zwiększyć rozmiaru pliku
  • nie można zaktualizować sygnatury czasowej
  • Operację zapisu można rozpocząć/zatrzymać jedynie na granicy sektora
  • atrybut pliku tylko do odczytu nie może uniemożliwić zapisu

Aby zrozumieć przedostatni punkt, musisz wiedzieć, że pamięć karty jest podzielona na bloki (sektory) po 512 bajtów każdy i nagrywanie można rozpocząć jedynie od początku sektora. Zatem jeśli będziemy chcieli zapisać 1000 bajtów, to pierwszy sektor zostanie zapisany w całości, a do drugiego zostanie zapisane tylko 488 bajtów, a pozostałe 24 bajty zostaną wypełnione zerami.

Aby zapisać do otwartego pliku, musisz wykonać następujące kroki:

  • ustaw wskaźnik na granicę sektora; jeśli nie ustawisz na granicę, wskaźnik zostanie zaokrąglony do dolnej granicy sektora
  • wywołaj funkcję zapisu wymaganą liczbę razy
  • sfinalizuj rekord, wywołując funkcję ze wskaźnikiem zerowym

Aby dać przykład działania funkcji nagrywania, należy rozważyć jeszcze jedną funkcję.

FRESULT pf_lseek (przesunięcie DWORD)- ustawia wskaźnik odczytu/zapisu w otwartym pliku. Możesz ustawić wskaźnik poprzez przesunięcie bezwzględne lub względne; aby uzyskać przesunięcie bezwzględne, musisz przekazać liczbę do funkcji
pf_lseek(5000);
w przypadku wartości względnej przekaż wartość wskaźnika do bieżącej pozycji fs.fptr i wielkość przemieszczenia
pf_lseek(fs.fptr + 3000);
Aby funkcja działała należy dokonać zapisu w pliku pffconf.h
#define_USE_LSEEK 1

Opcje:
Przesunięcie DWORD-a- liczba bajtów, o którą należy przesunąć wskaźnik.

Zwracane wartości:
FR_OK (0)- zwracany, jeśli funkcja się powiedzie
FR_DISK_ERR- błąd dysku
FR_NOT_OTWARTE- plik nie został otwarty

Dane do pliku można zapisać w następujący sposób.
FATFS fs;//deklaracja obiektu typu FATFS BYTE buff;//bufor do odczytu pliku WORD br; //licznik odczytanych bajtów //zamontuj dysk if (pf_mount(&fs) == FR_OK) ( //otwórz plik znajdujący się w katalogu głównym if(pf_open("hello.txt") == FR_OK) ( //set wskaźnik do pierwszego sektora pf_lseek(0); //zapisz pf_write(buff, 10, &br); //sfinalizuj rekord pf_write(0, 0, &br); ) )

Zostawiam tu także kawałek faktycznie działającego kodu wykorzystującego wszystkie opisane powyżej funkcje.
#zdefiniuj F_CPU 8000000UL #zdefiniuj rozmiar_buffa 10 #include #włączać #include "diskio.h" #include "pff.h" #include "spi.h" FATFS fs;//deklaracja obiektu typu FATFS BYTE read_buff;//bufor do odczytu pliku BYTE write_buff = "witaj słowo"; /// /bufor zapisu do pliku UINT br; //licznik bajtów odczytanych int main(void) ( //zamontuj dysk if (pf_mount(&fs) == FR_OK) ( //otwórz plik znajdujący się w nowym folderze if(pf_open("new/hello.txt") == FR_OK) ( //ustaw wskaźnik zapisu pf_lseek(0); //zapis pf_write(write_buff, buff_size, &br); //zakończ zapis pf_write(0, 0, &br); //ustaw wskaźnik odczytu pf_lseek( 0); //przeczytaj następnie, co zostało napisane pf_read(read_buff, buff_size, &br); if(br != buff_size) ( //jeśli br nie jest równe buff_size //oznacza to, że dotarliśmy do końca pliku) ) //odmontuj dysk pf_mount(NULL); ) while(1) ( ) )

FRESULT pf_opendir(DIR* dp, const char * ścieżka)- funkcja otwiera istniejący katalog i tworzy wskaźnik do obiektu typu DIR, który posłuży do uzyskania listy plików w otwartym katalogu.
Aby funkcja działała należy dokonać zapisu w pliku pffconf.h
#definiuj_USE_DIR 1

Opcje:
KIERUNEK *dp- wskaźnik do zmiennej typu DIR.

stała char * ścieżka- wskaźnik do ciągu znaków zawierającego ścieżkę do katalogu, katalogi oddzielane są ukośnikiem

Zwracane wartości:
FR_OK (0)- zwracany, jeśli funkcja się powiedzie
FR_NO_PATH- nie mogłem znaleźć ścieżki
FR_NOT_GOTOWY- nie udało się zainicjować dysku
FR_DISK_ERR- błąd dysku
FR_NOT_ENABLED- dysk nie został zamontowany

//deklaruj zmienne FATFS fs; DIR reż.; //zamontuj dysk pf_mount(&fs); //otwórz katalog pf_opendir(&dir, "MÓJ_FOLDER");

FRESULT pf_readdir(DIR* dp, FILINFO* fno)- funkcja umożliwiająca odczytanie zawartości katalogu. Aby to zrobić, musisz otworzyć katalog za pomocą funkcji pf_opendir() i wywołać pf_readdir(). Przy każdym wywołaniu funkcja zwróci nazwę obiektu (folderu/pliku) znajdującego się we wskazanym katalogu. Podczas iteracji po wszystkich obiektach zwróci ciąg pusty w elemencie tablicy fno.fname.
Aby funkcja działała należy dokonać zapisu w pliku pffconf.h
#definiuj_USE_DIR 1

Opcje:
KIERUNEK *dp- wskaźnik do zmiennej typu DIR, którą należy wcześniej zadeklarować

FILINFO *fno- wskaźnik do zmiennej typu FILINFO, którą należy wcześniej zadeklarować.

Zwracane wartości:
FR_OK- pomyślne zakończenie funkcji
FR_DISK_ERR- błąd dysku
FR_NOT_OTWARTE- katalog nie jest otwarty

FATFS fs; FRESULT res; FILINFO fno; DIR reż.; //zamontuj dysk pf_mount(&fs); //otwórz katalog res = pf_opendir(&dir, MÓJ_FOLDER); //przeczytaj zawartość katalogu for(;;)( res = pf_readdir(&dir, &fno); //sprawdź, czy podczas odczytu nie wystąpiły jakieś błędy //i czy we wskazanym katalogu znajdują się jakieś inne pliki if ((res != FR_OK) || ( fno.fname == 0))( break; ) //wyjście w wygodny sposób fno.fname usart_sendStr(fno.name); usart_sendStr(/r); )

Na koniec zostawię tutaj wersję roboczą

  • Andreas mówi:

    Montaż adaptera Memory Stick własnymi rękami nie jest trudny, jeśli znasz przeznaczenie pinów funkcjonalnych konkretnej karty pamięci. Zwykle nazywany pinoutem karty pamięci lub na przykład mikroukładem, chipem itp. Ogólnie technologia jest prosta. Układ karty pamięci MMC (MultiMedia Card) został wycięty z PCB. Na płytce stykowej wycięto 7 ścieżek (MMC ma 7 pinów). Następnie zgodnie z układem pinów pokazanym na poniższym rysunku, ścieżki wlutowuje się w piny karty pamięci SD (posiada 9 pinów, z czego 2 są niewykorzystane), microSD (posiada 8 pinów, z czego 2 również nie są używany, ale należy pamiętać, że karta pamięci microSD nie ma wyjścia Vcc) lub microM2 (układ pinów microM2 w powiązanym temacie Adapter Memory Stick Micro M2). To wszystko. Adapter Memory Stick jest gotowy.

    P.S. Na stanie posiadamy karty pamięci MMC o pojemności 1 i 2 GB. Koszt wynosi odpowiednio 285 i 360 rubli. Dostawa jest wliczona w podaną cenę.

    Można też tanio kupić następujące rozmiary kart pamięci:
    - Memory Stick i Memory Stick M2;
    - Bezpieczny cyfrowy (SD);
    -Mini SD;
    -Micro SD (TF);
    - Kompaktowa lampa błyskowa;
    -XD;
    - Pamięci flash USB o różnych konstrukcjach i pojemnościach.
    Na przykład te:

  • Sława mówi:

    Nawiasem mówiąc, nie jestem zbyt jasny w tych pismach. Na tej stronie nie można pobrać utworów z MicroCD do MMC, będę bardzo wdzięczny.

  • Andreas mówi:

    Tak będzie wyglądać adapter microSD do MMC:

  • Sława mówi:
  • Nowość na stronie

    >

    Najbardziej popularny