Skocz do zawartości

Transmisja DCC przez STM32


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 to post
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 to post
Share on other sites

Tylko czy taką metodą obsłuży się zmienność długości impulsu, w którym zmienia się długość i okres, jak na powyższym rysunku (w linku)?

Link to post
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 to post
Share on other sites
(edytowany)

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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.