Skocz do zawartości

Transmisja DCC przez STM32


KrisLen

Pomocna odpowiedź

Cześć,

 

Chcę zrobić własną obsługę DCC kolejki elektrycznej w standardzie NMRA.

Problem mój pojawił się w momencie wymyślania sposobów transmisji między dwoma STM32 w standardzie NMRA.

W standardzie NMRA przekazywane są dane za pomocą pakietów ze zmienną długością bitów: Podstawy+DCC

Jak w STM32 można obsłużyć czasową transmisję poszczególnych bitów?

 

Zależy mi aby protokół przesyłu zajmował niewiele czasu procesorowi, najlepiej w przerwaniach, ale jak to zrobić?

 

Pozdrawiam.

Link do komentarza
Share on other sites

16 godzin temu, KrisLen napisał:

Jak w STM32 można obsłużyć czasową transmisję poszczególnych bitów?

Przygotuj sobie wszystkie dane w pamięci i wyślij do timera (CCRx + ARR) generującego PWM za pomocą DMA. Tk praktycznie całą transmisją zajmie się sprzęt.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Jak rozumiem, wypełnienie będzie stałe (50%). Zmienne wartości szerokości bitów przesyła się kolejno do timera z bitów zapisanych w tablicy przez DMA? Czy to masz na myśli?

Link do komentarza
Share on other sites

Tak, chociaż po drodze wpadł mi lepszy pomysł do głowy. Możesz mieć stałe ARR/CCR a za pomocą DMA żonglować rejestrem PSC, dzięki czemu będziesz miał potrzebował tylko jednego kanału DMA.

Edytowano przez kaworu
Link do komentarza
Share on other sites

Dopiero poznaje STM32, więc ciągle wielka ilość DS przede mną 😉

Czy timer w tym procesorze, aby wysłać takie krótkie pakiety bajtów, należy:

najpierw uruchomić, potem przesłać pakiet DMA i zatrzymać timer. Następnie poczekać do następnej wysyłki pakietu?

Link do komentarza
Share on other sites

Najlepiej będzie jak weźmiesz sobie któryś z timerow, które mają rejestr powtórzeń, na pewno mają je timery advanced, nie wiem czy general purpose, sprawdź. Wtedy ustawiasz DMA, timer ustawisz w trybie One Pulse Mode + ilość powtórzeń na liczbę bitów jakie chcesz nadać, timer sam się zatrzyma jak wszystko wyśle, a przerwanie DMA Ci powie, ze wszystko zostało wysłane. 😉

Link do komentarza
Share on other sites

Mam problem ze znalezieniem odpowiedzi jak to wszystko powinno razem działać.

Jeśli timer ustawimy na określoną ilość powtórzeń w rejestrze, to sam timer wyzwala DMA tyle razy ile będzie powtórzeń? Kto realnie pobiera poszczególne bity (w jaki sposób) i wprowadza na pin procesora?

Link do komentarza
Share on other sites

Liczba bitów do wysłania w timerze i kanale DMA powinna być taka sama. I zadziała to tak, ze timer przy każdym przepełnieniu licznika wyzwoli DMA, które zapisze nową wartość z przygotowanej tablicy w pamięci do preskalera. Timer jako taki nie może nic "pobrać", może jedynie powiedzieć kontrolerowi DMA aby wykonał kolejny transfer danych.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Teraz rozumiem i biorę się za pisanie kodu 🙂

A jak wykonać odbiór? A w zasadzie jak rozróżnić preambułę (12bit) od pozostałych bitów ramki? Czy da się to zrobić w STM32 sprzętowo?

Link do komentarza
Share on other sites

Dobry sposób.

Jak to jest z preambułą? Czy to jest tylko synchronizacja i nie trzeba liczyć dokładnie tych 12 bitów?

Wtedy wystarczyłoby czekać na bit zero pokazujący początek danych, niezależnie od ilości bitów preambuły.

Link do komentarza
Share on other sites

Znalazłem kilka stron i pdf, ale piszą tylko, że preambuła ma 12 bitów o wartości 1. Przed każdym bajtem pakietu jest przesyłany bit o wartości 0. Tak wygląda cała ramka.

Tylko, czy podczas odbioru preambuły muszę odebrać wszystkie 12 bit, czy jednak służy tylko do synchronizacji i nieważne ile bitów odbiorę - ważne aby zauważyć ostatni bit 0?

Jak to jest w innych transmisjach z preambułą?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.