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] Wykorzystanie ADIS16201 z STM32F103 za pomocą HAL_CUBE_IDE - konfiguracja i parametry

w.tempczyk 07 Sty 2021 16:41 663 6
REKLAMA
  • #1 19165797
    w.tempczyk
    Poziom 8  
    Posty: 12
    Dzień dobry,
    Mam problem z dogadaniem się z ADIS16201. https://www.analog.com/media/en/technical-documentation/data-sheets/ADIS16201.pdf
    Zacznę od tego, że korzystam z płytki : https://www.analog.com/en/design-center/evalu...n-boards-kits/eval-adis16201.html#eb-overview
    Wyjścia podłączyłem w sposób następujący:

    ADIS1620 -- STM
    RESET-> 3,3V ( nie jestem pewien czy nie powinno być tutaj rezystora, ale w takiej konfiguracji działa)
    SCLK -> SPI2_SCK
    CS -> GND (z zamysłem, żeby komunikacja była ciągle tylko z nim)
    DOUT-> SPI2_MISO
    DIN->SPI2_MOSI
    VDD-> 3,3V
    COM-> GND

    Wybrałem parametry:
    Data Size: 16Bits
    MSB First
    Baud Rate: 1MBits/s
    CPOL: High
    CPHA: 2 Edge
    no i oczywiście softwarowy NSS

    Oczywiście także kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Problem polega na tym, że inklinometr odpowiada, ale nie jestem pewien co. Przejdzmy do while. To załączanie i wyłączanie pinu CS jest do późniejszej części projektu (na razie stoję). Funkcja TransmitReceive jest użyta dwa razy ze względu, na obrazek nr.31 z DS (czyli dopiero jak odczytuję drugi raz to dostaję moje dane). Przy odczycie SUPPLY_OUT (wpisując do adr[0]=0x02) dostaję zwrócone: dane[0]=12, dane[1]=0 na binarne to jest : 1100 0000 0000 BIN czyli 3072 DEC. Z tabeli nr.7 z DS można wywnioskować, że to jest 3748mV a ja używam 3,3V. Dodam także, że to nie jest liczba którą dostaję od razu (wcześniej wychodzi coś około 246mV a często też jest zero).
    Jeżeli czegoś nie załączyłem, albo czegoś nie powiedziałem proszę o upomnienie ;)
  • REKLAMA
  • #2 19166718
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    w.tempczyk napisał:
    Problem polega na tym, że inklinometr odpowiada, ale nie jestem pewien co.

    I właśnie dlatego zwieranie CS do masy jest kiepskim pomysłem.
  • REKLAMA
  • #3 19167254
    w.tempczyk
    Poziom 8  
    Posty: 12
    Niestety to nie to. Czy to może być brak rezystora do resetu ?

    Dodano po 38 [minuty]:

    Zauważyłem, że na przemian mam dane[0]=12, dane[1]=0 albo dane[0]=0, dane[1]=202. Ewentualnie obie zmienne przyjmują wartość 0

    Dodano po 1 [godziny] 28 [minuty]:

    No więc tak:
    1. Ten pin CS raczej nie miał znaczenia
    2. zmieniłem funkcję HAL_SPI_TransmitReceive na HAL_SPI_Transmit i HAL_SPI_Receive
    3. pomyliłem się co do kolejności zmiennych ( to znaczy że dane[0] były mniej znaczącym bajtem)
    4. Odczytuję teraz dane[1]=202 i dane[0]=0 co daje nam 1100 1010 0000 0000 BIN . Z tabeli nr.7 DS (Datasheets) widać, że interesuje nas tylko 12 bitów z ramki z tabeli nr.6. Co daje nam liczbę 1010 0000 0000 BIN czyli 2560 DEC. Po przeskalowaniu mamy 2560*1.22mV= 3,123 V. Co też nie jest moim napięciem zasilania, ale zmniejszając i zwiększając napięcie, dane[1] skacze z 202 na 203 lub 204 adekwatnie do zmiany. Prawdopodobnie urządzenie ma OFFSET.

    Dodano po 31 [minuty]:

    nasuwają mi się pytania:
    1. Dlaczego nieraz wysyła mi się wartość dane[0]=12 czyli 1100 BIN?
    2. Zmieniłem trochę kod i mam problem ze wskaźnikami.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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

    Co jest oczywiście źle bo do funkcji HAL_SPI_Transmit jako drugi argument wchodzi "uint8_t *pData". No i tu pytanie jak to zrobić jeżeli chcę odczytać/nadawać dwa bajty ? (prawdopodobnie to jest mój błąd przy odczycie, a nie OFFSET )
  • REKLAMA
  • #4 19167499
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 619
    Przeczytaj waringi po kompilacji.
    Błędnie korzystasz z funkcji HAL_SPI_Receive jak i HAL_SPI_Transmit.
    HAL_SPI_Receive (SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);

    gdzie
    pData pointer to data buffer
  • #5 19167548
    w.tempczyk
    Poziom 8  
    Posty: 12
    w.tempczyk napisał:
    Co jest oczywiście źle bo do funkcji HAL_SPI_Transmit jako drugi argument wchodzi "uint8_t *pData".

    Chodzi Ci o to ? Ja wiem że jest źle. Ale tylko HAL_SPI_Transmit bo do HAL_SPI_Receive wchodzi uint8_t. Nie wiem jak zrobić, żeby odczytywać drugi bajt

    Dodano po 1 [godziny] 47 [minuty]:

    Może inaczej. Czy da radę odczytać danę na wskaźniku ? (nie używając tablic) (dane przychodzą w formacie 16 bitów ) bo jak zrobię wskaźnik uint8_t to mi obetnie dane, a jak zrobię wskaźnik uint16_t to mi go funkcja nie przyjmie.
  • REKLAMA
  • #6 19168131
    Sareph
    Poziom 24  
    Posty: 638
    Pomógł: 65
    Ocena: 378
    w.tempczyk napisał:
    bo jak zrobię wskaźnik uint8_t to mi obetnie dane, a jak zrobię wskaźnik uint16_t to mi go funkcja nie przyjmie.
    Przyjmie, ale kompilator da Ci ostrzeżenie w stylu:

    Cytat:
    warning: passing argument xx of 'blaaarg' from incompatible pointer type [-Wincompatible-pointer-types]


    Tym niemniej:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 19341294
    w.tempczyk
    Poziom 8  
    Posty: 12
    Trochę późno, ale zawsze ;) Problem był w tym, że na wielkość danych wybrałem 16 Bitów a nie 8. I może tempo (boud rate) było za szybkie ( ale nie wiem bo nie sprawdziłem, w myśl zasady : działa ? nie dotykaj ;) ) Dziękuję za pomoc ;)

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z komunikacją między czujnikiem ADIS16201 a mikrokontrolerem STM32F103 przy użyciu HAL_CUBE_IDE. Użytkownik opisał podłączenie pinów oraz parametry SPI, jednak napotkał trudności w odczycie danych. W odpowiedziach zasugerowano, że podłączenie CS do masy może być problematyczne, a także zwrócono uwagę na błędne użycie funkcji HAL_SPI_Transmit i HAL_SPI_Receive. Użytkownik poprawił kod, zmieniając funkcje oraz kolejność zmiennych, co pozwoliło na uzyskanie poprawnych odczytów. Ostatecznie problem rozwiązano poprzez dostosowanie rozmiaru danych do 16 bitów oraz ewentualne zmniejszenie prędkości transmisji.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA