Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

SPI w STM32F103, tryb Full-Duplex

14 Lut 2020 09:37 279 7
  • Poziom 11  
    Cześć.
    Mam pewien problem z SPI w trybie Full-duplex

    Transmisja polega na tym że wysyłam 6 bajtów ale odbieram tylko 1 bajt,
    Wygląda to tak że wysyłając pierwszy bajt jednocześnie muszę odczytać jeden. Pozostałych Slave nie wysyła, pojawia się na MISO stan H. (po MISO leci 6 bajtów)

    Jak poradzić sobie z dwiema flagami. W końcu doczytałem w dokumentacji że jeśli nie odbiorę z rejestru SPI>DR danej to ustawiony zostanie bit OVR w rejestrze SPI->SR
    Co mam zrobić aby przy następnym przebiegu funkcji zapisu odczytać można było odebrana daną.
    Bo jesli dobrze rozumiem jak jest ustawiony bit OVR nie da się odczytać nowych danych. odczytam poprzednie wartości bo do czasu odczytania nowe są tracone.

    takie pytania
    1. jak skasować bit OVR - opis w RM008 nie przemawia do mnie w prosty sposób.
    2. Czy jednak dobrze rozumem że do czasu skasowania OVR nie mogę odebrac nowej danej nawet jak przed próbą odbioru nowych zrobię tzw. dummy read z SPI->DR?
  • Poziom 22  
    vp32 napisał:
    Transmisja polega na tym że wysyłam 6 bajtów ale odbieram tylko 1 bajt

    I problem polega na tym, że powinno być odebranych 6 a jest jeden, czy na czym?

    vp32 napisał:
    Wygląda to tak że wysyłając pierwszy bajt jednocześnie muszę odczytać jeden. Pozostałych Slave nie wysyła, pojawia się na MISO stan H. (po MISO leci 6 bajtów)

    Musisz coś wysłać aby coś odebrać.

    vp32 napisał:
    1. jak skasować bit OVR - opis w RM008 nie przemawia do mnie w prosty sposób.

    Odczytać DR.

    vp32 napisał:
    2. Czy jednak dobrze rozumem że do czasu skasowania OVR nie mogę odebrac nowej danej nawet jak przed próbą odbioru nowych zrobię tzw. dummy read z SPI->DR?
    Ale jaki w zasadzie masz problem z odczytem po zapisie? W ogóle to pokaż kod.
  • Specjalista - Mikrokontrolery
    Czy przejrzałeś przynajmniej z 5 wątków z wielu dziesiątek, omawiających problem taki sam, jak Twój? Masz funkcję SPI_send_receive, która wysyła i odbiera bajt, czy nie?. Jeśli nie masz - napisz i nie używaj żadnej innej do obsługi SPI.
  • Poziom 11  
    Dlaczego żadnej innej.? Chcę sam napisać a nie kopiować. Mogę, czy nie? trochę nie rozumiem waszych uwag.
    Jest w RMie podane że jak nie odczytam DR przychodzącego to następna odebrana dana spowoduje ustawieni flagi OVR.
    Pytam jak ją skasować. do czego tu kod. (nie posiadam funkcji przy sobie)!
    Drugie, po co mam czytać 6 bajtów skoro ich nie ma. To jak w NRF24L01, nadając coś zawsze odbierasz jeden tylko jeden bajt statusu. coś jak u mnie, reszta bajtów mi niepotrzebna.

    Aż boję się pytać skoro tak piszecie, ale czy ktoś wie jak pozbyć się takiego komunikatu w STM32CubeIDE.
    Mając aktywny projekt debugger usiłuje odwołać się do jakiegoś starego. nawet jak otworze ten projekt to i tak jego próbuje ładować


    SPI w STM32F103, tryb Full-Duplex
  • Poziom 22  
    vp32 napisał:
    Drugie, po co mam czytać 6 bajtów skoro ich nie ma.
    Bo tak działa SPI, ot musisz odczytać tyle ile wysyłasz. Czy z tymi danymi coś robisz czy nie to inna sprawa, możesz zrobić na przykład tak:

    Kod: C
    Zaloguj się, aby zobaczyć kod

    to wstawi odczyt DR do kodu bez wrzucania odczytanej wartości gdziekolwiek. Tym niemniej jeśli nie chcesz OVR, musisz mieć tyle odczytów z DR co zapisów.

    vp32 napisał:
    Aż boję się pytać skoro tak piszecie
    No ale co było niejasne w "jak skasować OVR" -> "odczytać DR"?
  • Specjalista - Mikrokontrolery
    vp32 napisał:
    Pytam jak ją skasować. do czego tu kod. (nie posiadam funkcji przy sobie)!

    Nie ma sensu próbować kasować flagi OVR, skoro znacząco prościej jest nie dopuścić aby została ona ustawiona. Osiągasz to przez odczytanie DR dokładnie tyle samo razy ile go zapisałeś.

    vp32 napisał:
    Drugie, po co mam czytać 6 bajtów skoro ich nie ma. To jak w NRF24L01, nadając coś zawsze odbierasz jeden tylko jeden bajt statusu. coś jak u mnie, reszta bajtów mi niepotrzebna.

    Na SPI jest 6 bajtów, po prostu 5 z nich jest "bez znaczenia". Dlatego najprostszą opcją jest je odczytać, a następnie zignorować.

    Zasadniczo sytuacja wygląda tak:
    1. Nikt nie robi kodu w sposób w który próbujesz go zrobić Ty, czyli np. zapisywać 6 bajtów, odczytywać tylko 1, kasować flagę OVR, kombinować czemu nie działa jak chcesz itd.
    2. Z tego względu każdy Ci poradzi zrobić kod "klasycznie", przy użyciu "generycznej" funkcji send+receive, która jednocześnie wysyła i odbiera dokładnie tyle samo danych (np. 1 bajt), a następnie zignorować to co Cię nie interesuje.
    3. Jeśli upierasz się przy swojej wersji, to zapewne będziesz ją musiał zrobić samemu, ponieważ nikomu się nie chce robić kodu, który jest trudniejszy, wolniejszy i bardziej skomplikowany niż wersja "klasyczna" i "generyczna".
    4. O ile jeszcze w sytuacji "nadaję 6 odbieram 1" można stać na stanowisku, że "po co masz odbierać 6 skoro tak naprawdę jest 1", to polecam następujący experyment logiczny - w bardzo wielu przypadkach po SPI odbierasz bardzo dużo danych, a master w tym czasie tak naprawdę niczego znaczącego nie nadaje (to co wystawia na linii MOSI jest kompletnie ignorowane) - działają tak choćby karty SD, pamięci Flash czy EEPROMy - jak to się wtedy ma do Twojej koncepcji, bo tak się składa, że z punktu widzenia mastera coś musisz jednak nadać żeby cokolwiek odebrać...
  • Poziom 11  
    OK zrozumiałem. Macie rację. Ja po prostu sugerowałem się wpisem w RM-ie
    Clearing the OVR bit is done by a read operation on the SPI_DR register followed by a read access to the SPI_SR register


    Po prostu wydało mi się to łatwiejsze, ale nie do końca wiem co mają na myśli followed by a read access to the SPI_SR register ?

    czy to zwykły pusty odczyt rejestru? czy o coś innego chodzi?

    I ważna sprawa, jak pozbyć się tego błędu z obrazka. Blokuje mnie! Mam pozamykane pozostałe projekty a i tak czepia się jednego. w ustawieniach debug jest nazwa bieżącego. Przeszukałem wszystkie usawienia i nie ma odwołań do innego projektu a i tak się go czepia.
  • Specjalista - Mikrokontrolery
    Chodzi o to, że oprogramowanie SPI ma być tak napisane, żeby bit OVR nigdy nie miał okazji się ustawić.

    Co do błędu - sprawdź, czy przypadkiem w ustawieniach debugowania Twojego projektu nie masz omyłkowo np. ładowania pliku z tamtego projektu. Ew. usuń z workspace projekt, który powoduje kłopoty.