STM32Butterfly2: obsługa kart SD w trybie SPI

Poniżej przedstawiono program główny.

 

W pierwszym kroku programu głównego znajduje się funkcja realizująca inicjalizację licznika SysTick. Operacja ta konfiguruje priorytet przerwania wywoływanego przez licznik, ustawienie częstotliwości występowania przerwania. Po przeprowadzeniu konfiguracji następuje uruchomienie licznika.

W kolejnym kroku inicjalizowany jest wyświetlacz bazujący na sterowniku PCD8544 lub zgodnym (wyświetlacz z telefonu Nokia 3310). Ze względu na fakt, iż złącze SPI jest używane do komunikacji z kartą SD, magistrala SPI do komunikacji z wyświetlaczem jest emulowana programowo. Funkcja nlcd_init() inicjalizująca wyświetlacz konfiguruje linie używane w komunikacji, ustawia na nich odpowiedni stan oraz przeprowadza inicjalizację wyświetlacza poprzez przesłanie do niego listy komend. Na koniec przeprowadzane jest wyczyszczenie ekranu w celu usunięcia „śmieci”, które mogą wystąpić w wyniku nieokreślonego stanu poszczególnych bitów w pamięci wyświetlacza.

Następnie wywoływana jest funkcja register_printf_putc_handler, która tworzy wskaźnik na funkcję wyświetlającą znak na wyświetlaczu. Wskaźnik ten wykorzystywany jest w dalszej części programu przez bibliotekę formatującą tekst i dane wyświetlane na wyświetlaczu.

Przed przejściem do nieskończonej pętli wywoływana jest funkcja card_insert_init(), która konfiguruje linię wykrywającą włożenie karty do gniazda jako wejściową. W nieskończonej pętli for, pierwszym poleceniem jest wyczyszczenie zawartości wyświetlacza. Później wywoływana jest funkcja card_wait4insert(), wymusza ona oczekiwanie na włożenie karty do gniazda. Poniżej przedstawiono listing funkcji.

 

Działanie funkcji card_wait4insert() polega na zapętleniu w pętli do..while, w czasie której odczytywany jest stan linii wykrywającej włożenie karty pamięci do gniazda. Odczyt stanu linii jest wykonywany dwukrotnie, z pewnym opóźnieniem w celu eliminacji drgań styków. Sam odczyt stanu realizowany jest przez funkcję io_get, która jako pierwszy parametr przyjmuje wartość określającą port, natomiast jako drugi parametr podawany jest numer odczytywanej linii. Funkcja kończy działanie gdy jeden z odczytów przyjmie inną wartość niż 0.

Po wykryciu włożenia karty SD do gniazda następuje wyczyszczenie wyświetlacza oraz inicjalizacja karty pamięci, która zwraca kod do zmiennej io_get. Zwrócony kod informuje o rodzaju karty lub o wystąpieniu błędu. Za inicjalizację odpowiada funkcja mmcInit(), w pierwszej części funkcji realizowana jest konfiguracja linii, do których podłączone jest gniazdo kart pamięci oraz włączenie zegarów portów używanych w transmisji oraz SPI, konfiguracja odbywa się przez wywołanie funkcji mmcHwInit(), której listing przedstawiono poniżej.

 

Do pobrania

O autorze