Rejestracja danych na kartach flash -

Mam problem z rejestracją strumienia danych na karcie flash.

Chcę na bieżąco zapisywać strumień danych w dużej pamięci nieulotnej (logowanie danych pomiarowych). Maksymalnie ma to być 100kB/s (niby niedużo :)). Użyłem karty mikro SD (zwykłe uSD, Kingston, 1GB), z którą komunikuję się przez SPI (wiadomo, bo najprościej dla mikrokontrolera). Jednak ta sztuka mi się nie udaje - układ gubi dane. Zrobiłem kilka analiz szybkościowych i już wiem dlaczego. Zastosowana przeze mnie karta uSD w testach może zapisywać dane ze średnią prędkością dochodzącą do 130kB/s, niby OK, ale cały problem tkwi w czasie zapisu sektora w pamięci flash. Dla wspomnianej karty jest to max. _139ms_!!! (najszybciej sektor zaprogramował się w 2,6ms - zadziwiający rozrzut...). Kupiłem inną (jakiś no-name uSD, też 1GB) i tu nieco lepiej: bo min.

2,1ms, ale max. 86ms! W desperacji przetestowałem jeszcze 2 bardzo stare (ok. 4-5 lat) karty MMC (32MB i 128MB) - wyniki: min. czas zapisu sektora: 2,8ms., a max.: 6,6ms. Czyli stare MMC jest dużo lepsze i ma znacznie mniejszy rozrzut czasów (ale nie chciałbym ich stosować, bo chyba powoli wymierają - znikają z ofert sklepowych). Zbadałem jeszcze kartę CF (standardowa 1GB, Pretec) i tu podobnie: min. czas zapisu sektora: 1,35ms, ale max. 153ms.(!) Ten rozrzut czasów rozkłada mi układ. Mogę zbuforować 1, max.2 sektory (mikrokontroler TMS320LF2406A bez zewnętrznej pamięci), mam 2 karty uSD w systemie, żeby do nich zapisywać naprzemiennie, ale to wszystko za mało wobec czasu zapisu sektora rzędu >100ms.

Zanim zainwestuję w nowoczesne odmiany kart klasy uSD Ultra, SD2.0, czy SDHC, albo CF -Ultra/Extreme/x333 itp. chciałbym się zapytać bardziej doświadczonych kolegów, czy to ma szansę powodzenia i czy uzyskam max. czas zapisu sektora nie większy niż 5...10ms?

Gdzie te 3, 5, czy 15MB/s, które widzę w parametrach kart? Czy to kwestia interfejsu SPI? (chyba nie, bo CF dawała podobne wyniki)

Może puścić się w równoległe flash'e? Mogłoby być szybciej, ale potrzebuję min. 320MB - tu problem, gdzie kupić tak duże kostki? (dlatego wybrałem karty flash)

Sorki, za przydługi tekst, ale chciałem opisać problem. Pozdrawiam, Qmexx.

Reply to
Qmexx
Loading thread data ...

formatting link
nie moja aukcja, zwroc uwage na zasilanie - ten akurat moze pracowac tylko na 3.3V

Reply to
PAndy

PAndy pisze:

Hmm... Microdrive... 3,3V, to nie problem, bo tak jest zasilany układ, problem będzie z 420mA prądu (rejestrator może posiadać do 8 kanałów pomiarowych, więc 420mA x 8... uuuu...) :), no i wolałbym szeregową (nieduży mikrokontroler). Zapis do CompactFlash'a testowałem z czystej ciekawości na innym układzie. Karty flashowe typu uSD wydawały się idealne, ale te czasy...

No i układ będzie narażony na wibracje, więc napęd mechaniczny chyba odpada (a microdrive'y są mechaniczne, jak sądzę).

Ale dzięki za sugestię!

Reply to
Qmexx

no to jest jakis argument ale doczytalem tego warunku w opisie...

no to poszukaj kart z buforem w RAM - pakujesz dane szeregowo a karta przepisuje je juz sama (tak pewnie zrobione sa ultraszybkie karty - wiele rownoleglych kanalow zapisu)

typowe wibracje im nie straszne

Reply to
PAndy

Karty firmy Kingston tak mają. Co któryś sektor zapisuje się bardzo długo. Co ciekawe dzieje się tak dopiero od pewnego miejsca. Sektory o bardzo małych numerach zawsze zapisują się szybko. W przypadku kart np. firmy Sandisk nie zaobserwowałem takiego zjawiska.

Mam urządzenia, które migają diodą LED po zapisaniu porcji danych. Dla kart firmy Sandisk migania są bardzo regularne. Dla kart Kingston na początku karty są bardzo szybkie potem skokowo robią się wolniejsze i pojawiają się w nich nieregularności.

Paweł

Reply to
Paweł

W artykule <g8ltge$c35$ snipped-for-privacy@news.task.gda.pl> Qmexx napisalu:

Może bufor w pamięci FRAM Ramtrona - interfejs SPI; 32kB powinno wystarczyć.

Czy zapisujesz kolejne sektory czy 'skaczesz' z zapisami po pamięci? Zapisywanie strumienia do kolejnych sektorów powinno być IMO korzystniejsze (mniejsza szansa na osobliwie długie czasy zapisu), bo wear-levelling ma mniej roboty.

A, można jeszcze poeksperymentować z kasowaniem wstępnym sektorów (masz 2 pamięci, więc na przemian).

Coś na temat szybkości zapisu jest w

formatting link
ć ciekawsze części są akurat "uproszczone".

Reply to
JS

JS pisze:

Już o tym myślałem... Ale to kolejny układ na SPI do obsłużenia w czasie rzeczywistym z ciągłymi "przewałkami" z jednego w drugi. Mogę zwyczajnie nie wyrobić się z czasem, bo ten strumień danych nie bierze się znikąd. To procek mierzy, obrabia, oblicza i na dokładkę będzie jeszcze musiał się zając obsługą buforowania. Mam obawy...

Zapisuję "ciurkiem" sektor po sektorze, nie skaczę z zapisami. Robiłem próby z wstępnym kasowaniem całej karty (mam na to czas przed rejestracją). Efektem jest skrócenie czasu zapisu sektora średni o jakieś 0,6ms, ale nie ma to wpływu na pojawiające się czasy maksymalne (też są krótsze o te 0,6ms, ale występują jak występowały).

Pozdrawiam, Qmexx.

Reply to
Qmexx

Paweł pisze:

A to bardzo ciekawe, co piszesz... bardzo ciekawe... chyba zainwestuję jeszcze w Sandiska... :)

Ja to obserwowałem w programie terminalowym, kiedy po każdym zapisie sektora wysyłałem sobie UARTem znak. Na tych moich uSD (Kingston ale i drugi no-name też) licznik znaków odebranych podczas liczenia dostaje okresowej "czkawki", a na MMC (producent PQI) dane lecą równo, co z resztą opisałem zakładając temat (max 6,6ms na MMC wobec 139ms na uSD). Tylko, że pomyślałem o różnicy między rodzajami kart (MMC a uSD), a nie między producentami.

Dzięki wielkie! Bardzo cenna jest dla mnie ta informacja, że na Kingstonach leci nierówno!

Pozdrawiam, Qmexx.

Reply to
Qmexx

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.