[PROJEKT] KA-NUCLEO-F411CE i Waveshare Accessory Shield – obsługa diody RGB i sterownika P9813

Programowanie funkcji obsługi sterownika

Włączenie zasilania diody LED RGB

Pierwszym etapem prac nad oprogramowaniem będzie ustawienie stanu wysokiego wyjścia oznaczonego jako ON_Pin (PA6). Spowoduje to włączenie zasilania +5 V, które zasili diodę LED. W tym celu dodajemy instrukcję:

Wprowadzamy ją w bloku:

Blok ten znajduje się w funkcji main przed pętlą nieskończoną while.

Modyfikacja częstotliwości występowania przerwania SysTick

Aby mieć możliwość generowania sygnału zegarowego o okresie 70 us, musimy wprowadzić modyfikację występowania przerwania timera systemowego SysTick. Dokonujemy tego dopisując funkcję konfiguracyjną w postaci:

Dodajemy ją w bloku:

Dodatkowo powinniśmy dodać jej prototyp w sekcji:

W tej sekcji będziemy dodawali również prototypy do kolejnych pisanych przez nas funkcji.

Aby wszystko działało poprawnie, wywołujemy funkcję przed pętlą główną funkcji main:

Generowanie sygnału zegarowego dla sterownika P9813

Zgodnie z interfejsem opisanym w dokumentacji sterownika, jak i wcześniejszymi założeniami, wygenerujemy sygnał prostokątny będący sygnałem zegarowym. Zostanie on wygenerowany na pinie oznaczonym przez nas jako CIN (PB4). W tym celu zdefiniujemy funkcję DelayClockTime. Jej argumentem jest czas w mikrosekundach. Aby czas oczekiwania wynosił dokładnie 35 us, należy od podanego czasu odjąć 3 us. Następnie program przechodzi do pętli while, w której pozostaje do momentu kiedy zmienna delayUsCounter osiągnie zadaną wartość.

Zmienna delayUsCounter została zdefiniowana na samym początku pliku stm32f4xx_it.c w bloku:

oraz w pliku main.c:

Parametr extern oznacza, że zmienna została zdefiniowana w innym pliku, ale definicja umożliwia korzystanie z niej w pliku main.c.

Inkrementacja wartości zmiennej odbywa się w funkcji przerwania SysTick:

Aby wygodnie generować sygnał zegarowy, zdefiniowana została funkcja P9813_CLK():

Umożliwia ona generowanie jednego okresu sygnału prostokątnego o czasie trwania 70 us.

Wysyłanie bajtu danych do sterownika P9813

Kolejną funkcją, którą zdefiniujemy i która jest niezbędna do pracy z układem P9813, jest funkcja przesyłająca jeden bajt danych. Będzie ona korzystać z wcześniej zdefiniowanej funkcji P9813_CLK(). Jej kod przedstawia się następująco:

Jej argumentem jest bajt, który zostanie wysłany do układu sterownika. Cała procedura ma za zadanie ustawić stan na wyjściu opisanym jako DIN, a następnie wygenerować pełen okres sygnału zegarowego dla sterownika P9813. Dane przesyłane są w kolejności od najstarszego do najmłodszego bitu. W tym celu została wykorzystana pętla for, która wykona się 8 razy (8 bitów w bajcie). Na początku pętli, wykonywana jest instrukcja sprawdzająca najstarszy bit zmiennej _BYTE_TO_SEND, a następnie w zależności od tego czy jest to 1 czy 0, ustawiany jest stan wysoki na wyjściu DIN. Po każdorazowym ustawieniu bitu następuje wykonanie funkcji P9813_CLK(). Jako ostatnia instrukcja w pętli wykonywana jest operacja przesunięcia bitowego z nadpisaniem o jeden bit w lewo. Dzięki takiemu zabiegowi sprawdzanie kolejnych bitów odbywa się za pomocą jednej i tej samej maski 0x80 (0b10000000).

Wysyłanie prefiksu do sterownika P9813

Zgodnie z protokołem komunikacyjnym, konieczne jest wysłanie do sterownika prefiksu będącego pierwszą częścią ramki danych. W tym celu została utworzona funkcja P9813_SendPrefix. Została ona przeciążona trzema argumentami o kolorze, jaki zostaje wysłany do sterownika diody LED RGB.

Zmienna wewnętrzna o nazwie prefixToSend zawiera kompletny prefix gotowy do wysłania. Na początku zmienna ta jest zerowana oraz zostają w niej zapisane dwa najstarsze bity o wartości „1” – 0xC0 (0b11000000). Następnie sprawdzane są dwa najstarsze bity każdego z podanych kolorów i ich negacja jest zapisana do zmiennej. Kolory zapisywane są w notacji BGR, zgodnie z opisanym w dokumentacji protokołem. Na końcu tak przygotowany prefix wysyłany jest do układu za pomocą wcześniej przygotowanej funkcji do przesyłania bajtu danych.

Wysyłanie ramki danych o kolorze do sterownika P9813

Ostatnia zdefiniowana funkcja przesyła kompletną ramkę danych do sterownika P9813 i umożliwia wyświetlenie danego koloru na diodzie LED RGB.

Zgodnie z protokołem wysyłane są 32 bity o wartości „0” oznaczające początek transmisji, następnie wysyłany jest prefix, a po nim trzy bajty opisujące natężenie koloru o wartości od 0…255 dla każdej z diod. Kolory również są wysyłane w notacji BGR.

Do pobrania

O autorze