STM32Butterfly2: sterowanie LED RGB za pomocą wyspecjalizowanego sterownika PCA9633

W dużej liczbie realizowanych projektów niezbędne jest zapewnienie komunikacji z elementami zewnętrznymi, w tym celu stosowane są różne standardy. Poniższy projekt przedstawia użycie jednego ze stosowanych standardów w komunikacji – magistrali I2C. Do tego celu wykorzystano moduł KAmodRGB, którego sercem jest czterokanałowy sterownik diod LED firmy NXP – PCA9633. Powyższy sterownik na płytce steruje diodami LED: jednokolorową oraz zintegrowaną diodą RGB.

Działanie przedstawionej aplikacji polega na zwiększaniu, poprzez odchylenie joysticka w odpowiednim kierunku, jasności świecenia diody LED podłączonej do danego kanału. Dłuższe przytrzymanie joysticka w jednej pozycji spowoduje powtórzenie czynności. Natomiast wciśnięcie joysticka prowadzi do zgaszenia wszystkich diod LED. W przykładzie wykorzystano gotowy moduł z układem PCA9633 i LED-RGB – KAmodRGB (fotografia 1), którego schemat pokazano na rysunku 2.

 

Fot. 1. Wygląd modułu KAmodRGB

Fot. 1. Wygląd modułu KAmodRGB

 

Rys. 2. Schemat elektryczny modułu KAmodRGB

Rys. 2. Schemat elektryczny modułu KAmodRGB

 

Projekt został przygotowany dla zestawów STM32Butterfly2 oraz STM32Butterfly. Ze względu na różnice w podłączonych liniach do joysticka projekt wymaga oddzielnej kompilacji. Sprowadza się to do wywołania kompilacji z argumentem BOARD=1, w przypadku wykorzystania zestawu STM32Butterfly.

Zestaw uruchomieniowy STM32Butterfly2 i STM32Butterfly wyposażono w złącze dedykowane do komunikacji w standardzie I2C, identyczne złącze występuje w module KAmodRGB. W związku z powyższym połączenie zestawu ewaluacyjnego z modułem ogranicza się do połączenia wykonanego 1:1 obu złącz I2C, do tego celu można zastosować przewód połączeniowy CAB_HU04-30. W przypadku stosowaniu przewodów pojedynczych połączenia wykonujemy zgodnie z rysunkiem 3.

 

Rys. 3. Schemat połączeń pomiędzy STM32Butterfly2 i KAmodRGB (można je wykonać za pomocą kabla CAB_HU04-30 z oferty KAMAMI.pl)

Rys. 3. Schemat połączeń pomiędzy STM32Butterfly2 i KAmodRGB (można je wykonać za pomocą kabla CAB_HU04-30 z oferty KAMAMI.pl)

 

Poniżej przedstawiono listing głównej części programu sterującego pracą mikrokontrolera.

 

Na początku programu realizowana jest inicjalizacja linii wykorzystywanych przez joystick. Odbywa się to poprzez włączenie zegara dla używanego portu GPIO, skonfigurowanie linii jako wejść i podciągnięciu ich do potencjału dodatniego. Za konfiguracje linii jako wyjścia odpowiada funkcja io_config_ext, która jako pierwszy parametr przyjmuje nazwę portu, jako drugi wartość określającą, które linie podlegają konfiguracji, natomiast trzeci i czwarty parametr określa tryb działania. Z kolei funkcja io_set_clr_mask powoduje podciągnięcie linii do VCC, funkcja do działania wymaga podania trzech parametrów. Pierwszy parametr funkcji określa port, drugi parametr określa, które linie zostają ustawione, a które wyzerowane, natomiast trzeci parametr jest maską blokującą zmianę stanu pozostałych linii.

W kolejnym kroku inicjalizowany jest licznik SysTick, realizuje to funkcja time_init(). Inicjalizacja polega na zapisaniu do odpowiedniego rejestru wartości określającej częstotliwość występowania przerwania od licznika SysTick, ustawieniu priorytetu przerwania oraz włączeniu licznika.

Następnie przeprowadzana jest inicjalizacja sprzętowego kontrolera magistrali I2C. Odpowiada za to funkcja i2cm_init, przyjmuje ona parametr, który określa częstotliwość taktowania wysyłanych danych. Listing funkcji inicjalizującej został przedstawiony poniżej.

 

W pierwszym kroku funkcji włączany jest zegar portu GPIO, w którym występują linie używane do transmisji. Następnie przeprowadzana jest konfiguracja linii jako alternatywne z otwartym drenem i podciągnięte do VCC. Funkcje użyte do tej konfiguracji są identyczne jak przy konfiguracji linii podłączonych do joysticka, opisanej powyżej. Kolejną czynnością jest włączenie zegara dla pierwszego kontrolera I2C. Włączenie zegara odbywa się poprzez ustawienie odpowiedniego bitu w rejestrze APB1ENR.

W kolejnym etapie następuje włączenie kontrolera I2C oraz jego zresetowanie. Czynność włączenia realizowana jest poprzez zapis bitu CR1_PE_SET, natomiast reset odbywa się poprzez udstawienie i wyzerowanie bitu CR1_SWRST, które oddzielone jest operacją nop(). Powyższe operacje wykonywane są na rejestrze I2C_CR1.

Następnie ustawiana jest częstotliwość kontrolera, wartość ta zapisana jest jako sześć najmłodszych bitów rejestru I2C_CR2. W celu zachowania stanu pozostałych bitu rejestru bez zmian rejestr najpierw jest odczytywany, następnie zerowane są najmłodsze bity, po czym na podstawie częstotliwości taktowania magistrali APB obliczana jest zapisywana wartość.

W następnym kroku ustawiana jest szybkość wysyłania danych, odpowiada za to funkcja i2cm_set_speed, która jako parametr przyjmuje częstotliwość transmisji. Do ustawienia powyższego parametru została wydzielona odrębna funkcja gdyż wymagane jest zachowanie odpowiedniej kolejności działania.

Kolejnym krokiem jest konfiguracja rejestru I2C_CR2, odbywa się to poprzez działanie na kopi zawartości. Na początku zerowana jest część bitów, po czym odbywa się ustawianie bitu ACK. Po wprowadzaniu zmian kopia zapisywana jest do rejestru.

Następnie poprzez zapis do rejestru I2C_OAR1 ustawiany jest adres urządzenia oraz zerowane rejestry I2C_SR1 i I2C_SR2 informujące o statusie kontrolera I2C. Na zakończenie przeprowadzana jest konfiguracja priorytetu przerwań i następuje ich włączenie.

Po przeprowadzeniu inicjalizacji kontrolera I2C, w programie głównym realizowana jest inicjalizacja sterownika diod LED. Odpowiada za to funkcja rgb_init(), jej listing został przedstawiony poniżej.

 

Na początku funkcji mamy deklarację zmiennych. Następnie odbywa się wysyłanie danych, w przypadku błędu wysyłania pierwszego zbioru danych funkcja jest przerywana i zwraca błąd. Jeśli błąd nie wystąpił po wystąpieniu opóźnienia wysyłany jest drugi zbiór danych, po zakończeniu funkcja zwraca wynika działania, który informuje czy inicjalizacja została przeprowadzona bezbłędnie.

Funkcja i2cm_transfer_7bit służąca do transmisji danych przyjmuje pięć parametrów: pierwszy parametr określa adres urządzenia docelowego, drugi parametr określa bufor danych do wysłania, trzeci parametr określa długość wysyłanych danych, czwarty parametr wskazuje na bufor odbieranych danych, ostatni parametr określa liczbę danych do odebrania. W przypadku nie stosowania któregoś z buforów powinna pojawić się wartość NULL, natomiast w miejsce określające długość danych wartość 0.

Po przeprowadzeniu inicjalizacji układu PCA9633 sprawdzany jest warunek czy inicjalizacja została przeprowadzona pomyślnie. W przypadku wystąpienia błędu program przechodzi do nieskończonej pętli blokując działanie. Jeśli inicjalizacja przeprowadzona została poprawnie inicjalizowane są cztery zmienne określające jasność świecenia poszczególnych diod, a następnie program przechodzi do nieskończone pętli.

W pętli głównej aplikacji realizowany jest podwójny odczyt stanu joysticka, który oddzielony jest pewnym opóźnieniem. Działanie to ma na celu eliminacje mogących występować drgań styków. W przypadku identycznego odczytu, przed i po opóźnieniu, program przechodzi do aktualizacji zmiennych przechowujących informacje o jasności poszczególnych diod LED. Operacja ta została zrealizowana w oparciu o polecenie case.

Każda aktualizacja zmiennych prowadzi także do wywołania polecenia rgb_set_color(RGBA(r,g,b,a)). Zagnieżdżone polecenie RGBA powoduje, że cztery zmienne, podane jako parametry zostają przekształcone do jednej zmiennej, w której każde kolejne osiem bitów jest wartością kolejnej zmiennej. Natomiast funkcja rgb_set_color ogranicza się do zapisania podanej wartości do bufora oraz wysłaniu jej do sterownika PCA9633.

Autor projektu: Lucjan Bryndza
Redakcja i przygotowanie: Mariusz Dziębowski

Do pobrania

Autor: