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

[stm32f1][C] - Can - brak przerwania, błąd transmisji - CRC

mwtyczek 02 Lut 2015 19:09 1158 7
REKLAMA
  • #1 14396020
    mwtyczek
    Poziom 11  
    Posty: 42
    Ocena: 2
    Witam:)
    Od kilku dni próbuję uporać się z CAN. Po początkowych próbach z inicjalizacją funkcjami bibliotecznymi odpuściłem je sobie na rzecz inicjalizacji za pomocą rejestrami. Nie podobało mi się, gdy odkryłem, że funkcje ustawiały bit 16 w rejestrze CAN_MCR [CAN frozen during debug mode].
    Posiłkując się tym, co jest na forum oraz tą instrukcjąskleiłem inicjalizację, która działa. Bitrate 500 kbit.
    Spoiler:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Odpowiednie zegary, GPIO (Rx-PD0, Tx-> PD1 oraz remap), kontroler NVIC ustawiłem wcześniej i wywołuję je przed inicjalizacją CAN.

    Konstrukcja wiadomości:
    Spoiler:
    Kod: text
    Zaloguj się, aby zobaczyć kod



    Przerwanie odbioru:
    Spoiler:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Przerwanie wysłania:
    Spoiler:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    części main'a z wysyłaniem:
    Spoiler:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    ____________________________________________________________________

    Problem:
    Po przejściu przez linie wysyłania wiadomości w rejestrze CAN_ESR ustawiane są bity 5,6 w RM008 opisne jako sygnalizacja CRC error.
    Cytat:
    CRC = Cyclic Redundancy Code
    Error flag: 6 dominant bits if node is error
    active else 6 recessive bits.
    Suspend transmission: applies to error
    passive nodes only.

    Jakby coś z rozmiarem (długością) wiadomości?
    Ustawiany jest także bit 18, od licznika TransmitErrorCounter oraz błąd transmisji dla skrzynki 0 TERR0 w rejestrze TSR.
    Czyżby te magiczne hexy były źle ustawione? Przeliczałem bitrate dla 36MHz jakie u mnie taktuje APB1 :)
    Ktoś może wie jak to udrożnić ??

    części main'a z wysyłaniem:
    Spoiler:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Podgląd rejestrów:

    [stm32f1][C] - Can - brak przerwania, błąd transmisji - CRC
  • REKLAMA
  • #2 14396841
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 14396996
    mwtyczek
    Poziom 11  
    Posty: 42
    Ocena: 2
    Dziękuję za odpowiedź;)
    Czytałem na ten temat... i chciałem ustawić wg
    BitRate=Fclk/(BRP+1)*(tseg1+tseg2+3), stąd moje podstawienia.
    U mnie również Fclk 36 MHz.
    Zaraz spróbuję Twoich ustawień... przez speed rozumiesz ustawione BitRate ? Dla Twoich danych wynosi on 500?
    Edit: widzę, że tak. Widzę nawet z jakiego przykładu ten fragment kodu :D

    Dobra złapałem, dziękuję :)

    Na razie testuję CAN na płytce ZL29ARM, a chce się komunikować z Joystickiem BOSH 4 EJ, a dalej przez GPIO z kartą sterującą zaworami BODAS
  • REKLAMA
  • #4 14397112
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 14397302
    mwtyczek
    Poziom 11  
    Posty: 42
    Ocena: 2
    W oryginale jest
    Kod: text
    Zaloguj się, aby zobaczyć kod

    U mnie po dodaniu tej linijki kompilator wyrzuca błąd.
    Widzę że jest funkcja RCC_GetClocksFreq(); w bibliotekach, jednak nie wiem za bardzo jak ją wywołać, żeby dała PCLK1_Frequency. Z tego jak rozumiem UM ona zwraca wartości wszystkich zegarów.
    Jest jakiś inny sposób?
  • #6 14397547
    Konto nie istnieje
    Poziom 1  
  • #7 14397934
    mwtyczek
    Poziom 11  
    Posty: 42
    Ocena: 2
    To akurat przyszło mi do głowy, chodziło mi o dostęp przez tą funkcję nieszczęsną :)
    Jeszcze raz dzięki za zainteresowanie :) teraz wszystko śmiga :D

    Tak swoją drogą nie jest ustawiana flaga CAN_RxRdy w obsłudze przerwania odbioru. Dwubitowy rejestr CAN_RF0R_FMP0 ustawiany jest tylko na młodszym bicie, ale ten kod
    Kod: text
    Zaloguj się, aby zobaczyć kod

    powinien to wychwycić? Niestety instrukcja w mainie
    Kod: text
    Zaloguj się, aby zobaczyć kod
    jest pomijana.
  • #8 14398057
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik zmaga się z problemem transmisji CAN w mikrokontrolerze STM32F1, gdzie występują błędy CRC i ustawienia rejestru CAN_ESR wskazują na problemy z długością wiadomości. Po przejściu na ręczną inicjalizację rejestrów, użytkownik ustawił bitrate na 500 kbit/s, jednak napotkał trudności z poprawnym skonfigurowaniem timingu. Odpowiedzi na forum sugerują, że błędy mogą wynikać z niewłaściwych ustawień rejestru BTR, w tym wartości TSEG1 i TSEG2, które wpływają na Sample Point. Użytkownik testuje CAN na płytce ZL29ARM, komunikując się z joystickiem BOSH 4 EJ oraz kartą sterującą zaworami BODAS. Dodatkowo, pojawił się problem z flagą CAN_RxRdy w obsłudze przerwania odbioru.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA