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

STM32F103 -brak danych odebranych w interfejsie SPI

Aroni525 29 Lis 2017 00:58 624 7
REKLAMA
  • #1 16855961
    Aroni525
    Poziom 9  
    Posty: 67
    Ocena: 16
    Czytałem parę podobnych tematów i konfrontowałem to z tym co sam napisałem, ale dalej nie wiem co zrobiłem źle i chyba pozostaje mi poprosić kogoś o wskazówkę.

    Używam interfejsu SPI do komunikacji z zewnętrznym przetwornikiem ADC (AD7793).

    Generalnie już sobie bibliotekę do jego obsługi napisałem, wszystko gra... no prawie wszystko. Mój procesor nie odbiera danych przychodzących z ADC, lub też są to jakieś śmieci, które się nie zgadzają z tym co faktycznie jest.

    Po podpięciu się analizatorem stanów logicznych wszystkojest okej, więc to wina programu, jakżeby inaczej.

    Testuję to w tym momencie na najprostszej funkcji jaką mogę wywołać, mianowicie chcę pobrać ID układu:

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


    Gdy odpalam debugger i zrobię breakpointa w 4 linijce kodu funkcji (w momencie wpisywania 0xFF, żeby nadać sygnał zegarowy) to po kroku dalej dane odebrane trafiają odpowiednio do rejestru DR. Natomiast jeśli program leci ciągiem bez przerw to już nie.

    Totalnie nie mam już tropu co zrobić. Ktoś coś?[/code]
  • REKLAMA
  • Pomocny post
    #2 16855972
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 16855993
    Aroni525
    Poziom 9  
    Posty: 67
    Ocena: 16
    Faktycznie masz rację, dzięki za zwrócenie uwagi na to. Dopisanie odczytu rejestru DR po wysłaniu samej komendy pomogło;)

    Natomiast nie mogę teraz znieść mindfu*ka, bo linijka :

    id = SPI1->DR;

    nie działa. W rejestrze są już dobre dane, ale przypisanie do zmiennej nie działa... Nawet jeśli zadeklaruję ją w tej samej funkcji to po prostu nie działa, wartość zmiennej zawsze wynosi 255.

    To chyba znak, że powinienem iść spać, bo już coś ze mną nie tak...

    @Edit

    Ahaa, dobra. Przeczytałem kolejny raz Twojego posta i zauważyłem "dane przyjdą w kolejnym bajcie"...
    Chyba mi już czytanie ze zrozumieniem nie idzie o tej porze. Czyli w SPI mam rozumieć, że te dane które dostaję w tym samym czasie co transmituję, znajdą się w rejestrze DR zawsze z opóźnieniem 1 cyklu pracy interfejsu? Da się jakoś wymusić przesunięcie tego do rejestru DR bez inicjowania specjalnie kolejnej transmisji-odbioru, żeby tylko dobrać się do tego wcześniej odebranego bajta?
  • Pomocny post
    #4 16856215
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Po pierwsze, w SPI zawsze nadajesz i odbierasz bajt. Jeśli nadałeś dwa i odebrałeś jeden, to odebrałeś ten, który przyszedł po nadaniu pierwszego, a drugi zignorowałeś. Musisz zawsze odczytywać tyle bajtów, ile zapisałeś.

    Po drugie, chcesz nadawać bajty, a rejestr DR w STM32 ma 16 bitów, więc jednym zapisem do DR nadajesz 2 bajty. Musisz wykonywać bajtowe dostępy do DR (odczyt i zapis). Musisz też ustawić bit FRXTH w CR2.
  • REKLAMA
  • Pomocny post
    #5 16856225
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #6 16856306
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Zapewne masz rację. Używam L4, F0 i L0, a na F1 jakoś nigdy nie uruchamiałem SPI. :)
  • Pomocny post
    #7 16856466
    Konto nie istnieje
    Konto nie istnieje  
  • #8 16856539
    Aroni525
    Poziom 9  
    Posty: 67
    Ocena: 16
    Dzięki Panowie za odpowiedzi, pomogliście mi i już póki co wszystko śmiga.

    Generalnie istota problemu tkwiła w tym, że po prostu umknęły mi gdzieś informacje o kolejkach i rejestrze przesuwnym. Myślałem że te dane, które dochodzą do SPI od razu pojawiają się w DR i tyle. I że brak odczytu po jakiejś transmisji po prostu spowoduje ich nadpisanie w kolejnym cyklu.

    Piotrus_999 napisał:
    2. Nie rozumiem lenistwa w debugu - przecież wystarczyło odczytać jeszcze kilka bajtów i zobaczyć jak to wygląda i gdzie są dane (po którym bajcie).


    No właśnie, gdybym wpadł na to że to może gdzieś tam w kolejce czekać.. ;p Niestety mi to do głowy nie przyszło, no bywa

    Co do dummy byte to faktycznie jest jak mówisz, z tym że 32 jedynki, a więc 4 bajty resetują cały układ. Ale to akurat miałem na uwadze, tutaj tylko wpisałem w locie 0xFF żeby coś było;)

    Dzięki jeszcze raz!

Podsumowanie tematu

✨ Użytkownik miał problem z odbieraniem danych z przetwornika ADC (AD7793) za pomocą interfejsu SPI na mikrokontrolerze STM32F103. Po analizie kodu i wskazówkach od innych uczestników dyskusji, zidentyfikowano, że problem wynikał z nieodpowiedniego odczytu rejestru danych (DR) oraz z braku synchronizacji między nadawanymi a odbieranymi bajtami. Użytkownik dowiedział się, że dane przychodzą z opóźnieniem jednego cyklu, co wymagało odczytu rejestru DR po wysłaniu komendy. Dodatkowo, omówiono znaczenie odczytu wszystkich bajtów, które zostały wysłane, oraz zastosowanie odpowiednich wartości bajtów do komunikacji. Po wprowadzeniu poprawek, problem został rozwiązany.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA