STM8S208 - “beCAN” Controller


CAN Identifier Hardware Filter

Das Konzept des CAN-Busses kennt keine Sende- bzw. Zieladressen. Statt dessen wird im CAN-Rahmen ein „Identifier“ (ID) übertragen der den Inhalt der Nachricht hinsichtlich ihres Inhalts identifiziert. Die einzelnen „Nodes“ (Bus Teilnehmer) benötigen nur die Nachrichten die für die jeweilige Funktion (Applikation) von Bedeutung sind und müssen deshalb auf Grund der CAN-ID (CAN Identifier) die für sie wichtigen Nachrichten auf dem Bus herausfiltern.

Da die CAN IDs entweder 11-Bit (Standard) oder 29-Bit (Extended) lang sind, ist eine Dekodierung per Software relativ aufwändig und zeitraubend.

CAN Filter Bänke

Die „Filter“ Funktion kann im beCAN (wie auch in anderen CAN Controller Implementierungen) von der Hardware übernommen werden, um die Belastung des Prozessors zu minimieren. Gefiltert wird über entsprechende Filter-Bänke die aus jeweils 8 Registern, CAN_FxRn [8..1] zu je 8 Bit bestehen. Diese Filter sind paarweise in drei Filter-Bänken über das „Page Mapping“ in das Speicherfenster einblendbar und können über die „Page-Select “ „PS“ Bits entsprechend ausgewählt werden.

CAN_Acceptance Filter - Filter Bänke Adressierung in CAN_PSR
Acceptance Filter Filter Nummer Page (Seite) PS2 PS1 PS0
Acceptance Filter Bank 0 Filter 0 und Filter 1 2 0 1 0
Acceptance Filter Bank 1 Filter 2 und Filter 3 3 0 1 1
Acceptance Filter Bank 2 Filter 4 und Filter 5 4 1 0 0

Der jeweilige Inhalt der Filter-Register ist nicht fest zugeordnet, sondern wird je nach der Konfiguration des Filters definiert. Dabei besteht die Möglichkeit einzelne Identifier (ID-Adressen) oder ganze ID-Bereiche durch „Maskierung“ vorzugeben. Die Filter-Bänke können in:

  • 2 x 32 Bit Masken oder Identifier
  • 4 x 16 Bit Masken oder Identifier
  • 2 x 16 Bit + 4 x 8 Bit Masken oder Identifier
  • 8 x 8 Bits Masken oder Identifier
  • aufgeteilt werden. Die Beschreibung dazu folgt in den nachfolgenden Punkten.

    Die Filter-Bank Paare sind nach folgendem Schema (hier im Beispiel die "Page 2") aufgebaut:

    beCAN Filter Bänke (in Page 2, 3 und 4) nur wenn PSR = 2, 3 oder 4 ist
    Filter Bank Basis Adresse : (0x00.5428h)(Adresse im STM8S208)
    Offset Register Name Inhalt andere Pages (Seiten)
    0x00h CAN_F0R1 Filter 0, Register 1 in Page 3: Filter 2 , in Page 4: Filter 4
    0x01h CAN_F0R2 Filter 0, Register 2 in Page 3: Filter 2 , in Page 4: Filter 4
    0x02h CAN_F0R3 Filter 0, Register 3 in Page 3: Filter 2 , in Page 4: Filter 4
    0x03h CAN_F0R4 Filter 0, Register 4 in Page 3: Filter 2 , in Pagek 4: Filter 4
    0x04h CAN_F0R5 Filter 0, Register 5 in Page 3: Filter 2 , in Page 4: Filter 4
    0x05h CAN_F0R6 Filter 0, Register 6 in Page 3: Filter 2 , in Page 4: Filter 4
    0x06h CAN_F0R7 Filter 0, Register 7 in Page 3: Filter 2 , in Page 4: Filter 4
    0x07h CAN_F0R8 Filter 0, Register 8 in Page 3: Filter 2 , in Page 4: Filter 4
    0x08h CAN_F1R1 Filter 1, Register 1 in Page 3: Filter 3 , in Page 4: Filter 5
    0x09h CAN_F1R2 Filter 1, Register 2 in Page 3: Filter 3 , in Page 4: Filter 5
    0x0Ah CAN_F1R3 Filter 1, Register 3 in Page 3: Filter 3 , in Page 4: Filter 5
    0x0Bh CAN_F1R4 Filter 1, Register 4 in Page 3: Filter 3 , in Page 4: Filter 5
    0x0Ch CAN_F1R5 Filter 1, Register 5 in Page 3: Filter 3 , in Page 4: Filter 5
    0x0Dh CAN_F1R6 Filter 1, Register 6 in Page 3: Filter 3 , in Page 4: Filter 5
    0x0Eh CAN_F1R7 Filter 1, Register 7 in Page 3: Filter 3 , in Page 4: Filter 5
    0x0Fh CAN_F1R8 Filter 1, Register 8 in Page 3: Filter 3 , in Page 4: Filter 5

    CAN ID-Filter Konfiguration

    Die Konfiguration der Filter erfolgt über die bereits erwähnte „Diagnose Register Page“ , die elf weitere 8 Bit Register beinhaltet. Diese Seite (Page 6) ist über die Adresse 0x110b in den „PS“ Bits selektierbar.

    CAN Konfiguration/Diagnose (Paging Adressen)
    Mailbox/Pages   Page (Seite) PS2 PS1 PS0
    Configuration/Diagnostics „Register“ Auswahl 6 1 1 0

    Die Konfigurations und Diagnose Register Bank ist nachfolgend beschrieben und beinhaltet die Register CAN_MFR1 und 2, sowie CAN_FCR1, 2 und 3 (in nachfolgender Tabelle in grün hinterlegt):

    beCAN Konfiguration/Diagnose Register ( Page 6) nur wenn PSR = 6 ist
    Konfig./Diagnose Register Map : (0x00.5428h) + Offset (Basis-Adresse im STM8S208)
    Offset Register Name Inhalt Beschreibung
    0x00h CAN_ESR Fehler Diagnose: Status Fehler (Error) Status Register
    0x01h CAN_EIER Fehler Diagnose: Interrupt Fehler (Error) Interrupt Register
    0x02h CAN_TECR Fehler Diagnose: Senden Sende Fehler Zähler / Transmit Erro Counter
    0x03h CAN_RECR Fehler Diagnose: Empfangen Empfangs Fehler Zähler / Receive Error Counter
    0x04h CAN_BTR1 Bit Timing Register 1 Zeit Quanten Dauer, Sprungweite
    0x05h CAN_BTR2 Bit Timing Register 2 Zeit Quanten Anzahl
    0x06h reserviert
    0x07h reserviert
    0x08h CAN_FMR1 Filter Mode Register 1 "Mask" oder "Identifier List" Modus [3..0]
    0x09h CAN_FMR2 Filter Mode Register 2 "Mask" oder "Identifier List" Modus [5..4]
    0x0Ah CAN_FCR1 Filter Configuration Register 1 Filter Skalierung und Aktivierung [1/0]
    0x0Bh CAN_FCR2 Filter Configuration Register 2 Filter Skalierung und Aktivierung [3/2]
    0x0Ch CAN_FCR3 Filter Configuration Register 3 Filter Skalierung und Aktivierung [5/4]

    Filter Konfiguration (CAN_FCRn)

    Jedes Filter kann einzeln aktiviert bzw. deaktiviert werden. Die „FACTx“ Bits aktivieren die korrespondierenden Filter wenn sie auf "1" gesetzt werden, andernfalls ist das jeweilige Filter deaktiviert.

    Um eine Filter-Bank (CAN_FxR Register) zu konfigurieren muß diese über das „FACT“ Bit deaktiviert sein !

    CAN_FCR1 Register - Filter Configuration Register 1                                             (0x00.5432h nur wenn PSR = „0x110b“ )
    Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    CAN_FCR1 reserv. FSC11 FSC10 FACT1 reserv. FSC01 FSC00 FACT0

    Im CAN_FCR1 Register werden die beiden Filterbänke 0 und 1 freigeschaltet bzw. deren Scale Configuration definiert.

    CAN_FCR2 Register - Filter Configuration Register 2                                             (0x00.5433h nur wenn PSR = „0x110b“ )
    Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    CAN_FCR2 reserv. FSC31 FSC30 FACT3 reserv. FSC21 FSC20 FACT2

    Im CAN_FCR2 Register werden die beiden Filterbänke 2 und 3 freigeschaltet bzw. deren Scale Configuration definiert.

    CAN_FCR3 Register - Filter Configuration Register 3                                             (0x00.54 34h nur wenn PSR = „0x110b“ )
    Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    CAN_FCR3 reserv. FSC51 FSC50 FACT5 reserv. FSC41 FSC40 FACT4

    Im CAN_FCR3 Register werden die beiden Filterbänke 4 und 5 freigeschaltet bzw. deren Scale Configuration definiert.

    Scale Configuration bits FSCx[1..0]

    Die „Scale Configuration“, sprich die nachfolgend beschriebene Aufteilung in 8-Bit, 16-Bit oder 32-Bit Filter, wird mit diesen beiden Bits konfiguriert. "x" steht dabei für die Filter-Nummer.

    Filter Aktivierungs Bits FACTx

    Die FACT Bits schalten die jeweiligen Filterbänke frei („1“ = aktiv). Um die Filtereinstellungen in den Filterregistern zu modifizieren muß die Filterbank über das entsprechende FACT-Bit deaktiviert werden.

    Die “FSCxm” Bits, jeweils 2 Bits pro Filter Bank, definieren die Filter Konfiguration.

  • Das „x“ im Registernamen bezieht sich wieder auf die Filter-Bank (0 ..5), also z.B. FSC30 = Bank "3", Bit "0".
  • Der Index „m“ definiert die Modus-Bits der entsprechenden Bank. Die beiden Bits ergeben nachfolgende Einstellungen:
  • CAN_Filter Modus / Konfiguration in 32 Bit, 16 Bit oder 8 Bit Identifier bzw. Masks
    Modus Filterbreite Anzahl Filter Identifier Bit Bereich FSCx1 FSCx0
    8-Bit Filter Bank 8 Bit 8 STID[10..3]/EXID[28..21] 0 0
    16/8 Bit Filter Bank 16 Bit 2 STID[10..0]/EXID[28..15] 0 1
    8 Bit 4 STID[10..3]/EXID[28..21]
    16 Bit Filter Bank 16 Bit 4 STID[10..0]/EXID[28..21] 1 0
    32 Bit Filter Bank 32 Bit 2 STID[10..0]/EXID[28..0] 1 1

    CAN_FMR1 und CAN_FMR2

    Die beiden Filter Mode Register CAN_FMR1 und CAN_FMR2 beinhalten die „ CAN_FMLx“ und „CAN_FMHx“ Bits für die sechs Filterbänke.

    Die beiden Register definieren ob die Filter-Bänke im „Identifier Modus“ oder im „ Mask Modus“ verwendet werden. Dazu sind für jede Filter-Bank zwei Bits definiert die als „FMHx “ und „FMLx“ bezeichnet werden.

    CAN_FMR1 Register - Filter Mode Register 1                                            (0x00.5430h nur wenn PSR = „0x110b“ )
    Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    CAN_FMR1 FMH3 FML3 FMH2 FML2 FMH1 FML1 FMH0 FML0
    CAN_FMR2 Register - Filter Mode Register 2                                            (0x00.5431h nur wenn PSR = „0x110b“ )
    Register Name Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
    CAN_FMR2 reserv. reserv. reserv. reserv. FMH5 FML5 FMH4 FML4

    FMHx“ spezifiziert dabei den Modus der „Higher“ -Register (oberes) und „FMLx“ die „ Lower“-Register (unteres), wobei in allen beschriebenen Bits, „x“ die Nummer der Filter-Bank definiert. Die als „obere“ und als „untere“ Register bezeichneten Teile einer Register Bank sind für die verschiedenen Filter Modi unterschiedlich zugeordnet.

    32 Bit Filter Einstellung - (FSCx1 = 0, FSCx0 = 0)

    In dieser Einstellung können einzelne Nachrichten bezüglich ihres CAN Identifiers eindeutig identifiziert werden, d.h in einem 32 Bit Filter sind die CAN-IDs für 29 Bit Identifier komplett enthalten und können, falls gewünscht, eine einzelne CAN-ID identifizieren. Im 32 Bit Filter Modus müssen die „FMHx“ und „FMLx“ Bits den gleichen Wert haben (entweder 0x00b oder 0x11b).

    32 Bit Filter Konfig. Konfig.
    Ext. ID [28..21] [20..18] RTR IDE [17..15] [14..7] [6..0] 0 FMHx = 0

    FMLx = 0

    FMHx = 1

    FMLx = 1

    Std. ID [10..3] [2..0]                  
    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                                                     
    CAN_FxR1 CAN_FxR2 CAN_FxR3 CAN_FxR4 ID n ID n
    CAN_FxR5 CAN_FxR6 CAN_FxR7 CAN_FxR8 M ID n+1
  • ID = die Werte in den CAN-FxR Registern werden als „Identifier“ verglichen.
  • M = die Werte in den CAN_FxR Registern werden als "Maske" benutzt.
  • n = die fortlaufende "Filter Nummer" die bei der Konfiguration angelegt wird.
  • „Maskierung“ der ID

    Wird über die „FMHx“ und „FMLx“ Bits = „0“ die Bank als „masked“ definiert, so ist die obere Hälfte der 32-Bit Filter Bank (CAN_FxR5... CAN_FxR8) die „Maske“ (M). Die maskierten Werte werden weiter mit den empfangenen IDs verglichen, während die verbleibenden Bits für den Vergleich nicht mehr relevant sind.

    32 Bit Filter Konfig.
    Ext. ID [28..21] [20..18] RTR IDE [17..15] [14..7] [6..0] 0 FMHx = 0

    FMLx = 0

    Std. ID [10..3] [2..0]                  
    Laufende
    Filter Nummer
    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    CAN_FxR1 CAN_FxR2 CAN_FxR3 CAN_FxR4 ID n
    1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0
    CAN_FxR5 CAN_FxR6 CAN_FxR7 CAN_FxR8 M
    1 1 1 1 1 1 1 1 1 1 1 0 X 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0
    Die resultierenden ID-Bits müssen zutreffen
    1 0 0 0 1 0 1 1 0 1 0 X X X X X X X X X X X 0 0 1 0 1 1 1 1

    Dieses 32-Bit Filter Register beinhaltet einen "Identifier" in CAN_FxR[4:1] plus eine "Maske" in CAN_FxR[8:5].

    „Identifizierung“ der ID

    Sind „FMHx“ und „FMLx“ Bits = „1“ so befindet sich das Filter im „Identifier“ Modus (ID) und die beiden Hälften (jeweils 4 Byte) der Filter-Bank stellen je einen eigenständigen „Identifier“ dar, der nur bei einem eindeutigen Treffer aller Identifier-Bits akzeptiert wird.

    In der Filter-Liste werden in diesem Fall zwei Filter-Nummern eingetragen die auf die beiden Filter eien Referenz bilden.

    32 Bit Filter Konfig.
    Ext. ID [28..21] [20..18] RTR IDE [17..15] [14..7] [6..0] 0 FMHx = 1

    FMLx = 1

    Std. ID [10..3] [2..0]                  
    Laufende
    Filter Nummer
    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    CAN_FxR1 CAN_FxR2 CAN_FxR3 CAN_FxR4 ID n
    1 0 0 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0
    CAN_FxR5 CAN_FxR6 CAN_FxR7 CAN_FxR8 ID n+1
    1 1 1 1 1 1 1 1 1 1 1 0 X 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0

    In diesem Beispiel eines 32-Bit Filter Registers beinhaltet dieses zwei eindeutige IDs in den "oberen" bzw. "unteren" CAN_FxRm Registern

    16 Bit Filtereinstellung - (FSCx1 = 1, FSCx0 = 0)

    Im 16 Bit Filter Modus stehen maximal 4 Filter mit jeweils 16 Bit zur Verfügung, für die Identifier Bits EXID[28..15] einer „extended ID“ bzw. alle 11 Bit (STID[10..0]), einer „standard ID“ überwachen.

    Diese Filter können ebenfalls in „Identifier“ bzw. in „Masken“ aufgeteilt werden. Für die Aufteilung zeichnen wieder die korrespondierenden „FMHx“ und „FMLx“ Bits der entsprechenden Bank („x“) verantwortlich.

    16 Bit Filter Konfig. Konfig. Konfig. Konfig.
    Ext. ID [28..21] [20..18] RTR IDE [17..15] FMHx = 0

    FMLx = 0

    FMHx = 0

    FMLx = 1

    FMHx = 1

    FMLx = 0

    FMHx = 1

    FMLx = 1

    Std. ID [10..3] [2..0]      
    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    CAN_FxR1 CAN_FxR2 ID n ID n ID n ID n
    CAN_FxR3 CAN_FxR4 M ID n+1 M ID n+1
    CAN_FxR5 CAN_FxR6 ID n+1 ID n+2 ID n+1 ID n+2
    CAN_FxR7 CAN_FxR8 M n+2 M ID n+2 ID n+3

    Die Behandlung der "Mask" bzw. "Identifier" Einstellung erfolgt äquivalent zur Beschreibung bei den 32-Bit Filtern unter 8.4

     

    16 Bit/8 Bit Filtereinstellung (FSCx1 = 0, FSCx0 = 1)

    Eine weitere Einstellungsmöglichkeit zur Aufteilung der Filter besteht darin zwei 16 Bit Filter plus vier 8 Bit Filter anzulegen. Während die 16 Bit Filter wie eben beschrieben nur die Identifier Bits EXID[28..15] einer „extended ID“ bzw. alle 11 Bit (STID[10..0]), einer „standard ID“ überwachen, sind die 8 Bit Filter auf die EXID[28..21] einer „extended ID“ bzw. die STID[10..3] Bits beschränkt.

    Auch im 16/8 Bit Modus ist wahlweise eine direkte Zuordnung von „Identifier“ oder von Paaren von „Identifier“ und „Masken“ möglich.

    16/8 Bit Filter Konfig. Konfig. Konfig. Konfig.
    Ext. ID [28..21] [20..18] RTR IDE [17..15] FMHx = 0

    FMLx = 0

    FMHx = 0

    FMLx = 1

    FMHx = 1

    FMLx = 0

    FMHx = 1

    FMLx = 1

    Std. ID [10..3] [2..0]      
    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    CAN_FxR1 CAN_FxR2 ID n ID n ID n ID n
    CAN_FxR3 CAN_FxR4 M ID n+1 M ID n+1
    CAN_FxR5 ID n+1 ID n+2 ID n+1 ID n+2
    CAN_FxR6 M n+2 M ID n+2 ID n+3
    CAN_FxR7 ID n+3 ID n+3 ID n+3 ID n+4
    CAN_FxR7 M n+4 M ID n+4 ID n+5

     

    8 Bit Filtereinstellung (FSCx1 = 0, FSCx0 = 0)

    Der letzte der vier Modi ermöglicht die Konfiguration von acht 8-Bit Filtern innerhalb einer Filter-Bank. 8-Bit Filter können nur die oberen acht Bit eines CAN-Identifiers, EXID[28..21] einer „extended ID“ bzw. die STID[10..3] einer Standard ID, überprüfen bzw. im „Masken“ Modus maximal ausblenden.

    8 Bit Filter Konfig. Konfig. Konfig. Konfig.
    Ext. ID [28..21] [20..18] RTR IDE [17..15] FMHx = 0

    FMLx = 0

    FMHx = 0

    FMLx = 1

    FMHx = 1

    FMLx = 0

    FMHx = 1

    FMLx = 1

    Std. ID [10..3] [2..0]      
    7 6 5 4 3 2 1 0
    CAN_FxR1 ID n ID n ID n ID n
    CAN_FxR2 M ID n+1 M ID n+1
    CAN_FxR3 ID n+1 ID n+2 ID n+1 ID n+2
    CAN_FxR4 M ID n+3 M ID n+3
    CAN_FxR5 ID n+2 ID n+4 ID n+2 ID n+4
    CAN_FxR6 M M ID n+3 ID n+5
    CAN_FxR7 M n+3 ID n+5 ID n+4 ID n+6
    CAN_FxR8 M M ID n+5 ID n+7

     

    ID Filter Nummerierung

    In oben aufgeführten Tabellen sind die eingestellten Filter mit „n“ bzw. mit „n+1“ usw. dargestellt. Dies weist darauf hin dass alle, auch deaktivierte Filter innerhalb der 6 möglichen Filter-Bänke von 1 bis zur maximalen Anzahl von konfigurierten Filter-Einstellungen durchnummeriert werden. Diese Nummer stellt den Filter-Index dar der in der jeweiligen Empfangs-Mailbox im Register CAN_MFMIR zur Verfügung gestellt wird.

    Sollte mehr als ein Filter die Nachricht gleichzeitig akzeptieren, so wird der Filter-Index entsprechend nachstehender Reihenfolge ermittelt:

  • Filtergröße, in der Reihenfolge: 32-Bit vor 16 Bit vor 8 Bit Filter
  • Filter-Modus, mit „Identifier List“ Filter (Direkte ID Filter) vor „Masked“ Filter
  • Bei gleicher Filtergröße und gleichem Modus zählt der niedrigere Filter-Index (Filter Nummer)
  • Diese Reihenfolge entspricht der internen Sequenz der Filter-Vergleiche. Trifft keines der Filter für die eingehende Nachricht zu, so wird diese verworfen.

    Copyright Notiz

    Dieses Dokument sowie dessen Inhalt, insbesondere Texte, Fotografien und Grafiken, unterliegt dem Copyright (© 2017) und sind nur mit einer schriftlicher Zustimmung des Autors, Dipl.Ing.(FH) Franz Henkel zur vollständigen oder auszugsweisen Weiterverwendung in Form einer gedruckten oder elektronischen Kopie oder Replikation bzw. einer vollständigen oder auszugsweisen Bereitstellung des Inhalts in schriftlicher oder elektronischer Form, zu verwenden.