STM32Butterfly: współpraca z 3-osiowym czujnikiem przyspieszenia MEMS (LIS35D)
W artykule przedstawiamy efektowną aplikację pozwalającą zapoznać się z akcelerometrem LIS35DE firmy STMicroelectronics, który mierzy przyspieszenie wzdłuż trzech osi. Aplikacja jest przygotowana dla zestawu uruchomieniowego STM32Butterfly2 (z mikrokontrolerem STM32F107), modułu KAmodTFT2 oraz modułu KAmodMEMS2, który jest wyposażony w układ LIS35DE. Sposób dołączenia modułów do zestawu uruchomieniowego opisano w pliku main.c.
Obsługa wyświetlacza
Wyświetlacz modułu KAmodTFT2 jest wyposażony w kontroler PCF8833. Komunikacja z kontrolerem odbywa się przez interfejs szeregowy SPI. Niestety ramka danych ma 9 bitów, co uniemożliwia wykorzystanie sprzętowego interfejsu SPI wbudowanego w mikrokontroler STM32 (tu do wyboru jest wyłacznie 8 lub 16 bitów). Wpływa to negatywnie na wydajność, ale do naszej aplikacji w zupełności wystarczy.
Obsługa akcelerometru
Układ LIS35DE jest wyposażony w interfejsy I2C i SPI, linie tych interfejsów w module KAmodMEMS2 zostały wyprowadzone na wygodne w użyciu złącza. W aplikacji wykorzystałem interfejs SPI. Odczyt rejestrów układu polega na wysłaniu w pierwszym bajcie:
- bitu 0 o wartości 1 (odczyt),
- bitu 1 o wartości 0 lub 1 (dla wartości 1 adres rejestru będzie automatycznie inkrementowany)
- bitów 2..7 zawierających adres rejestru
Następnie należy odczytać zawartości rejestrów. Zapis przebiega analogicznie z tą różnicą, że bajt 0 ma mieć wartość 0. Poniżej przedstawiam funkcje realizujące zapis i odczyt rejestrów.
#define LIS35_WRITE 0 #define LIS35_READ 0x80 #define LIS35_ADDR_NO_INC 0 #define LIS35_ADDR_INC 0x40 ... void LIS35_ReadRegister(char addr,char * v) { SPI_CS_Enable(); SPI_Transmit(LIS35_READ|LIS35_ADDR_NO_INC|addr); *v=SPI_Receive(); SPI_CS_Disable(); } void LIS35_WriteRegister(char addr,char v) { SPI_CS_Enable(); SPI_Transmit(LIS35_WRITE|LIS35_ADDR_NO_INC|addr); SPI_Transmit(v); SPI_CS_Disable(); }
Po dołączeniu zasilania akcelerometr jest w stanie power-down, funkcja inicjalizująca przełącza układ w tryb active przez ustawienie bitu PD w rejestrze CTRL_REG1 oraz odblokowuje wszystkie trzy osie akcelerometru przez ustawienie bitów ZEN, YEN i XEN w tym samym rejestrze.
char InitializeLIS35(void) { char RegVal, LIS35Settings; //Reset LIS35 configuration LIS35_RebootMemory(); LIS35_ReadRegister(LIS35_REG_CR1, &RegVal); //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; }