STM32Butterfly2: sterowanie LED RGB za pomocą wyspecjalizowanego sterownika PCA9633
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.
static int rgb_init(void) { static const uint8_t r8[] = { 8, 255 }; static const uint8_t r0_r1[] = { 0, 0, 0 }; int ret = i2cm_transfer_7bit(RGBCTRL_I2CADDR, r0_r1, sizeof(r0_r1), NULL, 0); if( ret < 0) return ret; wait_ms(1); ret = i2cm_transfer_7bit(RGBCTRL_I2CADDR, r8,sizeof(r8), NULL, 0); return ret; }
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.