CANNET Communication Stack
Die Kommunikation zwischen den einzelnen Nodes eines CANNET Systems wird über einen CAN-Bus abgewickelt. Da der CAN-Bus nach der Spezifikation (ISO/CD 11898-1 Part 1: Data Link Layer and physical signaling) nur die "Bitübertragungs-Schicht" (Physical Layer) sowie die "Datenübertragungs-Schicht" (Data Link Layer) umfasst musste für das CANNET System eine geeignete "Netzwerk-Schicht" (Network Layer) entwickelt werden. In der „CANNET“ Kommunikationsstruktur sind deshalb verschiedene „Protokolle“ vorgesehen die zwischen den einzelnen „Nodes“ (Teilnehmern) bzw. „Mastern“ (Gateways) zur Datenübermittlung verwendet werden.
Die gesamte Aufgabe der bidirektionalen CANNET Datenübertragung wurde auf jeder einzelnen Node implementiert und unterscheidet sich lediglich durch die per Konfiguration zugewiesene CANNET-ID (CAN-ID). Dabei gibt es im Zusammenhang mit der Übertragung über den CANNET-Bus in der Firmware vier wesentliche Bereiche:
Im Sourcefile „CAN.asm“ sind die Basisfunktionen sowie die Variablendefinitionen für die Software Buffer der RX- („CAN_RX_BUF“) und TX- („CAN_TX_BUF“) Mailboxes sowie einiger Flags enthalten.
Die Basisfunktionen für den CAN bestehen aus:
get_free_mailbox | Diese Subroutine ermittelt die nächste freie Mailbox und übergibt die Mailbox-Nummer in der Variablen „CAN_FREE_MB“ und setzt gleichzeitig das beCAN Pageregister auf die ermittelte freie Mailbox . |
send_TX_mailbox | Der von einer Protokoll-Funktion gefüllte „CAN_TX_BUF“ (Software Buffer) wird in die durch „get_free_mailbox“ ermittelte und über das Page Select Register eingestellte freie Mailbox in der STM8 Hardware übertragen. |
get_RX_mailbox | Die dritte Basisfunktion lädt die Information aus der aktuellen (FIFO) Receive Mailbox in den Software Buffer „CAN_RX_BUF“. |
Sendeprotokolle sind als Subroutinen in der Firmware angelegt und bestehen im Wesentlichen aus dem Eintrag der CANNET-ID und der Payload (Protokollspezifische Daten) in den „CAN_TX_BUF“ . Dabei kommen in den einzelnen Protokollen die Basisfunktionen „get_free_mailbox“ und „send_TX_mailbox“ zur Anwendung.
Die Protokolle sind im File „main.asm“ enthalten und werden durch verschiedene Stimuli wie Interrupts, Software Timer bzw. eingehende UART Befehle, aufgerufen.
Die Empfangsfilter sind im beCAN Controller des STM8S208 enthalten und ermöglichen eine Selektion eingehender Messages. Nur Messages die von einem Filter akzeptiert wurden übernimmt der Controller in eine freie Empfangsmailbox des RX-FIFO’s und erzeugen danach einen CAN RX Interrupt.
Der wesentliche Aspekt bei der Definition der CAN-ID’s ist eine sinnvolle und übersichtliche Verwendung der ID’s für diese Filter.
Empfangende Nodes verwenden die ID-Filter um zwischen den verwendeten „Signalen“ (Messages) zu unterscheiden und mit möglichst geringem Aufwand an Software auf die entsprechenden „Service Routinen“ der Software zu verzweigen. Als „Service Routine“ ist dabei die Software Routine zu verstehen, die die jeweilige „Message Art“ behandelt und daraus resultierende Aktivitäten einleitet.
Im CANNET System sollen, per Definition, ausschließlich 29 Bit CAN-IDs(EXID) verwendet werden, wobei nur die vierzehn höherwertigen EXID[28:15] Bits über die Hardware Filter (konfiguriert als 16 Bit Filter) selektiert werden. Weitergehende Auswertungen werden über Software (CANNET Firmware Parser) durchgeführt.
Per Definition des „CANNET Systems“ ist das höchstwertige Extended-ID Bit ( EXID[28] ) in allen Protokollen immer auf „1“ (Rezessiv) gesetzt. Da die CAN ID gleichzeitig die Priorität bei der Übertragung festlegt ist ein Schema zu definieren dass die Priorität für die verschiedenen Signale bzw. Signalgruppen am effektivsten zuordnet (siehe: Definition der Stack ID Gruppen) .
Der Firmware Parser „can_stack_parser“ ist im File „main.asm“ enthalten. Er wertet den in der Empfangsmailbox in CAN_RX_MFMIR enthaltenen „gematchten“ Filterindex aus und verzweigt auf die jeweils assoziierte Funktion die den entsprechenden Fall behandelt.
Der Parser wird durch den CAN RX Interrupt über einen Call aufgerufen und eventuell auch in der „ main.asm“ Schleife alle 100 ms erneut aufgerufen um noch wartende (pending) Messages in den RX Mailboxen zu verarbeiten.
Nach dem Dekodieren des „auslösenden“ Filters über den Filterindex wird auf eine Subroutine verzweigt die das jeweilige CANNET-Protokoll hinsichtlich der Auswertung der nicht vom H/W-Filter erfassten CAN-ID Bits und der im spezifischen CANNET Protokoll verwendeten Daten-Bytes weiter verarbeitet.
Copyright 2019 by Dipl.Ing.(FH) Franz Henkel
Dieses Dokument sowie dessen Inhalt, insbesondere Texte, Fotografien und Grafiken, unterliegt dem Copyright (© 2019) 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, gedruckter oder elektronischer Form, zu verwenden.