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

[Atmega32][C] - komunikacja z akcelerometrem LIS3DH po SPI

Fifa_X 05 Sie 2017 22:20 1380 21
REKLAMA
  • #1 16627006
    Fifa_X
    Poziom 7  
    Cześć!

    Zabrałem się za projekt którego celem jest zbieranie danych o przyśpieszeniu z akcelerometru LIS3DH i wyświetlenie ich na wyświetlaczu LCD/ Napotkałem jednak problem z komunikacją pomiędzy moim mikrokontrolerem a LIS'em poprzez SPI. Napisany kod wydaje mi się poprawny i zgodny z dokumentacją a mimo to nie mogę ruszyć dalej. Problem wygląda następująco, gdy próbuję odczytać rejestr WHO_AM_I z akcelerometru otrzymuję wartość 0 na wyświetlaczu która moim zdaniem jest błędna. Przy próbie odczytania jakiegokolwiek innego rejestru nie dostaję nic.

    Kod mojego programu:

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


    W funkcji SPI_masterinit() inicjuję moją Atmegę jako MASTER układu oraz definiuje odpowiednie piny jako wyjścia. W funkcji spi_transmit() ustawiam wartość pinu CS na 0 co oznacza zgodnie z dokumentacją rozpoczęcie transmisji poprzez SPI. Następnie program oczekuje na flagę potwierdzenia zakończenia transmisji i wtedy CS wskakuje na 1. Wynik wyświetlam za pomocą odpowiedniej biblioteki dla LCD. Rozwiązania szukalem już po utworzonych wątkach jednak niec co by mi pomogło nie znalazłem. Czy ktoś wie w czym może tkwić problem albo co robię nie tak? Poniżej załączam schemat połączenia mojego układu oraz dokumentację do akcelerometru.
    [Atmega32][C] - komunikacja z akcelerometrem LIS3DH po SPI
  • REKLAMA
  • #2 16627070
    excray
    Poziom 41  
    Ustaw PB4 (SS) jako wyjście. Poza tym Twoja komunikacja jest błędna:
    [Atmega32][C] - komunikacja z akcelerometrem LIS3DH po SPI
    Dane się odczytuje dopiero przy transmisji 2-go bajtu.
  • REKLAMA
  • #4 16627476
    Fifa_X
    Poziom 7  
    Ustawiłem pin SS jako wyjście i po wysłaniu komendy wysłałem jeszcze dummy byte jednak dalej nie dostaję żadnej wartości na wyświetlacz ;/
    Czy przy odczytywaniu danych powinienem zmienić wartość pierwszego bitu komendy na 1? Chodzi mi o bit RW z rysunku 6.
  • REKLAMA
  • #5 16627488
    excray
    Poziom 41  
    Po każdej poprawce wklejaj aktualnie używany kod.
  • #6 16627496
    Fifa_X
    Poziom 7  
    Próbowałem zrobić to na dwa sposoby:
    W pierwszym zmodyfikowałem tyko funkcję spi_transmit();

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


    W drugim rozbiłem to na dwie funkcje:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 16627501
    excray
    Poziom 41  
    A gdzie masz inicjalizację SPI? Jak to może działać, skoro nie inicjalizujesz SPI? Poza tym, skoro chcesz odczytać rejestr 0x0F to musisz zaznaczyć to w transmisji - ustawić bit R/!W. Czyli powinieneś wysłać (0x0F | 0x80)
  • REKLAMA
  • #8 16627584
    Konto nie istnieje
    Poziom 1  
  • #9 16628183
    Fifa_X
    Poziom 7  
    SPI jest zainicjowane w funkcji spi_masterinit():

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


    Wyzerowałem flagę i dla sprawdzenia przy wchodzeniu do pierwszej i drugiej pętli "while" dodałem mrugającą diodę. Program wchodzi do pętli nr 1 zapala diodę, gasi jak wyjdzie, tak samo z drugą i wszystko się zgadza tylko pod koniec zamiast wypluć wartość rejestru o który pytam podaje mi wartość 0. Widać że transmisja działa bo odpytuje akcelerometr cały czas.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #10 16628331
    excray
    Poziom 41  
    Załączaj cały kod, a nie jakieś wydzielone kawałki. Chyba, że Ty lepiej wiesz gdzie popełniłeś błąd, tylko po co wtedy cały ten wątek? W inicjalizacji ustaw linię CS. POL i PHA ustaw na 0.
  • #11 16628428
    Fifa_X
    Poziom 7  
    Cały kod wygląda następująco:

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


    Wydaje mi się że mikrokontroler przeprowadza transmisję poprzez SPI, wysyła komendę oraz dummy byte, natomiast nie otrzymuje odpowiedzi od LIS'a w efekcie czego dostaję 0 na wyświetlaczu, pytanie dlaczego tak się dzieje.
  • #12 16628434
    excray
    Poziom 41  
    Z inicjalizacji zupełnie wywal tą linijkę: "SPCR = ~(1 << CPOL) | ~(1 << CPHA); //CPOL i CPHA na 0".
  • #13 16628448
    Fifa_X
    Poziom 7  
    Niestety dalej 0 na wyświetlaczu ;/
  • #14 16628478
    Konto nie istnieje
    Poziom 1  
  • #15 16628527
    Fifa_X
    Poziom 7  
    Tę diodę wrzucilem tylko dla sprawdzenia czy program faktycznie wchodzi w te pętle.
    Nie mam niestety dostępu w domu do oscyloskopu więc tego nie sprawdzę. Przewody mają 20 cm myślę jednak że to nie o to chodzi. podciągnięcie napięcia (pull - up) na wejściu jest ponieważ po sprawdzeniu miernikiem na linii MISO mam ~4,5 V. Od strony akcelerometru nie mam podłączonego napięcia 3Vo bo nie mogę znaleźć w nocie katalogowej jakie napięcia tam podać i co zasila ten pin. Co do AVCC zgoda mój błąd w dokumentacji atmegi pisze że należy podać tam napięcie.

    Edit. Pin 3V0 to wyjście z regulatora napięcia.
  • #16 16628546
    Konto nie istnieje
    Poziom 1  
  • #17 16628569
    Fifa_X
    Poziom 7  
    Zasilanie Vin ( w nocie katalogowej Vdd_IO) podpiąłem do stabilizatora napięcia i mam tam 2,5 V. Reszta pinów jest podpięta tak jak w SPI należy więc MISO -> SDO, MOSI -> SDA, SCK -> SCL, CS -> PA0
  • #18 16628618
    Konto nie istnieje
    Poziom 1  
  • #19 16628630
    Fifa_X
    Poziom 7  
    Schemat jest taki jak w pierwszym poście. Zmierzyłem dokładnie teraz napięcie zasilania i było to 2,9 V. Co do pinów o które pytasz w tym PIN#10 nie mogę go podłączyć nigdzie gdyż ten akcelerometr wygląda tak:
    [Atmega32][C] - komunikacja z akcelerometrem LIS3DH po SPI

    Dokumentacja do niego jest na pewno dobra jako że pobierałem ze strony producenta.
  • #20 16628668
    Konto nie istnieje
    Poziom 1  
  • #21 16628705
    Fifa_X
    Poziom 7  
    Wybacz proszę że nie napisałem wcześniej że to gotowy moduł. Można powiedzieć że jestem początkującym w kwestii zabawy z mikrokontrolerami.

    Konfigurację portów już poprawiłem, widać to w poście#11. Zatem problem może być sprzętowy a nie programowy skoro na liniach MISO i SCK dostaję ok. 4,5V tak?
  • #22 16628852
    excray
    Poziom 41  
    Marek_Skalski napisał:
    I popraw definicje związane z NCS. Ustawiasz PB4 jako wyjście, ale sterujesz portem PA0

    I tak ma być. Aby SPI działało w trybie Master pin SS (PB4) musi być ustawiony jako wyjście (stan nieważny). Niemniej linię CS można podpiąć pod dowolny inny pin - tak jak tutaj PA0.
REKLAMA