Skocz do zawartości

[STM32] interfejs CAN


slawek7

Pomocna odpowiedź

Cześć

Może mi ktoś wytłumaczyć o co chodzi z kolejkami FIFO w STM32?

Chodzi mi o to że każdy z układów CAN mam 2 bufory FIFO0 i FIFO1. Skąd mam wiedzieć do którego bufora trafiła przychodząca wiadomość? Każdy z buforów kołowych ma swoje przerwanie Jest to pokazane na stronie 647 w RM008 tu:

http://www.st.com/web/en/resource/technical/document/reference_manual/CD00171190.pdf

natomiast dla np CAN0 mamy jedno od wiadomości przychodzącej USB_LP_CAN_RX0.

mam nadzieję że dobrze wytłumaczyłem czego nie rozumiem

Sławek

Link do komentarza
Share on other sites

System przerwań w STM32 jest dość rozbudowany i powinieneś trochę wniknąć w jego strukturę. Na nieszczęście wiele zależy od tego z którą rodziną masz do czynienia.

Rzeczywiście, blok CAN może zgłaszać 4 różne przerwania, w tym 2 od swoich FIFO. No i dalej to już zależy.

W rodzinie 32F1xx jest łatwo: każde przerwanie od CAN podłączone jest do swojego wektora przerwań i odpowiednia funkcja obsługi wywoływana jest sprzętowo - patrz: długa tabelka w rozdziale 10 (Interrupts and events) w Reference Manual RM0008. Jak rozumiem, nie masz tego procesora bo nie byłoby pytania.

W takim razie walczysz zapewne z czymś mniejszym, typu 32F0xx opisanym w RM0091. Tam jest bardzo podobna tabelka, ale CAN zostało w niej zdegradowane do mniej znaczącego bloku i dostało tylko jeden wektor przerwania, na dodatek łącznie z CEC podłączonym przez dodatkowy kontroler przerwań zewnętrznych EXTI (linia 27). Tak więc Twoja funkcja obsługi tego przerwania musi programowo zbadać dlaczego została wywołana, np. poprzez odczyt rejestrów stanu. Na szczęście każde FIFO (i każde inne źródło przerwań od CAN) ma swój dobrze opisany rejestr z którego można wyczytać co się stało. Bardzo pomocny w poszukiwaniu odpowiedniego rejestru i bitu jest rysunek w rozdz. "bxCAN Interrupts".

Link do komentarza
Share on other sites

Widać że albo ja nie rozumiem co masz na myśli albo nie czytałeś mojego pytania.

Ja nie pytałem o system przerwań w STM32.

Jak rozumiem, nie masz tego procesora bo nie byłoby pytania.

W ogóle nie wiem o co chodzi. Mam ten procesor i do niego odnosi się pytanie.

Jeszcze raz na spokojnie. Cały czas pytam o interfejs CAN w STM32 i dwie bufory FIFO, które w dokumentacji oznaczone są jako FIFO0 i FIFO1.

Nie jest dla mnie jasne z opisu przedstawionego w RM0008 jak to działa. Skoro przychodzi wiadomość w szyny CAN, do do którego bufora trafia FIFO0 czy FIFO1. Jeśli aktywne jest przerwanie które powstaje na skutek przychodzącej wiadomości do FIFO0 a jak wiadomość trafi do FIFO1 wiadomo że przerwania nie będzie. Czy w takim razie ona nie zostanie odczytana?

Link do komentarza
Share on other sites

Każdy z buforów kołowych ma swoje przerwanie..

natomiast dla np CAN0 mamy jedno od wiadomości przychodzącej USB_LP_CAN_RX0

No to jak nie pytałeś o przerwanie?

..nie wiem o co chodzi. Mam ten procesor..

😃 Masz procesor - w to nie wątpię, ale który? Jak się dokładnie nazywa bo w STM32 jest ich jak mrówków a każda rodzina ma swoje indywidualne cechy.

Tak, CAN jest we wszystkich STM32 (chyba?) takie samo, ale w inny sposób jest ono podłączone do jądra ARM. W szczególności inaczej poprowadzone są przerwania a to właśnie one są pierwszą informacją dla programu o tym co się stało w bloku CAN. Jeżeli masz 4 niezależne przerwania od samego CAN, to po samym fakcie zgłoszenia któregoś wiesz, które FIFO ma dane - i tak jest w rodzinie 32F1xx. Skoro zadałeś pytanie w którym skarżysz się na jedno tylko przerwanie od CAN - to nie możesz mieć tego procesora, prawda? Dlatego masz pewnie jego mniejszego brata, któregoś z rodziny 32F0xx, czy tak?

Jeżeli piszesz, że nie wiesz gdzie masz szukać odebranych danych mając tylko jedno przerwanie i kłóci się to z tym co czytasz w manualu to albo wziąłeś nie ten dokument - dotyczący innej rodziny albo masz więcej przerwań tylko o tym nie wiesz.

Pomijając już te przerwania bo na początku może to być lekko skomplikowane, program może dowiedzieć się o stanie FIFO poprzez odczyt odpowiedniego rejestru stanu. Każde FIFO ma swój własny rejestr (CAN_RF0R i CAN_RF1R) gdzie widać w jakim stopniu FIFO jest zapełnione oraz czy stało się coś naprawdę złego. Odpowiednia grupa bitów pokazuje tam np. stan zapełnienia FIFO (FMPx) a inny bit mówi o tym, że FIFO zostało przepełnione FOVRx). Jest tam też ważny bit (RFOMx) który ustawiasz jeśli chcesz odczytać pierwszy z brzegu komunikat z tego FIFO. O tym czy i który komunikat z szyny CAN trafia do FIFO decyduje cała masa filtrów, które powinieneś sobie spokojnie sam wcześniej ustawić.

Pisałem o przerwaniach, bo to jest najistotniejsza różnica między CANami w różnych rodzinach STMów. Sądziłem, że takie rzeczy jak odczyt rejestru stanu są dla Ciebie oczywiste. Chyba się myliłem, przepraszam.

Czy to wyczerpuje Twoje wątpliwości?

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

Takim sie bawię

STM32F105RCT6

Chyba po to staram się coś dopytam bo czegoś nie wiem. Po jakiego grzyba ciągle wmawiasz mi ze czegoś nie mam. Więc taki jak wyżej mam na swojej płytce.

Owszem pytałem o przerwania ale dotyczące układu CAN.

Dalej nie wiem co steruje do jakiego FIFO przyjdzie wiadomość?

Uwierz że jest to dla mnie coś cięższego niż AVRy, a informacji jest wg mnie w sieci skąpo.

Jak czytam w RM o FIFO i szukam na podstawie czego wiadomość jest kierowana do danego bufora a tej informacji nie mam to zaczynam się gubić.

Jedyne co udało mi sie doczytać to że pojedynczy bufor np FIFO0 może przyjąć 3 wiadomości i sam dba o ich przekazanie do CPU. I nawet jest to dość fajnie opisane jak to działa, ale nic więcej.

Link do komentarza
Share on other sites

Niczego Ci nie wmawiam, próbuję tylko zgadnąć na jakiej platformie pracujesz, zrozumieć Twój problem i zadać za Ciebie odpowiednio szczegółowe pytanie po to, by nie przepisywać tu manaula do STM32.

Dobra, już chyba rozumiem, masz kłopot z mechanizmem wrzucania komunikatów z szyny CAN do FIFO a nie z ich odczytem przez oprogramowanie, tak?

OK, blok CAN ma dwie FIFO oraz zestaw 28 filtrów. Każdy z tych filtrów może być:

- ustawiony na identyfikację tylko pewnych określonych komunikatów w dwóch głównych trybach identyfikacji : maski lub listy: CAN filter mode register (CAN_FM1R) oraz całą masa innych rejestrów w bloku "CAN filter registers",
- "podłączony " do jednej z dwóch FIFO: CAN filter FIFO assignment register (CAN_FFA1R),
- uaktywniony bądź nie: CAN filter activation register (CAN_FA1R).

Jeśli komunikat już znajdzie się w FIFO, dalej jest tak jak napisałem wcześniej. Masz odpowiednie bity stanu każdego FIFO więc wiesz co się w każdym dzieje. Dostajesz odpowiednie przerwanie itd.. Jeżeli nie będziesz miał czasu a do FIFO trafi czwarty komunikat, FIFO przepełnia się itd..

Moim zdaniem wszystko opisane jest bardzo dobrze. Może czytamy inne dokumenty???

Link do komentarza
Share on other sites

No o to chodziło.

Co do czytania, zapewne czytamy to samo, ale ja to tak rozumiem jak widzisz.

Jeśli mam np wyłączone filtry ma to działać jak analizator) to do którego FIFO (0, 1) trafi przychodząca wiadomość? Może wybór bufora się ustawia?

PS. Wielką sztuka jest umiejętność czytania not katalogowych a sam widzisz jak to u mnie jest. Nie będę Ciebie pytał abyś pokazał mi jak powinienem doszukać się tych informacji, ale jak to co piszesz wyczytałeś z tego RM0008 to wielki szacunek.

Link do komentarza
Share on other sites

No nie, "obejść" tego mechanizmu się nie da.

Popatrz na rysunek fig. 231: komunikat musi być zgodny z którymś filtrem by został zaakceptowany i następnie zapisany do związanej z tym filtrem FIFO. Przy okazji zapisuje się też do FIFO tzw. FMI (Filter Match Index) czyli numer filtra który wykrył zgodność, długość pola danych i znacznik czasu.

Dlatego musisz odblokować co najmniej jeden filtr, najprościej w trybie "mask" z maską (bity 31-16) ustawioną na zero. Będzie to znaczyć, że żaden bit pola identyfikatora komunikatu nie musi być porównywany ze wzorcem (bity 15-0) i każdy ID będzie dobry.

To proste 🙂

Link do komentarza
Share on other sites

To niby jest wszystko proste tak jak piszesz, ale jakoś trzeba na to wpaść jak to działa.

Mógłbyś mi pomóc przygotować CAN do pracy w dwóch wariantach

1. akceptowane są wszystkie przychodzące wiadomości

2. oraz na jakąś konkretną wartość ID

Link do komentarza
Share on other sites

Mogę spróbować.

A Ty od początku dokładnie przeczytaj opis działania tego interfejsu i spróbuj go zrozumieć - to ważne. Kolejne rozdziały czytaj po kilka razy aż najważniejsze zasady będziesz mógł opowiedzieć własnymi słowami. Kiedy przez to przejdziesz, zabierz się za rejestry. Pamiętając o idei działania całości skupiaj się na znaczeniu bitów i ich odniesieniu do poszczególnych bloków sprzętowych. Niektóre rejestry służą do ustawiania trybów pracy - i zwykle zapisuje się je przed rozpoczęciem pracy, a inne do odczytywania stanu tych bloków - i te będziesz czytał wielokrotnie w czasie działania interfejsu.

Zastanów się nad organizacją programu. Czy masz tam jakiś system operacyjny? Jak mają być zadawane parametry? Co ma robić z odczytanymi ramkami? Czy będziesz korzystał z przerwań czy tylko z bieżącego odczytywania stanu? Co jeszcze ma w tym czasie robić system? Jak będzie połączony ze światem zewnętrznym?

I na koniec: zadawaj przemyślane i konkretne pytania. Wtedy odpowiedź może być zwięzła (np. nie wiem 😐 ) i nie musi zawierać tego, co i tak możesz sam wyczytać z manuala.

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.