Wróciłem ostatnio do jednego ze swoich projektów na Xmega128A3U. Postanowiłem dodać do niego funkcję związaną z zapisem danych na karcie microSD. Hardware był już do tego przygotowany - na płytce znajduje się gniazdko, podłączone do SPI na PORTE.
Przekopiowałem pliki związane z biblioteką FatFS z mojego innego projektu (na PIC24), modyfikując jedynie niskopoziomowe funkcje, odpowiedzialne za komunikację z kartą i konfigurując odpowiednie linie sygnałowe. W pętli głównej dodałem funkcję odpowiedzialną za zapisywanie danych na karcie. Wszystko się skompilowało i uruchomiło, aż nagle pojawił się problem, którego nie potrafię zdiagnozować...
Za każdym razem, gdy FatFS próbuje rozmawiać z kartą, urządzenie się zawiesza (jakby wpadło w nieskończoną pętlę) i po chwili zostaje zresetowane przez WDT. W moim przypadku problem pojawia się w momencie wykonania f_open().
Problem musi występować raczej gdzieś blisko sprzętu, bo:
- Dokładnie te same pliki źródłowe FatFS działały prawidłowo po skompilowaniu na PIC24, jedyną różnicą były niskopoziomowe funkcje I/O.
- Problem nie występuje, jeśli w slocie nie ma karty i biblioteka nie podejmuje próby komunikacji przez SPI.
Pomyślałem, że pewnie popełniłem jakiś błąd podczas pisania funkcji odpowiedzialnych za komunikację po SPI. Obejrzałem je jeden raz, drugi i trzeci, nie widząc żadnego problemu. Uprzedzając możliwe komentarze - nie, to nie jest wina pętli while, w której sprawdzana jest flaga zajętości po transferze SPI. Sprawdziłem ją wielokrotnie, poza tym po jej zakomentowaniu zawieszenie ciągle występowało.
W akcie desperacji postanowiłem sprawdzić inny sterownik SD, pożyczony z przykładów dołączonych do jednej z książek Tomasza Francuza, podpinając go do FatFS. Projekt się skompilował, a po jego ponownym uruchomieniu... Problem wystąpił ponownie.
Na chwilę obecną nie mam już pomysłów odnośnie tego, co mogło pójść nie tak. Pomyłka w montażu albo konfiguracji mogłaby powodować nieudaną transmisję, ale tutaj mam do czynienia z zawieszeniem układu. Nie jest to też problem ze stosem, bo wolnej pamięci mam pod dostatkiem, a po wyłączeniu WDT restarty ustają, choć oczywiście układ pozostaje zawieszony.