logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] STM32 + CubeMX + LIS3DHH - brak odbioru danych przez SPI

przemof-s 14 Lut 2019 01:50 849 5
REKLAMA
  • #1 17776660
    przemof-s
    Poziom 10  
    Posty: 19
    Ocena: 10
    Witam,
    próbuję uruchomić akcelerometr LIS3DHH ( https://www.st.com/en/mems-and-sensors/lis3dhh.html ) na zestawie Nucleo F411RE ( https://www.st.com/en/evaluation-tools/nucleo-f411re.html ). Czujnik mam w postaci adaptera STEVAL-MKI180V1 ( https://www.st.com/en/evaluation-tools/steval-mki180v1.html ). Konfigurację dla mikrokontrolera generuję za pomocą CubeMX 5.0.1 z bibliotekami HAL dla rodziny STM32F4, w wersji 1.23.0. Próbę uruchomienia czujnika rozpocząłem od wykorzystania bibliotek: https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/lis3dhh_STdC a dokładnie od przykładu: read_data_simple.c.

    Po dużej liczbie nieudanych prób komunikacji, maksymalnie uprościłem przykład. Aktualnie próbuję odczytać wartość rejestru WHO_AM_I. Adres rejestru to: 0x0F. Podczas odczytu danych, bit SMB adresu powinien mieć wartość 1, więc modyfikuję adres rejestru do wartości 0x8F.
    Wartość rejestru WHO_AM_I powinna wynosić 0x11, a ja otrzymuję wartość 0x00.

    Wszystkie linie SPI są sprzętowo podciągnięte do plusa zasilania, za pomocą wewnętrznych rezystorów mikrokontrolera. Korzystam z SPI2. Jego konfiguracja to: CPOL = High, CPHA = 2 Edge, prędkość: 1.3125 Mbits/s. Sygnał CS jest generowany programowo.

    Poniżej przedstawiam fragment kodu źródłowego odpowiedzialnego za inicjalizację SPI oraz próbę odczytania rejestru WHO_AM_I.

    Inicjalizacja SPI:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Próba odczytu zawartości rejestru WHO_AM_I (zawarte w funkcji main):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poniżej przedstawiam przebiegi uzyskane z analizatora stanów logicznych:
    STM32 + CubeMX + LIS3DHH - brak odbioru danych przez SPI





    W załączniku przesyłam plik konfiguracyjny dla CubeMX oraz kod źródłowy programu testowego.
    Dodam, że testy przeprowadzałem na dwóch czujnikach, oraz dodatkowo na zestawie z mikrokontrolerem STM32F103 (blue PCB). Modyfikowałem na wiele sposobów konfigurację SPI oraz odczyt rejestrów. Efekt za każdym razem taki sam.

    Czy ktoś ma pomysł co robię nie tak, że za każdym razem otrzymuję wartość zero z rejestru WHO_AM_I?
    Załączniki:
    • Test_LIS3DHH_F4.zip (582.08 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 17776851
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 17777338
    przemof-s
    Poziom 10  
    Posty: 19
    Ocena: 10
    Jakbym go znalazł to bym ściągnął. Jedyne co znalazłem do czujnika LIS3DHH to biblioteki, do których link podałem w pierwszym poście. Jeżeli taki przykład istnieje będę wdzięczny za namiar na niego.
  • REKLAMA
  • #4 17777417
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 17777710
    przemof-s
    Poziom 10  
    Posty: 19
    Ocena: 10
    Jak pisałem w pierwszym poście; wykorzystałem z linku, który wstawiłem przykład o nazwie "read_data_simple.c". Niestety nie działa. Korzystałem już wcześniej z linku do X-CUBE-MEMS1 z innymi czujnikami. Nie ma tam czujnika LIS3DHH, który próbuję uruchomić, a komunikacja z innymi czujnikami, mającymi inne rejestry działała prawidłowo.

    Spróbuję jeszcze uruchomić na Nucleo komunikację po SPI z innym czujnikiem lub uruchomić czujnik LIS3DHH na Arduino. Zależnie od wyniku będzie można oszacować czy problem jest po stronie mikrokontrolera czy czujnika.
  • #6 18138298
    przemof-s
    Poziom 10  
    Posty: 19
    Ocena: 10
    Okazało się, że czujnik z niewiadomych powodów na pierwszą próbę odczytu rejestru WHO_AM_I odpowiada wartością 0x00. Jednak na powtórzone zapytanie odpowiada już prawidłowo i dalsza komunikacja przebiega poprawnie.
REKLAMA