KwikStik z Kinetis K40 oraz akcelerometr 3D LIS35DE – przykład aplikacji
Obsługa akcelerometru LIS35DE
Komunikacja z układem LIS35DE polega na odczycie i zapisie jego rejestrów przez interfejs SPI. Zapis polega na wysłaniu bajtu zawierającego adres rejestru w sześciu młodszych bitach, opcjonalnie można ustawić szósty (licząc od zera) bit, co włącza autoinkrementację adresu. Po tym bajcie zapisujemy bajt lub bajty z danymi. Zapis przebiega analogicznie, tylko w pierwszym bajcie ustawiamy najstarszy bit, w kolejnym lub kolejnych bajtach odczytujemy dane z rejestrów. Operacje te są wykonywane przez funkcje LIS35_ReadRegister i LIS35_WriteRegister.
Przed odczytem danych z akcelerometru należy go zainicjalizować, do tego służy funkcja InitializeLIS35.
InitializeLIS35. char InitializeLIS35(void) { char RegVal, LIS35Settings; //Reset LIS35 configuration LIS35_RebootMemory(); //Power up LIS35Settings = LIS35_REG_CR1_XEN | LIS35_REG_CR1_YEN | LIS35_REG_CR1_ZEN | LIS35_REG_CR1_ACTIVE; LIS35_WriteRegister(LIS35_REG_CR1, LIS35Settings); LIS35_ReadRegister(LIS35_REG_CR1, &RegVal); //Check whether power up is set if (RegVal == LIS35Settings) return LIS35_OK; return LIS35_ERROR; }
Funkcja najpierw zeruje układ (LIS35_RebootMemory ustawia bit BOOT w rejestrze CR2), następnie w rejestrze CR1 ustawia bity XEN, YEN, ZEN (odblokowanie wszystkich trzech akcelerometrów) i ACTIVE (przełączenie układu w tryb active). Na koniec sprawdzane jest, czy rejestr CR1 zawiera zamierzone wartości.
Do odczytania pomiarów służy funkcja LIS35_GetPosition, która zapisuje pod adresami przekazanymi jako parametry wartości rejestrów XOUT, YOUT i ZOUT.
void LIS35_GetPosition(signed char * x, signed char * y, signed char * z) { char buf[6]; buf[0] = LIS35_READ|LIS35_ADDR_INC|LIS35_REG_OUTX; buf[1] = 0; buf[2] = 0; buf[3] = 0; buf[4] = 0; buf[5] = 0; SPI_Transmit(buf, 6); *x = buf[1]; *y = buf[3]; *z = buf[5]; }
Funkcja main w pętli odczytuje te pomiary i przy pomocy prostej funkcji DrawBar rysuje trzy paski obrazujące odczytane wartości.