Chciałbym dodać do jednego ze swoich urządzeń funkcję zapisu danych na karcie microSD.
Zależy mi na tym, żeby system sam sobie radził w przypadku włożenia pustej karty, tworzył plik, a potem sukcesywnie zwiększał jego rozmiar. Dlatego też preferuję jednak FatFS, a nie PetitFS (którego zastosowania nie wykluczam, ale jak na razie trzymam go w "rezerwie"). Posiadany hardware to Atmega644. Karta będzie musiała pracować na jednej magistrali z układem ENC28J60.
Wprowadziłem już pewne poprawki do oryginalnych procedur.
Plik mmc_arv.c:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać zmiany są stosunkowo niewielkie. W funkcjach power_on() i power_off() powyrzucałem fragmenty kodu odpowiedzialne za włączanie/wyłaczanie i konfigurację magistrali SPI. Ponieważ karta działa na jednej magistrali z ENC28J60, ta część będzie realizowana w innej części programu.
W disk_initialize() zmieniłem jedynie miejsce wywołania makra FCLK_FAST(), aby bez względu na wynik operacji przywracana była szybkość FCPU/2, z którą ma pracować ENC.
W disk_timerproc() usunąłem instrukcję sprawdzającą ustawienie blokady przed zapisem, ponieważ microSD i tak takowej nie posiada.
Program się kompiluje, ale jeszcze nie udało mi się go jeszcze przetestować. Chciałbym tutaj prosić o pomoc, bo z tego co widzę, to:
1) Testowy kod z przykładu jest po prostu koszmarny. Służy on do testowania jakichś niskopoziomowych procedur przez UART, ale nie pokazuje jak to powinno wyglądać w TYPOWEJ aplikacji...
2) W Internecie jest sporo przykładów opartych na starszej wersji biblioteki, ale najwyraźniej od tamtego czasu sporo się zmieniło. Na przykład w chwili obecnej funkcja f_mount() przyjmuje trzy parametry, a nie dwa, tak jak kiedyś...
3) Widzę sporo sprzeczności. Na przykład w niektórych przykładach z sieci na początku funkcji main wywoływana jest funkcja disk_initialize(0). Tymczasem dokumentacja na stronie dość jasno podaje, że: "Application program MUST NOT call this function, or FAT structure on the volume can be broken. To re-initialize the file system, use f_mount function instead."
4) Niestety nie jestem w stanie samemu rozgryźć do końca całego kodu tej biblioteki, śledząc do linijka po linijce...
Czy ktoś może dysponuje już rozpracowaną wersją tej biblioteki, z jakimś dobrym przykładem aplikacji datalogera?