Skocz do zawartości

Pomocna odpowiedź

Napisano

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.

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.

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)?

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?

(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

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?

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. 😉

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?

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

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?

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.

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łą?

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