CAN od zera część 2: Jak połączyć dwa mikrokontrolery i przesłać pierwszą ramkę?
W poprzednim artykule przedstawiłem komunikację po magistrali CAN bez transceivera, z wykorzystaniem jednego mikrokontrolera. Tym razem zbudujemy pełne połączenie dwóch mikrokontrolerów STM32 poprzez transceivery CAN i prześlemy pierwszą ramkę danych. Projekt realizowany jest bez systemu operacyjnego (bare metal), z użyciem przerwań i FIFO CAN.
Schemat podłączenia dwóch mikrokontrolerów:
Dwa mikrokontrolery są połączone poprzez transceivery protokołem CAN, zgodnie z poniższym schematem blokowym:

Fizyczne połączenie:
Zdjęcie poniżej przedstawia fizyczne połączenie dwóch mikrokontrolerów poprzez transceivery protokołem CAN, za pomocą skręconych przewodów. Dodano także rezystor terminujący, który jest niezbędny do poprawnego działania. Normalnie powinienem dodać dwa rezystory 120Ω na początku i końcu magistrali, lecz w obecnym układzie magistrala jest krótka oraz niska jest prędkość transmisji (250 kbps). W przypadku dłuższej magistrali lub wyższej prędkości transmisji należy zastosować dwa rezystory 120 Ω na końcach magistrali, pomiędzy CAN_H i CAN_L.

Konfiguracja mikrokontrolerów w środowisku CubeIDE:
W obu mikrokontrolerach:
- użyto CAN1,
- włączono przerwanie od CAN1,
- ustawiono bitrate 250 kbps.

Program mikrokontrolera nr 1:
Poniżej znajduje się fragment funkcji obsługi przerwania od CAN:

Nagłówek CAN:

Pętla główna, w której po naciśnięciu przycisku wysyłane są dane po CAN oraz następuje miganie diodą po odebraniu danych po CAN:

Ustawienia filtrów CAN:

Program mikrokontrolera nr 2:
Kod mikrokontrolera nr 2 jest analogiczny – różni się jedynie ID komunikacyjnym oraz wartościami przesyłanych danych.
Nagłówek CAN:

Pętla główna, w której po naciśnięciu przycisku wysyłane są dane po CAN oraz następuje miganie diodą po otrzymaniu danych po CAN:

Ustawienia filtrów CAN:

Przedstawienie działania układu:
Mikrokontroler nr 1 oraz mikrokontroler nr 2 czytają stan przycisku, po naciśnięciu przycisku wysyłają informację po CAN do siebie o częstotliwości i ilości mignięć diodą. Częstotliwość i ilość mignięć jest inna wysyłana przez każdy z mikrokontrolerów.
Przedstawienie przesyłanych danych za pomocą konwertera USB-CAN:
Do odczytu danych wysyłanych po CAN użyłem transceivera USB-CAN od firmy Waveshare. Mikrokontroler nr 1 ma ID 0x11, zaś mikrokontroler nr 2 0x12.

Podsumowanie:
Przedstawiłem prostą implementację CAN pomiędzy dwoma mikrokontrolerami wysyłając dane dotyczące ilości oraz częstotliwości mignięć diodą. W kolejnym artykule zajmę się implementacją CAN z wykorzystaniem RTOS oraz opisaniem mechanizmów potrzebnych do użycia CAN w urządzeniach, które chcemy aby działały bezawaryjnie przez wiele lat.
Udostępniony przez autora artykuł można znaleźć na blogu DMBP.

CAN od zera część 1: Jak przesłać dane między CAN1, a CAN2 w STM32 bez użycia transceivera?
Dominik Bednarski porównuje STM32MP1 i OpenSTLinux oraz Raspberry Pi 5
Sterownik PWM: Definicja timerów w STM32 do programowych PWM oraz odczyt ADC STM32 



