MCP2515-CAN-Controller


1 Zusammenfassung

Dieses Tutorial beschreibt die Realisierung einer MCP2515-CAN-Schnittstelle als 3,3 V-Logik für die MSP430-Serie von Texas Instruments. Als Mikrocontroller wird der MSP430G2553 verwendet. Dieser ist auf den Launchpad EXP430G2 Revision 1.5 aufgebaut. Für das EXP430G2 wird eine Erweiterung in Form eines Shields entwickelt, worauf als CAN-Kontroller der MCP2515 von Microchip eingesetzt wird. Das Tutorial richtet sich eher an Anwender der MSP430-Serie. Jedoch sollte die Bibliothek “mcp2515.c“ Mikrocontroller unabhängig sein.

Im dem Tutorial wird nicht auf die Grundlagen des CAN-Protokolls eingegangen, da es sehr viel (ausgezeichnete) Literatur dazu schon gibt. Am Ende des Tutorial wird weiterführende Literatur vorgestellt.

1.1 Hardware

Der Schaltplan und Layout für das EXP430G2 wurden beide mit Eagle erzeugt (eagle-msp430-mit-mcp2515). Die Abbildung 1 stellt links den Schaltplan und recht das Layout vom Shield dar.

MSP430-CAN-Shield

Abb. 1: Schaltung und Layout für das MCP2515-CAN-Shield

1.2 Software

Für die Software würde die IAR-Entwicklungsumgebung genutzt (iar-mcp2515-beispielcode). Der Quellcode ist 1,56 kB Groß und kann noch mit der Kickstart-Version von IAR (maximal 8 kB) abgespielt werden. Die Software zum MCP2515-CAN-Shield ist wie folgt unterteilt:

Tab. 1: Unterteilung der MCP2515-CAN-Software

Bibliothek Funktion
main.c Hauptprogramm des Projekts, beinhaltet ein Anwendungsbeispiel zum Senden und Empfangen von Nachrichten mit 250 kBit/s
mcp2515.c Alle Funktionen und Defines der MCP2515-CAN-Bibliothek

 


2 Hardware

Die hier eingesetzten Mittel werden in Tabelle 2 zusammengefasst.

Tab. 2: Eingesetzte Hard- und Software

Mittel Typ Notiz
MSP-EXP430G2 Rev. 1.5 Hardware Launchpad von Texas Instruments
IAR – MSP430 Software Entwicklungsumgebung für die MSP430-Serie

Es wird das Launchpad von Texas Instruments MSP-EXP430G2 Revision 1.5 (http://www.ti.com/tool/msp-exp430g2) genutzt. Darauf wird der Mikrocontroller MSP430G2553 eingesetzt.

Das Hier entstehende EXP430G2-Shield ist Steckbar auf den Launchpad und sollte, wie auf der Abbildung 2 zu sehen, montiert werden.

MCP2515-CAN-Shield fürs Launchpad

Abb. 2:Launchpad zusammen mit EXP430G2-Shield für MCP2515-CAN

Als Software wird die kostenlose IAR-Kickstartversion von Embedded Workbench genutzt (http://www.ti.com/tool/iar-kickstart). Die kostenlose Lizenz kann für Quellcode bis 8 kB eingesetzt werden. Eine andere kostenlose alternative ist das Programm: Code Composer Studio von Texas Instruments.

Das Blockschaltbild der Hardware ist in Abbildung 3 dargestellt

MSP430-CAN-Shield Blockschaltbild

Abb. 3: Blockschaltbild EXP430G2-Shield

Das EXP430G2-Shield ist rechts und das Launchpad links im Bild zu sehen. Das Shield hat auf der Unterseite eine Buchsenleiste im gleichen Raster wie das Launchpad. Somit kann das Shield einfach auf das Launchpad montiert werden (vgl. auch Abbildung 2). Die Versorgung (3,3 V und GND) übernimmt das Launchpad. Außerdem werden die SPI- (MOSI, MISO und SCK), der CS- und ein Interrupt-fähiger-Pin zum Shields weitergeführt. Die SPI-Pins steuern den CAN-Kontroller an, welcher daraufhin mit dem CAN-Transceiver verbunden ist. Nach dem CAN-Transceiver wird noch eine Terminierung in Form eines 120 Ω Widerstands benötigt, bevor abschließend über der Sub-D-Buchse auf die CAN-Leitungen (CANL und CANH) zugegriffen werden kann. Des Weiteren zeigen die grüne LED die Versorgung und die rote LED ob eine Information via CAN empfangen wurde an.

Die nachfolgende Abbildung zeigt den Schaltplan des EXP430G2-Shields.

MCP2515-CAN-Ersatzschaltbild

Abb. 4: Schaltplan MCP2515-CAN-Shield

Zu beachten ist, dass alle Bauteile des EXP430G2-Shields mit den 3,3 V aus dem Launchpad versorgt werden. Für CAN werden ein Kontroller und ein Transceiver benötigt. Als Kontroller wird der MCP2515 genutzt, welcher das CAN-Protokoll erstellt. Darunter sind das Erstellen des CAN-Frames, die Filterung und Überprüfung (CRC-Prüfsumme) von Daten, die Behandlung von Error-Frames und das Versenden von Frames zu verstehen. Dieser wird via SPI über die Leitungen MCP_CS, MCP_SCK, MCP_MISO und MCP_MOSI angesteuert. Der Pin MCP_INT (Pin 12) löst ein Interrupt beim MCP2515 aus und ist mit einem Interrupt-Pin des MSP430G2553 verbunden. Der Pin 12 ist „Inactive High“, was heißt, dass dieser um 3,3 V seien wird, solange der Controller keine Nachricht empfangen hat. Der CAN-Kontroller benötigt zusätzlich einen externen Takt, diesen liefert der 16 MHz Quarz [1].

Als Transceiver wird der SN65HVD231D genutzt. Dieser hat die Eigenschaft, dass als Betriebsspannung 3,3 V ausreichen. Es existieren nicht viele Transceiver die mit 3,3 V auskommen (alternativen dazu findet man bei Texas Instruments). Der Transceiver hat die Aufgabe, die CAN-Information für den CAN-Bus bereitzustellen. Der Widerstand R12 soll den Chip für den High-Speed-Mode einstellen. Bei diesem Modus versucht der Transceiver, den Ausgang so schnell wie möglich – ohne interne Begrenzungen – zu schalten. Alternativ kann der Slope-Control-Mode genutzt werden, wenn bei der Anwendung EMV-Probleme erwartet werden. Das verbesserte EMV-Verhalten kommt daher, dass der Transceiver die Flanken langsamer schaltet (scharfe Flanken und schnelle Taktraten verschlechtern das EMV-Verhalten). Außerdem wird der Widerstand R13 für die Terminierung der Leitung benötigt [2]. Abschließend kann über den 9-poligen Sub-D-Stecker (nach CiA® 102) auf die CAN-Leitungen zugegriffen werden.

Die Pinbelegung der 9-poligen Sub-D-Buchse sieht wie folgt aus:

CAN D-Sub Pinbelegung

Abb. 5: Pinbelegung CAN-Buchse nach CiA® 102

 


3 Software

Für das IAR-Projekt sind 3 Dateien zu finden. Diese sind:

  • “main.c“ welche das Hauptprogramm beinhaltet und
  • “mcp2515.h“ / “mcp2515.c“ welche zusammen die MCP2515-CAN-Bibliothek erzeugen und für die Kommunikation und Interpretation des MCP2515 zuständig sind.

 3.1 “main.c“

Im Hauptprogramm (main) ist ein Beispiel fürs Empfangen und Senden von Nachrichten via CAN implementiert. Dazu wird ein Echo, daher die Information die der Mikrocontroller empfängt wird direkt zurück, gesendet.  Das nachfolgende Flussdiagramm soll das Hauptprogramm verdeutlichen. Wobei das Flussdiagramm der Durchnummerierung vom Quellcode folgt.

MSP430-CAN-Software Flussdiagramm Main

Abb. 6: Flussdiagramm der “main.c“ – (i) Main-Funktion, (ii) IR-Funktion bei empfangenen Datensatz

In der Abbildung sind links die Main- und rechts die IR-Funktion dargestellt. Um das Programm bei der Main-Funktion (Abb. 6 – i) zu starten, muss zuerst der Watchdog-Timer unterbrochen werden (Punkt 1). Daraufhin wird die Frequenz des Mikrocontroller eingestellt (Punkt 2). Anschließend werden der Pin für die LED-Ansteuerung und der Port 1 (Pin P1.4) für einen Interrupt bei fallender Flanke initialisiert. Des Weiteren wird im vierten Punkt die SPI-Schnittstelle, der MCP2515 – da SPI initialisiert wurde, kann mit dem MCP2515 interagiert werden – die globale CAN-Variable und die Interrupts aktiviert (für IR-Port 1 wichtig). Abschließend folgt die Endlosschleife, bei der der Mikrocontroller im Sekundentakt die LED 2 des Launchpads toggelt.

Wenn nun eine Information über CAN empfangen wird, setzt MCP2515-CAN-Kontroller seinen IR-Pin (Pin 12) auf „Low“. Dies kriegt der Mikrocontroller mit, da der Pin mit dem IR-Port 1 verbunden ist und löst daraufhin ein Interrupt aus. Der Interrupt unterbricht den Hauptfluss der Main-Funktion. Es wird nun die IR-Funktion (Abb. 6 – ii) abgearbeitet. Die Funktion lies zuerst den Empfangskanal des CAN-Kontrollers aus, wartet 10 ms und sendet die Empfangene Information wieder über CAN zurück (Echo). Nun muss der IR zurückgesetzt werden, indem das entsprechen Flag gelöscht wird. Abschließend kehrt das Programm zur Main zurück und toggelt weiterhin  die LED.

3.2 “mcp2515.c“

Die Bibliothek kümmert sich um die Ansteuerung des MCP2515-CAN-Kontrollers. Diese ist in Header- und Source-Datei aufgeteilt. Die Header beinhaltet: Registernamen, Prototypen, Struct (Zusammenfassung verschiedener Datentypen in einen eigen erzeugten Datentyp) der CAN-Variable und Pin-Bezeichnungen. In der Source-Datei dagegen sind alle Funktionen der Bibliothek zu finden.

In Tabelle 3 sind zusammengefasst alle Funktionen der MCP2515-CAN-Bibliothek.

Tab. 3: Funktionen und deren Beschreibung für die“mcp2515.c“

Funktion Beschreibung
MCP2515_SPI_init()* Initialisiert die SPI-Schnittstelle des Mikrocontrollers.
MCP2515_SPI_transmit()* Senden und Empfangen von Nachrichten über die SPI Schnittstellen.
MCP2515_spi_test() Testet ob die Kommunikation von Mikrocontroller und MCP2515 korrekt verläuft. Falls nicht gibt die Funktion 1 zurück, sonst 0.
MCP2515_reset() Software-Reset des MCP2515. Da der Reset-Pin dauerhaft über einem Pull-Up auf High ist, ist dies die einzige Möglichkeit den MCP2515 in diesem Projekt zu Reseten.
MCP2515_CanVariable_init() Initialisiere die Variable des can_t (strukt für die CAN-Variable) mit Anfangswerte.
MCP2515_init() Initialisiert den MCP2515. Es werden Sachen wie, Baudrate, Filter, Sende und Empfangskanal eingestellt.
MCP2515_bit_modify() Hier werden nur bestimmte Bits gesetzt bzw. gelöscht. Welche Bits manipuliert werden sollen, wird aus der Maske bestimmt. Die  Bits die bei der Maske auf High sind, werden bearbeitet.
MCP2515_write() In einem einzelnen Register des MCP2515 über SPI Schreiben
MCP2515_write_many_registers() Um mehrere Register des MCP2515 mit einem Befehl zu beschreiben.
MCP2515_write_id() Beschreibt die ID für das CAN-Frame was verschickt werden soll.
MCP2515_read() Liest ein einzelnes Register aus.
MCP2515_read_many_registers() Liest mehrere Register des MCP25115 aus
MCP2515_read_id() Liest die ID für das CAN-Frame was empfangen wurde.
MCP2515_can_tx0() CAN-Sende-Kanal 0 (von 3). Zum Senden eines CAN-Frames (ID, RTR und Daten).
MCP2515_can_tx1() CAN-Sende-Kanal 1 (von 3). Zum Senden eines CAN-Frames (ID, RTR und Daten).
MCP2515_can_tx2() CAN-Sende-Kanal 2 (von 3). Zum Senden eines CAN-Frames (ID, RTR und Daten).
MCP2515_can_rx0() CAN-Empfangs-Kanal 0 (von 2). Zum Empfangen eines CAN-Frames (ID, RTR und Daten).
MCP2515_can_rx1() CAN-Empfangs-Kanal 1 (von 2). Zum Empfangen eines CAN-Frames (ID, RTR und Daten)..
* Diese Funktion muss angepasst  werden falls ein anderer Mikrocontroller genutzt wird.

Wenn ein Anwender einen anderen Mikrocontroller als den MSP430G2553 nutzen möchte, dann muss dieser folgende Änderungen vornehmen:

  • Funktion MCP2515_SPI_init() bearbeiten (vgl. auch Tabelle 3)
  • Funktion MCP2515_SPI_ transmit () bearbeiten (vgl. auch Tabelle 3)
  • Die Defines MCP2515_CS_LOW und MCP2515_CS_High bearbeiten (in der ”mcp2515.h” zu finden)

Was sicherlich ein Anwender ändern muss, ist die gewünschte Baudrate. Im Beispielprogramm wird 250 kBit/s genutzt. Generell sollten die Änderungen die den MCP2515 betreffen (Filter, Baudrate, Kanal, usw.) in der Funktion MCP2515_init() eingestellt werden. Im Source-Code der Funktion ist zusätzlich gegeben, auf welche Seiten des Datenblattes sich das jeweilige Register befindet.

Folgende Einstellungen sind üblich:

  • IC einstellen (z.B. um den Konfigurationsmodus des MCP2515 zu starten)
  • Timing (Baudrate)
  • Filter

Als Default startet der MCP2515-CAN-Kontroller mit folgenden Einstellungen:

  • Baudrate 250kBit/s
  • Empfangskanal für RX0 und RX1 aktiviert
  • Sende nur über TX0
  • Deaktiviere RXnBF (verhindert das ein Interrupt davon ausgelöst wird)
  • Deaktiviere RTS Pins (verhindert das ein Interrupt davon ausgelöst wird)
  • Interrupt des INT-Pins erlauben

Die schwierigste Einstellung für einen Anwender ist die für die Baudrate. Jedoch macht es uns Microchip leicht, indem diese ein Programm  entwickelt haben, welcher die Berechnungen für das Timing (http://www.intrepidcs.com/support/mbtime.htm) übernimmt.

Die Vorgehensweise sollte wie folgt sein:

  • Programm installieren
  • Programm als Administrator starten
  • Frequenz und Baudrate einstellen (vgl. Abb. 7, Schritt 3)
  • Button für weiter drücken (vgl. Abb. 7, Schritt 4)
Microchip CAN Bit Timing Calculator: Time Quanta berechnen

Abb. 7: Time Quanta berechnen – Schritt 3 und 4

  • Nun öffnet sich ein neues Fenster. Hier kann direkt weitergefahren werden oder optional – falls mehrere zur Auswahl stehen – ein Time Quanta entfernen (vgl. Abb. 8).
Time Quanta berechnen Microchip CAN Bit Timing Calculator

Abb. 8: Time Quanta berechnen – Schritt 5

  • Falls mehrere Time Quanta (nichts beim vorigen Punkt entfernt) vorhanden sind, dann kann optional ein Time Quanta ausgewählt werden. Abschließen auf Button „Generate Report…“ drücken (vgl. Abb. 9).
Time Quanta berechnen Microchip CAN Bit Timing Calculator

Abb. 9: Time Quanta berechnen – Schritt 6

  • Nun öffnet sich auf den Standartbrowser des PC das Ergebnis (vgl. Abb. 10). Am Ende der Seite unter „Configuration Register Setup (PIC18/MCP251X)“ die Registerwerte ablesen.
Time Quanta berechnen Microchip CAN Bit Timing Calculator

Abb. 10: Time Quanta berechnen – Schritt 7

  • Abschließend nun die Werte in der Funktion MCP2515_init() aktualisieren (vgl. Abb. 11).
Funktionen zum Einstellen des MCP2515

Abb. 11: Funktion MCP2515_init() – Einstellungsbereich Time Quanta


4 Tests

Die MSP430-CAN-Bibliothek wurde verschiedenen Software-Tests, für den High-Speed-Mode des Transceivers und Standart-ID des CAN-Kontrollers, unterzogen. Getestet wurden verschiedene Baudraten, Kanäle zum Senden und Empfangen von CAN-Nachrichten und Mikrocontroller. Die nachfolgende Tabelle fasst die Ergebnisse der Tests zusammen:

Tab. 4: Software-Tests der MCP2515-CAN-Bibliothek

Parameter Wert Notiz
Baudrate 10, 125, 250 und  500 kBit/s Einwandfrei – Um Baudraten schneller als 125 kBit/s zu erreichen wird zwingend ein Quarz mit 16 MHz benötigt.
Sendekanal TX0, TX1, TX2 Einwandfrei
Empfangskanal RX0, RX1 Kanal RX0 Einwandfrei.

Der Kanal RX1 bekommt anscheinend nur einen Wert, falls Kanal RX0 voll ist.

Mikrocontroller MSP430G2553

MSP430F5340

MSP430F5359

Einwandfrei – Aus diesem Projekt

Einwandfrei – Aus privaten Projekt

Einwandfrei – Aus privaten Projekt

 


5 Weiterführende Quellen

 


6 Literatur

[1] Datenblatt MCP2515, Microchip, 2005
[2] Datenblatt SN65HVD231D, Texas Instruments, 2015

Bewertung

Bitte bewerten Sie den Beitrag, Ihre Bewertung hilft mir sehr die Beiträge zu verbessern!

1 Star2 Stars3 Stars4 Stars5 Stars (4 votes, average: 5,00 out of 5)
Loading...

Kontakt-Formular

Sie haben Fragen zu dem Tutorial?

Dann schreiben Sie mir einfach eine Nachricht über folgendes Formular oder senden Sie mir eine E-Mail.