STM8S208 - “beCAN” Controller
Die Datenübertragung in Sende- und in Empfangs-Richtung verläuft grundsätzlich unterschiedlich in seiner Verfahrensweise. Die Strukturen sind ähnlich aber das Management der CAN-Rahmen wird in der Sende-Richtung primär durch den Prozessor bestimmt, während in Empfangsrichtung der Datenfluß durch den Datenverkehr auf dem Bus gesteuert wird und das Management der eingehenden CAN-Rahmen "Interrupt"-gesteuert abläuft.
Um einen gewissen Freigeitsgrad zwischen der Verarbeitung der Daten und dem Datenverkehr auf dem Bus zu erlangen wurden sowohl in Sende- wie auch in Empfangsrichtung drei „Mailboxen“ vorgesehen, die jeweils einen kompletten CAN-Rahmen speichern können.
Darüber hinaus ist in Empfangsrichtung eine hardwaremässige Filterung der CAN-Identifier implementiert. Damit können CAN Nachrichten die für die eigene Node (das eigene System) nicht relevant sind von der Weiterverarbeitung ausgeschlossen werden und reduzieren damit die CPU Last.
Die für einen CAN Datenrahmen nötigen Informationen müssen vor der Sende-Anforderung komplett vorliegen. Erst wenn eine freie Sende-Mailbox komplett bzw. soweit nötig mit den entsprechenden Daten gefüllt ist, wird durch das Setzen des „TXRQ “ Bit [0] im CAN_MCSR Register das Kommando zum Senden erteilt. Danach ist die betreffende Mailbox nicht mehr beschreibbar und kann nur durch einen entsprechenden Abbruch-Befehl wieder „invalidiert“ werden. Sind mehrere Mailboxen gleichzeitig sendebereit so entscheidet der niedrigere CAN-Identifier (oder die Reihenfolge der Aktivierung) über die Priorität.
Für die Pufferung der Sende-Daten gibt es im beCAN drei unabhängige Mailboxen die die folgenden Informationen beinhalten:
Wie hier zu sehen ist, sind die wesentlichen Felder des CAN-Rahmens auch in der nachfolgenden Tabelle, die die einzelnen Register einer Sende-Mailbox enthält, zu finden.
Nachfolgend ist eine Transmit Mailbox in Gänze dargestellt. Die beiden anderen TX-Mailboxen sind identisch und es kann auch über den selben Adressebereich darauf zugegriffen werden.
beCAN Transmit Mailbox Aufbau (Page 0,1 und 5)nur wenn PSR = „0x000b“,“0x001b“,“0x101b“ | |||
Mailbox Fenster Adressen : 0x00.5428h + Offset / 0x00.5437h(STM8S208) | |||
Offset | Register Name | Inhalt | Beschreibung |
0x00h | CAN_MCSR | Master Status Register | TERR-ALST-TXOK-RQCP-ABRQ-TXRQ Flags |
0x01h | CAN_MDLCR | TGT - Data Length Code | Anzahl der Daten-Bytes |
0x02h | CAN_MIDR1 | IDE – RTR – EX-ID[28..24] | 11 Bit Adresse alternativ: ID[10..6] |
0x03h | CAN_MIDR2 | EX-ID[23..18] | 11 Bit Adresse alternativ: ID[5..0] |
0x04h | CAN_MIDR3 | EX-ID[15..8] | bei 11 Bit Adresse unbenutzt |
0x05h | CAN_MIDR4 | EX-ID[7..0] | bei 11 Bit Adresse unbenutzt |
0x06h | CAN_MDAR1 | Daten Byte 1 | Nutzdaten Byte 1 |
0x07h | CAN_MDAR2 | Daten Byte 2 | Nutzdaten Byte 2 |
0x08h | CAN_MDAR3 | Daten Byte 3 | Nutzdaten Byte 3 |
0x09h | CAN_MDAR4 | Daten Byte 4 | Nutzdaten Byte 4 |
0x0Ah | CAN_MDAR5 | Daten Byte 5 | Nutzdaten Byte 5 |
0x0Bh | CAN_MDAR6 | Daten Byte 6 | Nutzdaten Byte 6 |
0x0Ch | CAN_MDAR7 | Daten Byte 7 | Nutzdaten Byte 7 |
0x0Dh | CAN_MDAR8 | Daten Byte 8 | Nutzdaten Byte 8 |
0x0Eh | CAN_MTSRL | Time Stamp Register L | Time[7..0] |
0x0Fh | CAN_MTSRH | Time Stamp Register H | Time[15..8] |
Die drei unabhängigen Transmit Mailboxen sind nicht direkt adressierbar sondern werden in das Adressefenster (0x00.5428h .. 0x00.5437h) eingeblendet. Die Auswahl der jeweils eingeblendeten Mailbox erfolgt durch das „PS“ Bitfeld [2..0] im CAN_PSR (teils auch CAN_FPSR genannt). Die „PS“Adresse (= Page Select) besteht aus drei Bits die entsprechend nachfolgender Tabelle die einzelnen Pages (hier werden nur die TX-Mailboxen gezeigt) ansprechen:
CAN_PSR Register / Sende-Mailbox Adressierung | |||||
Mailbox | Page (Seite) | PS2 | PS1 | PS0 | |
TX Mailbox 0 | Sende-Mailbox 0 | 0 | 0 | 0 | 0 |
TX Mailbox 1 | Sende-Mailbox 1 | 1 | 0 | 0 | 1 |
TX Mailbox 2 | Sende-Mailbox 2 | 5 | 1 | 0 | 1 |
Zu beachten: die verbleibenden Adressen (für das „PS“ Feld) sind nicht ungenutzt, sondern blenden weitere Registerseiten für das Receive FIFO, die Identifier-Filter und für die Konfiguration bzw. Diagnose ein !
Der erste Schritt um einen Sendevorgang zu initiieren besteht darin eine freie Mailbox auszuwählen.
Im CAN_TSR Register existieren für jede der drei Mailbox („“), zwei separate Flags die folgenden Status signalisieren:
TXOKn wird per Hardware gesetzt wenn eine Übertragung abgeschlossen wird bzw. wird zurück gesetzt wenn die Mailbox zur Übertragung angefordert wird.
Eine Anforderung kann ein Übertragungsrequest oder ein Abbruch sein.
Die TXOKn Flags können vor einem neu zu initierenden Sendevorgang abgefragt werden um eine leere Mailbox zu finden oder alternativ kann der TMEIE Interrupt freigegeben werden der eine freigewordene Mailbox signalisiert.
Eine weitere Möglichkeit eine freie Mailbox zu findet läßt sich aus den Status-Informationen des CAN_TPR Registers entnehmen.
Die Bits „TME0“ (Bit [2]), „TME1“ (Bit [3]), „TME2“ (Bit [4]) im CAN_TPR Register geben eine Indikation ob die entsprechenden Mailboxen leer sind oder nicht. Die Steuerung erfolgt durch die Hardware die das Bit setzt falls die Mailbox frei ist.
Das „CODEn“ Bitfeld [1..0] im Register CAN_TPR beinhaltet einen zwei Bit Code der auf die nächste geeignete Mailbox verweist. Dabei kann es sich um eine „freie“ Mailbox handeln oder für den Fall das eine Solche nicht vorhanden ist, um die Mailbox mit der geringsten Priorität, die gegebenenfalls überschrieben werden könnte.
Die Bits „LOW0“ (Bit [5]), „LOW1“ (Bit [6]), „LOW2“ (Bit [7]) im CAN_TPR Register zeigen an welche der Mailboxen aktuell die niedrigste Priorität besitzt. Die Indikation erfolgt durch die Hardware die das Bit setzt.
Die Nutzdaten (Payload) die auf dem Bus gesendet werden sollen sind im System bekannt (Applikations-Software) und werden vom Prozessor nach der Auswahl einer freien Mailbox in die CAN_MDAR[8..1] Bytes dieser Mailbox eingetragen.
Auf dem Bus wird später, nach CAN Spezifikation, das höchstwertige Datenbyte (CAN_MDAR8) im Protokollfeld „Data Field“ zuerst übertragen.
Die vier Bytes MIDR [4..1] in der Mailbox werden mit der CAN-ID und den begleitenden Flags für das „CAN Arbitration Field“ beschrieben.
Dabei gilt folgende Einteilung für „Extended IDs“:
CAN_MIDRn Register für 29Bit IDs - Mailbox Identifier Register (0x00.542Ah ... 0x00.542D) , PSR = 0, 1 oder 5 | ||||||||
Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
CAN_MIDR1 | reserv. | IDE = 0 | RTR | STID28 | STID27 | STID26 | STID25 | STID24 |
CAN_MIDR2 | STID23 | STID22 | STID21 | STID20 | STID19 | STID18 | STID17 | STID16 |
CAN_MIDR3 | STID15 | STID14 | STID13 | STID12 | STID11 | STID10 | STID9 | STID8 |
CAN_MIDR4 | STID7 | STID6 | STID5 | STID4 | STID3 | STID2 | STID1 | STID0 |
Das „IDE“ Bit (ID Extended) ist bei einer 29 Bit ID immer “ 1” (rezessive).
Bei der Verwendung einer 11 Bit langen Standard CAN-ID ergibt sich folgendes Bild:
CAN_MIDRn Register für 11Bit IDs - Mailbox Identifier Register (0x00.542Ah ... 0x00.542D) , PSR = 0, 1 oder 5 | ||||||||
Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
CAN_MIDR1 | reserv. | IDE = 0 | RTR | STID10 | STID9 | STID8 | STID7 | STID6 |
CAN_MIDR2 | STID5 | STID4 | STID3 | STID2 | STID1 | STID0 | reserv. | reserv. |
CAN_MIDR3 | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. |
CAN_MIDR4 | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. | reserv. |
Das „IDE“ Bit (ID Extended) wird bei einer 11 Bit ID durch das Bit „ r1“ im „Control Feld“ ersetzt und ist immer “0 ” (dominant). Die Identifier Bits entsprechen im Standard Format: ID28 = STID10, ID27 = STID9 usw. da nur das „Base Identifier Feld“ (Standard ID) in beiden Versionen vorkommt.
Das „RTR“ Bit [5] im CAN_MIDR1 kennzeichnet einen „Remote Transmission Request“, also eine CAN Anfrage für eine Information von einem anderen Bus-Teilnehmer, die in einem „Remote Frame“ übertragen wird und keine Daten beinhaltet.
Die CAN-Spezifikation erlaubt die Übertragung von bis zu 8 Datenbytes in einem Rahmen. Es können aber bei Bedarf auch weniger Bytes übertragen werden. Dazu wird in der beCAN Mailbox im Register CAN_MDLCR die Datenlänge in den „ DLCn“ Bits übertragen.
CAN_MDLCR Register - Mailbox Data Length Code Register (0x00.5429h nur wenn PSR = „0x110b“ ) | ||||||||
Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
CAN_MDLCR | TGT | reserv. | reserv. | reserv. | DLC3 | DLC2 | DLC1 | DLC0 |
Das “TGT” Bit [7] im CAN_MDLCR Register kann dazu benutzt werden um die Inhalte der beiden Register CAN_MTSRH und CAN_MTSRL im Sende-Rahmen in den beiden letzten Datenbytes zu übertragen (Zeit Stempel). Die Zeit-Information stammt dabei aus den beiden Zähler-Registern CAN_MTSRH und CAN_MTSRL und wird automatisch gesetzt. Die Zähler werden mit der Flanke des „SOF“ (Start Of Frame) Bits am Beginn des Rahmens übernommen.
Dies ist nur möglich wenn sich der beCAN im Time Triggered Modus befindet („TTCM“ Bit [7] im CAN_MCR gesetzt).
Innerhalb des Adressraums einer Transmit-Mailbox befindet sich auch ein Register das Status Informationen dediziert zu dieser Mailbox enthält. Der Inhalt des CAN_MCSR Register ist kein Teil des CAN Rahmens sondern liefert entsprechende Status-Informationen die beim Senden der Nachricht entstehen. Die enthaltenen Bits sind also für die Steuerung des Sendeablaufs von Bedeutung oder werden von der Software ausgewertet.
CAN_MCSR Register - Message Control Status Register (0x00.542Eh nur wenn PSR = „0x110b“ ) | ||||||||
Register Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
CAN_MCSR | reserv. | reserv. | TERR | ALST | TXOK | RQCP | ABRQ | TXRQ |
Die in diesem Register enthaltenen Flags bzw. Kontroll-Bits haben folgende Bedeutung:
Die letzte Übertragung aus dieser Mailbox war fehlerhaft, falls des „TERR“ Bit [5] gesetzt wurde. Das Bit wird durch die Hardware gesetzt und kann nur gelesen werden.
Beim letzten Übertragungsversuch wurde das Buszugriffrecht gegenüber einer anderen Nachricht auf dem Bus verloren. Das „ ALST“ Bit [4] wird in diesem Fall durch die Hardware gesetzt und kann nur gelesen werden.
Der letzte Sendeversuch verlief erfolgreich wenn das „TXOK“ Bit [3] vom beCAN gesetzt wurde. Dieses Bit entspricht dem korrespondierenden „TXOKn“ Bit im CAN_TSR Register und kann nur gelesen werden.
Die Hardware setzt diese Bit falls die letzte Anforderung oder der letzte Abbruch ordnungsgemäß beendet wurde. Das „ RQCP“ Bit [2] im CAN_MCSR Register entspricht dem Wert der auch im entsprechenden „RQCPn“ Bit im CAN_TSR Register eingetragen ist.
Durch das Beschreiben mit einer „1“ wird das „RQCP“ Bit gelöscht („0“) und setzt dabei auch die Bits „TXOK“,“ALST“ und „TERR“ im gleichen Register, sowie die korrespondierenden Bits „RQCPn “ und „TXOKn“ im CAN_TSR, zurück.
Eine bereits mit Daten vorbereitet Mailbox (pending oder scheduled) kann vor dem Senden über das „ABRQ“ Bit [1] invaliditiert werden. D.h. diese Mailbox wird nicht mehr gesendet sofern der Sendevorgang nicht bereits gestartet wurde.
Das „ABRQ“ Bit wird durch die Software gesetzt falls eine Nachricht nicht mehr gesendet werden soll. Dies kann der Fall sein wenn eine Nachricht mit niedriger Priorität noch nicht gesendet wurde und deren Inhalt nicht mehr relevant ist.
Das „TXRQ“ Bit [0] im CAN_MCSR Register ist der eigentliche „Sende“-Befehl für eine Mailbox. Sobald dieses Bit mit einer „1“ beschrieben wurde ist die Mailbox als „versandfertig “ (pending) markiert und wird im nächsten Schritt bei entsprechender Priorität gesendet.
Die in den drei Mailboxes vorliegenden Nachrichten können nach zwei verschiedenen Kriterien hinsichtlich der Reihenfolge des Versands beeinflußt werden:
Entsprechend der CAN Verteilung der Bus-Zugriffspriorität (niedrigere CAN-IDs haben höhere Priorität wegen des „ dominanten“ Wertes einer „0“ auf dem Bus) werden im Bodytextfall auch die Mailboxen nach diesem Prinzip versendet. Der in die CAN_MIDRn Register eingetragene Wert bestimmt in diesem Fall die Reihenfolge der Übertragung.
Als Sonderfall kann hier eine identische ID in zwei verschiedenen Mailboxen auftreten. In diesem Fall wird die „niedrigere“ Mailbox-Nummer zuerst verarbeitet.
Über das „TXFP“ Bit [2] im CAN_MCR kann die eben beschriebene Priorität durch beschreiben mit einer „1“ dahingehend geändert werden, daß die Reihenfolge streng nach dem Eingang der Anforderungen versandt wird.
Der Aufbau des CAN-Rahmens wird vom beCAN Controller entsprechend der CAN Spezifikation und den in der Sende-Mailbox gesetzten Flags autonom durchgeführt. Folgende Schritte werden dabei ausgeführt:
Das Start-Flag wird vom beCAN beim Senden automatisch erzeugt.
In das Identifier Feld (Arbitration Field) wird der in den CAN_MIDRn Registern der Mailbox abgelegt Identifier eingetragen. Die Länge des Identifiers richtet sich nach dem „IDE“ Bit [6] welches im Fall einer „1“ einen 29 Bit Identifier überträgt bzw. im Fall einer „0“ einen 11-Bit Identifier.
Das „RTR“ Bit [5] im CAN_MIDR1 Register wird am Ende des Identifier Feldes (Arbitration Field) übertragen und definiert gleichzeitig ob das nachfolgende CAN-Datenfeld gefüllt werden soll (Daten Rahmen, „RTR“ = „0“, dominant) oder ob ein „Remote Frame“ erzeugt werden soll der keine CAN-Daten enthält („Remote“ Rahmen, „RTR“ = 1, rezessive).
Die zu übertragenden Daten werden in der Mailbox in die Register CAN_MDAR [8..1] eingetragen (falls alle 8 Byte benötigt werden).
Wieviel Bytes im Endeffekt in den CAN-Rahmen übertragen werden richtet sich nach dem „Data Length Field“ im CAN_MDLCR Register in der Mailbox. Die Länge kann „0“ bis „8“ Byte betragen.
Das 6 Bit lange Control Feld besteht aus zwei Teilen:
Das „r1“ Bit wird im Base Frame Format als „0“ übertragen (anstelle des „IDE“, dominant),
Das „r0“ hat in diesem Format keine Bedeutung.
Das „r1“ Bit und das „r0“ Bit werden im Extended Frame Format aktuell nicht verwendet.
Die CAN Spezifikation beinhaltet einen CRC Test (Cyclic Redundancy Check) der über die vorher übertragenen Datenbits ab dem „SOF“ (Star Of Frame Bit) bis einschliesslich der ersten 15 CRC Bits berechnet wird. Das verwendete Polynom für den CRC Check ist nach ISO 11898-1:
X15 + X14 + x10 + x8 + x7 + x4 + x3 + 1
Die CRC Berechnung wird vom beCAN in Hardwdare durchgeführt und bedarf keiner weiteren Aktion.
Die verbleibenden Felder eines CAN Rahmens werden vom beCAN automatisch berücksichtigt (Acknowledge Feld = rezessiv) oder erzeugt (Stop-Flag).
Der Empfang von CAN-Rahmen wird von der beCAN Hardware weitgehend autonom durchgeführt. Alle Informationen aus dem CAN-Rahmen werden in der nächsten, freien Empfangs-Mailboxen abgelegt. Falls die Filterung der Nachrichten aktiviert ist, werden nur solche Rahmen verarbeitet die die Filter-Kriterien hinsichtlich der CAN-ID erfüllen, alle anderen Nachrichten werden ignoriert.
Die Hardware wählt automatisch die nächste freie Mailbox (FIFO Prinzip) für ankommende Nachrichten aus. Ist keine Mailbox frei, kann per Konfiguration ausgewählt werden ob die letzte Nachricht überschrieben wird oder ob die neue Nachricht verworfen wird.
Nach dem fehlerfreien Empfang einer neuen Nachricht kann ein Interrupt ausgelöst werden, der dem Prozessor die Verfügbarkeit weiterer zu bearbeitender Nachrichten in der Mailbox anzeigt. Wahlweise können die Empfangs-Mailboxen auch „gepollt“ werden.
Für die Pufferung der Empfangs-Daten gibt es im beCAN drei unabhängige Mailboxen die in einer FIFO Struktur verwendet werden und die die folgenden Informationen beinhalten:
Nutzdaten (“Data Field” = max. 8 Byte)
Nachfolgend ist der Aufbau einer „Receive“ Mailbox in Gänze dargestellt. Die Struktur einer Empfangs-Mailbox unterscheidet sich von einer Sende-Mailboxen nur in einem Register. Während die Sende-Mailbox das CAN_MCSR auf den Offset 0x00h einblendet wird in der Empfangs-Mailbox auf dem gleichen Offset das Register CAN_MFMIR verfügbar. Dieses Register liefert die Information über den verwendeten Filter-Index (bis zu 6 Identifier-Filter sind möglich), der die zugehörige Nachricht akzeptiert hat.
Wie zu sehen ist, ist die Basis-Adresse für die Empfangs-Mailboxen identisch zur Basis-Adresse der Sende-Mailboxen, da alle im selben Adressfenster eingeblendet werden. Die Selektion erfolgt über das CAN-PSR Register (CAN Page Select Register) das einen der acht möglichen Schatten-Register-sätze (Mailboxen, Filter etc.) auswählt.
beCAN Receive FIFO Mailboxen (Page 7) nur wenn PSR = „0x111b“ | |||
Receive Mailbox Basis Adresse : ( 0x00.5428h) - (Adresse im STM8S208) | |||
Offset | Register Name | Inhalt | Beschreibung |
0x00h | CAN_MFMIR | Filter Match Index | Filter Index verantwortlich für das Akzeptieren |
0x01h | CAN_MDLCR | TGT - Data Length Code | Anzahl der Daten-Bytes |
0x02h | CAN_MIDR1 | IDE – RTR – EXID[28..24] | 11 Bit Adresse alternativ: ID[10..6] |
0x03h | CAN_MIDR2 | EXID[23..18] | 11 Bit Adresse alternativ: ID[5..0] |
0x04h | CAN_MIDR3 | EXID[15..8] | bei 11 Bit Adresse unbenutzt |
0x05h | CAN_MIDR4 | EXID[7..0] | bei 11 Bit Adresse unbenutzt |
0x06h | CAN_MDAR1 | Daten Byte 1 | Nutzdaten Byte 1 |
0x07h | CAN_MDAR2 | Daten Byte 2 | Nutzdaten Byte 2 |
0x08h | CAN_MDAR3 | Daten Byte 3 | Nutzdaten Byte 3 |
0x09h | CAN_MDAR4 | Daten Byte 4 | Nutzdaten Byte 4 |
0x0Ah | CAN_MDAR5 | Daten Byte 5 | Nutzdaten Byte 5 |
0x0Bh | CAN_MDAR6 | Daten Byte 6 | Nutzdaten Byte 6 |
0x0Ch | CAN_MDAR7 | Daten Byte 7 | Nutzdaten Byte 7 |
0x0Dh | CAN_MDAR8 | Daten Byte 8 | Nutzdaten Byte 8 |
0x0Eh | CAN_MTSRL | Time Stamp Register L | Time[7..0] |
0x0Fh | CAN_MTSRH | Time Stamp Register H | Time[15..8] |
Im Gegensatz zu den Sende-Mailboxen sind die Empfangs-Mailboxen nicht gezielt einzeln adressierbar, da die eingehenden Nachrichten im FIFO Prinzip (First In First Out) abgelegt werden. An der nachfolgend beschriebenen „Page“-Adresse 0x111b wird die jeweils am längsten wartende Mailbox (Nachricht) zur Verfügung gestellt.
Die drei Receive FIFO Mailboxen werden auf eine Basis Adresse eingeblendet. Die Selektion der Empfangs-Mailbox Seite (page) erfolgt durch das „PS“ Bitfeld [2..0] im CAN_PSR Register. Die „ PS“ Adresse (= Page Select) besteht aus drei Bits die wie folgt die FIFO-Mailbox auswählt:
CAN_PSR Register / Empfangs-Mailbox Adressierung | |||||
Mailbox | Page (Seite) | PS2 | PS1 | PS0 | |
RX FIFO Mailbox | Empfangs-Mailboxen | 7 | 1 | 1 | 1 |
Zu beachten: die verbleibenden Adressen (für das „PS“ Feld) sind nicht ungenutzt sondern blenden weitere Registerseiten für die Empfangs-Mailboxen, die Adressen-Filter und für die Konfiguration bzw. Diagnose ein !
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.