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] [stm32f103][CAN] - Nieudane wysyłanie danych, co może być przyczyną?

betoven 30 Wrz 2014 00:07 2631 13
REKLAMA
  • #1 14002416
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Witam.

    Po kilku godzinach z CAN postanowiłem napisać, może Wam przyjdzie do głowy co zmaściłem.

    Program jest prosty:


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


    Moderowany przez dondu:

    Poprawiłem SYNTAX - staraj się proszę w kolejnych postach poprawnie go umieszczać wykorzystując pole wyboru w edytorze postów.



    Z auto powtarzaniem mam od razu zapchane trzy skrzynki i na każdej status CAN_TxStatus_Pending, a jak wyłączę to mam że CAN_TxStatus_Failed.

    Na magistrali mam kontroler:
    [stm32f103] [stm32f103][CAN] - Nieudane wysyłanie danych, co może być przyczyną?

    Dodam że mcp jest zasilany 5V a stm 3,3. Nie wiem czy tak może być...
  • REKLAMA
  • #2 14002532
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Tak na szybko sprawdziłem dzisiaj rano że:
    CAN_Init() zwraca CAN_InitStatus_Failed

    ktoś ma pomysł dlaczego ?
  • REKLAMA
  • #3 14002593
    Konto nie istnieje
    Konto nie istnieje  
  • #4 14004766
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    A co masz podpięte z drugiej strony magistrali ? Może przewody "się" zamieniły.
  • REKLAMA
  • Pomocny post
    #5 14006570
    Smashing
    Poziom 20  
    Posty: 513
    Pomógł: 18
    Ocena: 12
    Witam
    betoven napisał:
    Dodam że mcp jest zasilany 5V a stm 3,3. Nie wiem czy tak może być...

    Może tak być

    to cała konfiguracja Can bez filtrów, czyli przepuszcza wszystko
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Pozdrawiam
    Smashing
  • #6 14008497
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Więc, tak.

    Na pełnym loopback'u wszystko jest ok, czyli wysyłają się wiadomości.
    Po zmianach optymalizacji kodu, bo wcześniej wprowadziłem Was w błąd, debug zachowuje się już normalnie. Myślałem że nie przechodzi init, ale przechodzi poprawnie. (mój błąd w interpretacji.

    Problem jest teraz w wysyłaniu wiadomości w Normal Mode. Podejrzewam, że problem jest jednak w podłączeniu MCP2551 bezpośrednio do STM32f103.

    Pytanie: Czy ktoś kiedyś to tak podłączał i czy może podesłać ewentualnie jak to powinno być zrobione ?
  • REKLAMA
  • #7 14008584
    Smashing
    Poziom 20  
    Posty: 513
    Pomógł: 18
    Ocena: 12
    Witam,
    schemat u góry masz dobry.
    Dałeś rezystor 120 Ohm na początku i na końcu magistrali?

    Pozdrawiam
    Smashing
  • #8 14008598
    kemot55
    Poziom 31  
    Posty: 1306
    Pomógł: 184
    Ocena: 147
    A "loopback" przed czy po MCP? Jaką wartość ma R10?
    Wg mnie nie warto montować na razie terminatorów (to możesz użyć przy długich pętlach, na końcu prac i to z dużą rozwagą) natomiast nie napisałeś co jest podłączone ma magistrali za MCP jak już nie pracujesz w pętli zamkniętej. Jak zostawisz wiszącą mag. CAN to kontroler nie może potwierdzić wysłania czegokolwiek i "wisi".
  • #9 14008649
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Terminator jest tylko po jednej stronie i ma wartość chyba 250ohm. Magistrala testowa ma jakiś niecały metr. Po drugiej stronie jest taki sam układ (MCP) i raspberry pi, który jest skonfigurowany na 125bps. R10 ma chyba 100Ohm (ale to muszę potwierdzić, bo nie pamiętam).
    Ten moduł z RPi testowałem na innej magistrali i can_dump działa poprawnie, czyli czyta to co jest wysyłane.

    Co do potwierdzania, to sprawdzam na oscyloskopie przed i za MCP i nic nie widać, żadnych sygnałów.

    Jeśli chodzi o loopback to jest to cichy loopback po stronie STMa.
  • #10 14008664
    Smashing
    Poziom 20  
    Posty: 513
    Pomógł: 18
    Ocena: 12
    Witam
    Ja na kablu 1 metra dawałem rezystor 120ohm z jednej strony na testy, bez rezystora u mnie nie działa.
    Jeśli działa na innym z prędkością 125K to napisz co jest tu:
    CAN_SJW_1tq=?, CAN_BS1_10tq=?, CAN_BS2_7tq =?


    Pozdrawiam
    Smashing
  • #11 14008676
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    CAN_SJW = CAN_SJW_1tq;
    CAN_BS1 = CAN_BS1_10tq;
    CAN_BS2 = CAN_BS2_7tq;
    CAN_Prescaler = 16;
  • #12 14008707
    Smashing
    Poziom 20  
    Posty: 513
    Pomógł: 18
    Ocena: 12
    Witam
    Równie dobrze mogłeś napisać że A= B.
    Dalej nie wiadomo ile się równa
    CAN_SJW_1tq=? (np 10 czy 14),
    CAN_BS1_10tq=? (np 2 czy 4),
    CAN_BS2_7tq =? (np 4 czy 7)

    Pozdrawiam
    Smashing
  • #13 14008788
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    CAN_SJW = 0x00
    CAN_BS1 = 0x09
    CAN_BS2 = 0x06
    CAN_Prescaler = 16

    CANx->BTR = (uint32_t)((uint32_t)CAN_InitStruct->CAN_Mode << 30) | \
    ((uint32_t)CAN_InitStruct->CAN_SJW << 24) | \
    ((uint32_t)CAN_InitStruct->CAN_BS1 << 16) | \
    ((uint32_t)CAN_InitStruct->CAN_BS2 << 20) | \
    ((uint32_t)CAN_InitStruct->CAN_Prescaler - 1);
  • #14 14010616
    betoven
    Poziom 12  
    Posty: 108
    Ocena: 8
    Ostatecznie zadziałało.

    Jeszcze nie analizowałem gdzie miałem błąd, ale Twoja @Smashing procedura zadziałała... Ostatecznie obyło się bez dodawania rezystorów pomiędzy MCP a STM32. Jeśli ktoś będzie szukał informacji czy można bezpośrednio połączyć STM32 i MCP2551 (lub podobny) to można.

    Z ciekawostek dodam, że z jednym terminalem 120ohm po jednej stronie, nawet przy niecałej metrowej magistrali docierała co 3-4 wiadomość. Z terminatorami lecą wszystkie. Więc albo żadnego na takim małym odcinku, albo tak jak powinno być, czyli z dwoma terminatorami.

    Wielkie dzięki. Naprawdę...

Podsumowanie tematu

✨ Użytkownik miał problemy z wysyłaniem danych przez magistralę CAN na mikrokontrolerze STM32F103. Po wstępnym sprawdzeniu, funkcja CAN_Init() zwracała status błędu. Użytkownicy zasugerowali sprawdzenie kodu funkcji oraz podłączenia urządzeń. Po testach w trybie loopback, użytkownik zauważył, że problem występuje w trybie normalnym, co może być związane z podłączeniem MCP2551. Wskazano na konieczność użycia rezystorów terminacyjnych oraz poprawnej konfiguracji rejestrów CAN. Ostatecznie, po zastosowaniu sugerowanej procedury, komunikacja została przywrócona, a użytkownik potwierdził, że możliwe jest bezpośrednie połączenie STM32 z MCP2551.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA