CAN-Modul

in Arbeit


zurück zu Interfaces , Elektronik , Homepage


 
Einleitung

Timing

Senden

Empfangen

Interrupts




das CAN-Modul im PIC-Microcontroller 

zurück



Einleitung

Einige PICs besitzen einen integriertes CAN oder ECAN-Modul. Um sie an einen CAN-Bus anzuschließen benötigt man nur noch einen externen CAN-Treiber (Transceiver) wie z.B. den MCP2551. Das sind insbesondere die (alten) PIC18Fxx8 sowie (neueren) PIC18Fxx8x.

Für den Programmierer ist die Verwendung des CAN-Moduls zwar komplizierter als z.B. die Verwendung des ADC, aber immer noch viel einfacher als z.B. die Nutzung des USB-Moduls.

Folgende Dinge gilt es zu wissen:
nach oben

Timing

Der Takt eines CAN-Busses wird von seinem jeweiligen Designer je nach zu erwartender Datenmenge und Leitungslänge festgelegt und liegt in der Regel zwischen 100 kbps und 1 Mbps. Die Länge eines einzelnen Bits (Tbit) liegt also zwischen 10µs und 1µs.
Alle Geräte an einem CAN-Bus müssen mit dem selben Takt senden und empfangen - sie müssen synchron arbeiten. Dafür besitzt jedes Gerät einen Taktgenerator, der mit einer PLL auf den Bus synchronisiert wird. Der Taktgenerator erzeugt ein ganzzahliges Vielfaches (8-fach bis zu 25-fach) des CAN-Bus-Bit-Taktes. Durch Teiler wird daraus der CAN-Bus-Takt für dieses Gerät erzeugt. Die Periode des Taktgenerators wird als TQ bezeichnet, die Länge eines CAN-Bus-Bits dagegen Tbit.

Ein Tbit besteht aus 4 aufeinanderfolgenden Zeitabschnitten (Segmenten), die jeweils aus mehreren TQ bestehen.
  1. Sync
  2. Prop-Seg
  3. Phase-Seg-1
  4. Phase-Seg-2

Sync
Prop-Seg
Phase-Seg-1
Phase-Seg-2
Bedeutung
Synchronisation
Senden


Länge in TQ
1 - 4
1 - 8
1 - 8
1 - 8

Warum das so kompliziert gemacht wurde, ist für den Nutzer unwichtig, man muss sowieso genau das Timing des Busses einhalten, an den man sein Gerät anschließen will.
Bei der Initialisierung des CAN-Moduls müssen also die Taktrate für TQ sowie die Längen der 4 Bit-Segmente (in TQ-Einheiten) eingestellt werden.

Die Taktrate für TQ wird vom Systemtakt des PIC abgeleitet. Um sie korrekt einzustellen wird im PIC der Wert BRP eingestellt, der wie folgt errechnet wird:

BRP  = (Tbit / n * 2 * Fcan)-1

wobei n die Anzahl der TQ pro Bit ist. Die Frequenz Fcan kann entweder der interne PIC-Zyklustakt oder dessen Vierfaches (Also der Takt des PIC-Oszillators) sein. Ausgewählt wird das über das CANCKS-Bit.

Fcan = Fcy          bei CANCKS=1
Fcan = 4 * Fcy    bei CANCKS=0


nach oben

Empfangen

Jedes CAN-Gerät empfängt erst einmal jeden Datenframe vom Bus, und schiebt ihn in einen Pufferspeicher (MAB). Anschließend wird der Identifier des Dataframe ausgewertet. Dazu besitzt ein CAN-Gerät einen oder mehrere Acceptance Filter. In denen stehen alle Identifier, die für das Gerät interessant sind.

Stimmt der Identifier des gerade empfangenen Dataframe nicht mit dem Muster im Acceptace Filter überein, dann wird dieser Dataframe ignoriert und der nächste Dataframe aus dem CAN-Bus wird in den Puffer gelesen.

Stimmt aber der
Identifier des gerade empfangenen Dataframe mit dem Muster im Acceptace Filter überein, dann wird dieser Dataframe in das Empfangsregister (RXB) des Gerätes kopiert.

Somit ist garantiert, dass ein Gerät nur die Dataframes empfängt, die es auch benötigt. Nach der oben beschriebenen Methode würde ein Gerät nur Dataframes mit einem bestimmten Identifier akzeptieren. In der Realität lässt sich aber noch zusätzlich einstellen, welche Bits des Acceptance-Filters überhaupt für den Vergleichstest benutzt werden sollen. Das erfolgt mit Hilfe der Acceptance Mask. Diese enthält für jedes Bit des Identifier ein Bit bereit. Ist dieses "0", dann wird so getan, als ob Identifier und Acceptance Filter in diesem Bit identisch wären. Ist das Bit der Maske aber "1", dann werden Identifier und Acceptance Filter hier verglichen, und bei Ungleichheit der Dataframe ignoriert.

Falls  die Maske also nur Nullen enthält, dann wird jeder Dataframe mit jedem Identifier vom Gerät empfangen, egal was im Acceptance Filter steht.
CAN-receiver

In PIC-Microcontrollern gibt es zwei unterschiedliche Varianten des CAN-Moduls
  • CAN-Modul
  • ECAN-Modul

CAN-Modul
Im CAN-Modul eines PIC gibt es zwei Empfangsregister: RXB0 und RXB1. Das RXB0 hat zwei Acceptance Filter (RXF0, RXF1) während RXB1 über 4 Acceptance Filter verfügt (
RXF2, RXF3, RXF4, RXF5). Jedes Empfangsregister verfügt über eine eigene Acceptance Mask (RXM0, RXM1).
Die nebenstehende Zeichnung stellt das CAN-Modul dar.


ECAN-Modul
Das ECAN-Modul ist zum CAN-Modul abwärtskompatibel. Es kann aber in einen erweiterten Mode geschaltet werden, in dem es über 16 Acceptance Filter und 6 Sendepuffer/Empfangsregister verfügt.
Die Beschreibung des ECAN-Moduls erstreckt sich im Handbuch immerhin über 70 Seiten.
PIC-CAN-receiver

nach oben

Senden

CAN-Modul, Sender Um einen Dataframe auf den CAN-Bus zu senden, schreibt man ihn in den Sendepuffer des CAN-Moduls, um den Rest kümmert sich dann das CAN-Modul selbst.

Das CAN-Modul eines PIC verfügt über drei Sendepuffer (TXB0, TXB1, TXB2). Da immer nur ein Datafram gesendet werden kann, muss das CAN-Modul die Reihenfolge festlegen, in der die Dataframes gesendet werden sollten, wenn mehrere Sendepuffer beschrieben wurden. Dafür  besitzt jeder Sendepuffer einen 2-bitigen Prioritätswert. Der Sendepuffer mit dem höchsten Prioritätswert wird zuerst gesendet. Sind die Prioritäten gleich, dann wird der Puffer mit der höchsten Nummer vorgezogen.
Das nebenstehende Bild zeigt den Sendeteil eines CAN-Moduls, das ECAN-Modul besitzt Modes mit bis zu 6 Sendepuffern.


Ein Gerät kann ein anderes Gerät auffordern, etwas zu senden. Dafür sendet es ein Transmit Request auf den Bus. Das ist ein Dataframe ohne Daten, dessen Identifier einer bestimmten Gerätenummer entspricht. Man bezeichnet ihn deshalb auch als Remote-Frame.

nach oben

Interrupts

Wie in Microcontrollern üblich, können jede Menge Ereignisse Interrupts auslösen. Das CAN-Modul kennt 8 unterschiedliche Interruptarten, die wie üblich einzeln mit Interruptflag-Bits und Interrupt-Enable-Bits versehen sind.
Das oben angesprochene CAN-Modul-Fehlermanagement, zählt die beim Senden und Empfangen auftretenden Fehler mit, und löst beim Überschreiten bestimmter Fehlerzahlen ERRIF aus.


nach oben

zurück zu Interfaces , Elektronik , Homepage

Autor: sprut
erstellt: 15.01.2008
letzte Änderung: 20.01.2008