Serie inDetail - komplexe Themen verständlich dargestellt

Das MCP2515 Modul für die CAN Kommunikation in Betrieb nehmen

MCP2515 CAN Controller

Das links abgebildete CAN Modul besteht aus einem TJA1050 Transceiver welcher anliegende CAN Pegel in ein serielles RX Signal und ein serielles TX Signal in entsprechende CAN Pegel umwandelt. Der TJA1050 ist nicht programmierbar. Angesteuert wird der Transceiver über eine serielle Schnittstelle von dem MCP2515 CAN Controller. Dieser ist programmierbar und übernimmt die komplette Kommunikation auf dem CAN Bus. Der über SPI angeschlossenen Mikrocontroller übergibt nur die zu sendenden Daten oder holt empfangene Nachrichten vom CAN Controller ab.

Der Controller MCP2515 mit dem nachgeschalteten TJA1050 Transceiver dient zum Senden und Empfangen von CAN Standardnachrichten mit eine Nutzlänge von 0-8 Byte (=Payload). Der Controller unterstützt sowohl den Standard Identifyer (11stellig) als auch den Extended Identifyer mit 29 Bits. Neben dem Senden von „Standard Frames“ können auch Botschaften angefordert werden (durch senden eines „Remote Frames“).

Neben diesen aktiv angestoßenen Botschaften sendet der CAN Controller selbständig "Error Frames" wenn eine Nachricht als fehlerhaft erkannt wurde und "Acknoledge Bits" zur Bestätigung eines erfolgreichen Empfangs. Auch die Berechnung, das Senden und Überprüfen der Checksumme macht der MCP2515 eigenständig.

Die Verbindung zwischen einem Mikrocontroller und dem CAN Modul läuft über eine SPI Schnittstelle. Bis zu 10 Mbit/s (10MHz) kann die eingebaute Schnittstelle übertragen. Die unterstützten SPI Modi sind 0 oder 3.

Zur besseren Übersichtlichkeit soll der Programmcode zur Steuerung des CAN Controllers in einer Klasse „MCP2515“ zusammengefasst werden. Der "Konstruktor" der Klasse der bei der Initialisierung aufgerufen wird richtet die SPI Verbindung ein.

Grundgerüst der Klasse "MCP2515" #include "SPI.h" class MCP2515 { private: byte CS; // Speichern des von Konstruktor übertragenen 'Chip Select' Pins public: // Konstruktor (Initialisierungsfunktion) MCP2515(byte cs = 10) { SPI.begin(); SPI.setDataMode(SPI_MODE0); // oder SPI_MODE3 SPI.setClockDivider(SPI_CLOCK_DIV4); // max. 10 Mhz SPI.setBitOrder(MSBFIRST); CS = cs; // Ein andere CS Pin kann optional übergeben werden pinMode(CS, OUTPUT); // Chip Select Pin für die SPI Schnittstelle konfigurieren };