NP5 SPI Online-Handbuch

NanoSPI

Das Serial Peripheral Interface (kurz SPI) ist ein Bus-System für einen synchronen, seriellen Datenbus (Synchronous Serial Port), mit dem digitale Schaltungen nach dem Master-Slave-Prinzip miteinander verbunden werden können.

Im diesem Kapitel wird das von Nanotec entwickelte Protokoll beschrieben, dass Ihnen beispielsweise CANopen-SDO-Zugriffe via SPI ermöglicht. Das Protokoll ist eine Kombination aus EtherCAT und CANopen und dementsprechend ein Single-Master-Protokoll.

Bus-Topologie

Der SPI-Bus verwendet die Leitungen SCK (source clock), MOSI (master out, slave in), MISO (master in, slave out) und CS (chip select). Nachdem keine differentiellen Signale verwendet werden, ist der Anschluss von GND notwendig. Die folgende Grafik zeigt die Topologie im einfachen Fall eines einzigen Slaves.

Je nach Ausbaustufe lassen sich mehrere Slaves von einem Master aus steuern, siehe Kapitel SPI-Sub-Master.

SPI-Einstellungen

Die SPI-Parameter sind folgendermaßen einzustellen (siehe auch nachfolgende Abbildung):

  • Der Ruhepegel des Clock-Signals ist low.
  • Die Bereitstellung eines Bitwertes (MISO und MOSI) geschieht auf der steigenden Flanke des Clock-Signals.
  • Der Abtastzeitpunkt ist die fallende Flanke des Clock-Signals.
  • Die Daten werden mit dem Most Significant Bit zuerst versendet und empfangen.
  • Das CS-Signal ist low aktiv.
  • Solange sich der SPI-Slave nicht auf den Millisekundentakt des SPI-Masters aufsynchronisiert hat, darf der SPI-Master nur alle zwei Millisekunden eine Nachricht übertragen.

    Wenn der SPI-Slave synchron zum Millisekundentakt des SPI-Masters läuft, darf der SPI-Master jede Millisekunde eine Nachricht übertragen.

Der SPI-Slave kann mit einer Frequenz von maximal 20 MHz angesteuert werden.

Folgende Abbildung zeigt den SPI-Signalverlauf:

Bus-Initialisierung

Die Slaves senden erst gültige Inhalte, nachdem einmalig eine korrekte Nachricht vom Master empfangen wurde. Die Bus-Initialisierung ist mit der ersten korrekt empfangenen Nachricht abgeschlossen.

Allgemeines zum Protokoll

Im Folgenden werden folgende Ausdrücke benutzt:

  • Nachricht (engl. message) bedeutet, Daten werden an einen einzelnen Teilnehmer gesendet.
  • Übertragung : mehrere logisch zusammengehörige Nachrichten sind eine Übertragung.
  • Mailbox ist ein Datenbereich innerhalb einer Nachricht, der als Container Daten eines bestimmten Protokolls enthält (z. B. SDO-Protokoll). Die verfügbaren Protokolle sind festgelegt, aufeinanderfolgende Nachrichten müssen nicht immer das gleiche Protokoll in der Mailbox enthalten.
  • Abbild ist ein Datenbereich in der Nachricht, der ausgewählte Daten aus dem Objektverzeichnis überträgt oder ausgewählte Daten in das Objektverzeichnis schreibt. Falls aktiv, wird dieses Abbild mit jeder Nachricht übertragen. Damit lassen sich wichtige Objekte aus dem Objektverzeichnis sehr gut überwachen.

    Die Auswahl der Daten geschieht vor Aktivierung des Abbilds mittels Protokolls aus der Mailbox und kann nur unter bestimmten Bedingungen wieder geändert werden.

  • Mapping bedeutet eine Zuordnung der Daten innerhalb eines Abbilds.

SPI-Nachricht

In einer SPI-Nachricht kann eine oder keine Mailbox eingebettet werden. Die möglichen Mailboxen werden nachfolgend beschrieben.

Mailbox Datenaustausch

Um eine Antwort auf eine Mailbox zu erhalten, muss der SPI-Master zwei Nachrichten übertragen. Folgende Abbildung zeigt den Sende- und Empfangsspeicherverlauf des Masters und des Slaves. Während der Übertragung der allerersten Nachricht am Bus sind dabei einige dieser Puffer inhaltlich nicht definiert.

Für die Antwort auf Request 1 müssen zwei Nachrichten verschickt werden. Die zweite Nachricht kann dabei wieder einen neuen Request enthalten.

Nachrichtenhäufigkeit und Synchronisierung

Die Nachrichten können in folgender Häufigkeit ausgetauscht werden:

  • Asynchroner Betrieb: höchstens alle zwei Millisekunden eine Nachricht
  • Synchroner Betrieb: eine Nachricht pro Millisekunde

Die Synchronisation erfolgt im Zustand Operational des Slaves auf die Nachrichten des Masters. Dieser Vorgang kann initial bis zu 100 Millisekunden dauern. Erst bei aktiver Synchronisation werden die Abbilder der Nachrichten ausgewertet. Der Zustand Operational des Slaves wird erst angezeigt, wenn dieser sich synchronisiert hat. Bis dahin bleibt der Slave im Zustand Init und dem Master ist es nur gestattet, alle zwei Millisekunden eine Nachricht zu übertragen.

Wenn der Slave eine Sekunde lang keine Nachricht mehr vom Master empfangen hat, ist er wieder asynchron und schaltet in den Init-Status zurück.

Sollten die Nachrichten des Masters nicht in einem sauberen Millisekundenraster übertragen werden (zu großer Jitter), dann kann sich der Slave nicht aufsynchronisieren bzw. fällt frühestens nach 64 Nachrichten in den Init-Status zurück und ist dann wieder asynchron.

Aufbau einer SPI-Nachricht

Eine Nachricht besteht aus folgenden Bestandteilen:
  • INFO-Byte: Beschreibt das benutzte Protokoll in der Mailbox und gibt den Bus-Status des Senders der Nachricht an (für Details: siehe INFO-Byte).
  • Mailbox entsprechend dem INFO-Byte: siehe CANopen Mailbox
  • Abbild: wenn aktiv, siehe Abbild
  • CRC-Byte: siehe CRC

INFO-Byte

Das INFO-Byte setzt sich folgendermaßen zusammen:

Anmerkung: Bit 5 bis 2 sind reserviert.
Bit 7-6 Bedeutung
0b00

Betriebszustand Init:

  • keine Tx/Rx-Abbilder zulässig
0b01

Betriebszustand Operational (sync):

  • Tx/Rx-Abbilder aktiv
  • CANopen Mailbox möglich
  • Synchroner Betrieb des Slaves
0b10

Betriebszustand Operational (async):

  • Tx/Rx-Abbilder aktiv
  • CANopen Mailbox möglich
  • Asynchroner Betrieb des Slaves
0b11

Betriebszustand Error

  • keine Tx/Rx-Abbilder zulässig
  • nur CANopen Mailbox möglich
Bit 1-0 Bedeutung (siehe auch CANopen Mailbox)
0b00 Keine Mailbox
0b01 CANopen Mailbox mit SDO-Protokoll (siehe Unterkapitel CANopen SDO-Protokoll)
0b10 CANopen Mailbox mit ungültigen 8 Datenbytes (Details: siehe Unterkapitel CANopen Ungültige Daten)
0b11 NanoSPI Mailbox (Details: siehe Unterkapitel NanoSPI-Mailbox)

CANopen Mailbox

CANopen SDO-Protokoll

Mittels dieser Mailbox wird das SDO-Protokoll des CANopen-Standards verwendet. Da keine anderen Services adressiert werden können, wird die COB-ID nicht mitgeschickt. Die Mailbox enthält demnach 8 Bytes einer SDO-Nachricht.

CANopen Ungültige Daten

Um die Bestätigung (Confirmation) auf eine Anfrage (Request) zu erhalten, müssen zwei SPI-Nachrichten verschickt werden, die erste mit dem Request und eine zweite um die Response zu transportieren (siehe auch Mailbox Datenaustausch). Falls kein weiterer Request zu senden ist und nur die Response abgeholt werden soll, kann die Mailbox der zweiten Nachricht diesen Typ haben.

Die Daten innerhalb der Mailbox sind nicht relevant, auf diese Nachricht wird inhaltlich nicht reagiert.

NanoSPI-Mailbox

Über die NanoSPI-Mailbox können NanoJ-Programme übertragen werden. Pro Nachricht können dabei maximal 1024 Bytes Nutzdaten verschickt werden. Mehrere Nachrichten lassen sich zu einer Übertragung zusammenfassen. Eine Mailbox besteht aus den folgenden vier Teilen:

Byte Position Name Beschreibung
0 Indication zur Anzeige der Inhalte, der letzten Nachricht der Übertragung, etc.
1 Counter zum Nummerieren der Nachrichten innerhalb einer Übertragung. Der Überlauf des Zählers wird im Indication-Byte mit einem Wechsel des Werts des "Toggle Bits" bestätigt.
3-2 Length Beinhaltet die Länge der im Datenbereich hinterlegten Daten (Einheit: Byte).
4 bis 1028 Data Enthält die Daten (bis zu 1024 Bytes).

Indication

Das Indication Byte macht Angaben über den Inhalt und über die Übertragung. Die Bits sind in der nachfolgenden Tabelle aufgelistet.

Bit-Postion Name Beschreibung
1-0 DataType Art der Daten:
  • Wert 1: NanoJ-Programm
2 Toggle Jede Übertragung startet mit diesem Bit auf dem Wert "0". Bei jedem Überlauf des Counter-Bytes von "255" auf "0" muss der Zustand des Bits wechseln.
3 Last message Zeigt die letzte Nachricht der momentanen Übertragung an.
4 Reset Comm Setzt die Übertragung zurück.
7-5 Reserviert Diese Bits müssen 0 sein.

Counter

Das Counter Byte nummeriert die Nachrichten. Bei jeder neuen Übertragung beginnt der Zähler mit 0. Bei einem Überlauf von 255 auf 0 muss das Toggle Bit im Indication Byte den Zustand wechseln (siehe nachfolgende Abbildung).

Length

Length definiert die Länge des Datenbereichs (Data) in Bytes. Die Länge der Daten ist maximal 1024 Bytes.

Data

Data beinhaltet die Daten, die maximal übertragbare Datenmenge ist 1024 Bytes.

Beispiel

Im folgenden Beispiel soll ein NanoJ-Programm übertragen werden, welches aus 3204 Bytes besteht. Die Bytes mit den Wert XX sind für das Beispiel nicht relevant.

  1. Senden der ersten 1024 Bytes eines NanoJ-Programms; Header: Mailboxtyp NanoSPI, Busstatus Init:

    Die erste Nachricht besteht aus folgenden Bytes:

    03 01 00 00 04 XX XX ... XX XX

    Die Bytes dieser Nachricht haben folgende Bedeutung:

    • Byte 0 = 0x03 (Info Byte): Es wird die NanoSPI-Mailbox genutzt, Busstatus ist Init.
    • Byte 1 = 0x01 (Indication Byte):
      • Datentyp ist NanoJ-Programm.
      • Toggle-Bit ist auf "0" gesetzt, da eine neue Übertragung erfolgt.
      • LastFrame-Bit ist auf "0" gesetzt, da noch weitere Datenpakete folgen werden.
      • Reset Comm-Bit ist auf "0" gesetzt.
    • Byte 2 = 0 (Counter): Es ist die erste Nachricht der Übertragung.
    • Byte 3 / 4 = 0x0400 (Length-Bytes): Byte 4 = 0x04, Byte 3 = 0x00 was zusammengesetzt die Datenlänge von 1024 Bytes in der Mailbox bedeutet.
    • Byte 5 bis einschließlich Byte 1028: Das sind die ersten 1024 Bytes des NanoJ-Programms.
    • Byte 1029 = 0xXX (CRC Byte)

  2. Senden der zweiten 1024 Bytes eines NanoJ-Programms; Header: Mailboxtyp NanoSPI, Busstatus Init:
    03 01 01 00 04 XX XX ... XX XX

    Im Gegensatz zur ersten Nachricht hat sich nur das Counter-Byte auf 1 erhöht und die Daten sind mit den nächsten 1024 Bytes des NanoJ-Programms gefüllt.

  3. Senden der dritten 1024 Bytes eines NanoJ-Programms; Header: Mailboxtyp NanoSPI, Busstatus Init:
    03 01 02 00 04 XX XX ... XX XX

    Im Gegensatz zur zweiten Nachricht ist nur der Counter erhöht worden, zudem sind die NanoJ-Daten die dritten 1024 Bytes des NanoJ-Programms.

  4. Senden der letzten 132 Bytes eines NanoJ-Programms; Header: Mailboxtyp NanoSPI, Busstatus Init:
    03 09 03 84 00 XX XX ... XX XX

    Die Bytes der obigen Nachricht haben folgende Bedeutung:

    • Byte 0 = 0x03 (Info Byte): Es wird die Mailbox NanoSPI genutzt, Busstatus ist Init.
    • Byte 1 = 0x09 (Indication Byte):
      • Datentyp ist NanoJ-Programm.
      • Toggle-Bit auf "0" gesetzt.
      • LastFrame-Bit auf "1" gesetzt, da dies letzte Nachricht der Übertragung ist.
      • Reset Comm-Bit ist auf "0" gesetzt
    • Byte 2 = 3 (Counter): Es ist die vierte Nachricht der Übertragung.
    • Byte 3 / 4 = 0x0084 (Length-Bytes): Byte 4 = 0x00, Byte 3 = 0x84, was zusammengesetzt die Datenlänge von 132 Byte in der Mailbox bedeutet.
    • Byte 5 bis einschließlich Byte 136: Sind die letzten 132 Bytes des NanoJ-Programms.
    • Byte 137 = 0xXX (CRC Byte)

Abbild

Um wichtige Objekte im Objektverzeichnis mit jeder Nachricht austauschen zu können, kann das Abbild verwendet werden. Das Abbild besteht nur noch aus Daten für das oder aus dem Objektverzeichnis. Meta-Informationen für die übermittelten Daten (also die Information Index, Subindex und Länge) für das Abbild werden vorab definiert und nicht mitgeschickt.

Das Abbild wird intern jede Millisekunde aktualisiert, beim Abholen der Daten sind alle Werte aktuell.

Generelles Prinzip

Grundsätzlich wird immer zwischen einem Abbild zum Empfang (RX) und einem zum Senden (TX) unterschieden.

  • RX bezeichnet die Daten, die zyklisch von der jeweiligen Steuerung vom SPI-Bus empfangen werden und damit in das Objektverzeichnis des Geräts geschrieben werden.
  • TX bezeichnet die Daten, die aus dem Objektverzeichnis der Steuerung gelesen und an den Master verschickt werden.

Die ankommenden Daten werden ins Objektverzeichnis kopiert, wie in der nachfolgenden Abbildung dargestellt. Anschließend wird das TX-Abbild zusammengestellt, das bei der nächsten Nachricht verschickt wird.

Die Zuordnung der Daten zu Objekten (das Mapping) wird in speziellen Objekten abgelegt.

Die Zuordnungen für den Empfang von Daten sind in den Objekten 1600h bis 1603h und 3500h einzutragen.

Die Zuordnungen für das Senden von Daten sind in den Objekten 1A00h bis 1A03h und 3600h einzutragen.

Das Mapping wird aktiv, sobald der SPI-Bus von Init auf Operational geschaltet wird. Für Änderungen muss der Bus zurück auf Init gesetzt werden, die Änderungen durchgeführt und im Anschluss der Bus wieder auf Operational geschaltet werden.

Anlegen eines Abbilds

Vier Objekte im Objektverzeichnis definieren in welchen Objekten das Mapping definiert ist :

  • Zwei Objekte für den RX-Abbilder: Objekt 3402h:01h3402h:04h für die Schnittstelle NanoSPI Ctrl (SLOT_SPI)) bzw. Objekt 3400h:01h3400h:04h für die Schnittstelle NanoSPI Comm (COMM_SPI) definieren die aktiven Mappings.

    Die Objekte 1600h bis 1603h oder 3500h beinhalten das Mapping.

  • Zwei Objekte für den TX-Abbilder: Objekt 3403h:01h3403h:04h für die Schnittstelle NanoSPI Ctrl (SLOT_SPI) bzw. Objekt 3401h:01h3401h:04h für die Schnittstelle NanoSPI Comm (COMM_SPI) definieren die aktiven Mappings.

    Die Objekte 1A00h bis 1A03h oder 3600h beinhalten das Mapping.

Beispiel:

Die Folgende Abbildung zeigt einen Ausschnitt aus dem Objektverzeichnis. Dabei sind alle relevanten Objekte für das RX-Abbild des NanoSPI Ctrl (SLOT_SPI) aufgezeichnet.

Objekt 3402h:00h definiert die Anzahl der aktiven Subeinträge. Im obigen Beispiel = 1. d. h. nur der Subindex 01h ist aktiv.

Objekt 3402h:01h bis 3402h:04 definiert, wo das Mapping im Objektverzeichnis hinterlegt ist. In dem Beispiel ist nur der Subindex 01h aktiv, somit nur das Objekt 1600h.

Das aktive Objekt bei 1600h:00 gibt wiederum an, wie viele der Subeinträge als aktiv gelten. In dem Beispiel sind die Einträge 1600h:01h und 1600h:02h aktiv. Dort die Informationen 60400010h und 607A00120h hinterlegt. So ein Mapping-Eintrag wird wie folgt aufgebaut:

  • Die oberen beiden Bytes des Eintrags entsprechen dem Index des abzubildenden Objekts
  • Das folgende Byte gibt den Subindex des abzubildenden Objekts vor
  • Das untere Byte gibt die Bit-Größe des abzubildenden Objekts an

Der Zahlenwert 60400010h in einem Mapping ergibt demnach

Das zu dem Beispiel aus der vorherigen Abbildung zugehörige Datenpaket ist nachfolgend dargestellt, die Zahlenwerte wie 0xABCD sind nur Beispiele.

Vorbelegung

Die in den nachfolgenden Tabellen aufgelisteten Werte sind beim Start der Steuerung vorbelegt.

Index Subindex aktives Rx Mapping
3400h 01h 1600h
3400h 02h 1601h
3402h 01h 1600h
3402h 02h 1601h
Index Subindex Ziel
1600h 01h 6060h Modes Of Operation
1600h 02h 6040h Controlword
1601h 01h 607Ah Target Position
1601h 02h 6042h Vl Target Velocity
1601h 03h 60FFh Target Velocity
1601h 04h 6071h Target Torque
1601h 05h 6098h Homing Method
Index Subindex Ziel
3500h 01h 3416h NanoSPI Slave Rx PDO Data:01h
3500h 02h 3416h NanoSPI Slave Rx PDO Data:02h
3500h 03h 3416h NanoSPI Slave Rx PDO Data:03h
3500h 04h 3416h NanoSPI Slave Rx PDO Data:04h
3500h 05h 3416h NanoSPI Slave Rx PDO Data:05h
3500h 06h 3416h NanoSPI Slave Rx PDO Data:06h
3500h 07h 3416h NanoSPI Slave Rx PDO Data:07h
3500h 08h 3416h NanoSPI Slave Rx PDO Data:08h
3500h 09h 3416h NanoSPI Slave Rx PDO Data:09h
3500h 0Ah 3416h NanoSPI Slave Rx PDO Data:0Ah
3500h 0Bh 3416h NanoSPI Slave Rx PDO Data:0Bh
Index Subindex aktives Tx Mapping
3401h 01h 1A00h
3401h 02h 1A01h
3403h 01h 1A00h
3403h 02h 1A01h
Index Subindex Ziel
1A00h 01h 6061h Modes Of Operation Display
1A00h 02h 6041h Statusword
1A00h 03h 1001h Error Register
1A01h 01h 6062h Position Demand Value
1A01h 02h 6064h Position Actual Value
1A01h 03h 60F4h Following Error Actual Value
1A01h 04h 6043h Vl Velocity Demand
1A01h 05h 6044h Vl Velocity Actual Value
1A01h 06h 606Bh Velocity Demand Value
1A01h 07h 606Ch Velocity Actual Value
1A01h 08h 6077h Torque Actual Value
Index Subindex Ziel
3600h 01h 3417h NanoSPI Slave Tx PDO Data:01h
3600h 02h 3417h NanoSPI Slave Tx PDO Data:02h
3600h 03h 3417h NanoSPI Slave Tx PDO Data:03h
3600h 04h 3417h NanoSPI Slave Tx PDO Data:04h
3600h 05h 3417h NanoSPI Slave Tx PDO Data:05h
3600h 06h 3417h NanoSPI Slave Tx PDO Data:06h
3600h 07h 3417h NanoSPI Slave Tx PDO Data:07h

Beispiel

In diesem Beispiel wird folgendes Szenario verwendet:

  • Der Anwender will mehrere geschwindigkeitsgesteuerte Fahrten im Profile Velocity Mode durchführen.
  • Alle nachfolgenden Befehle sind vom Master aus gesehen.

Das Beispiel gliedert sich in zwei Punkte:

  1. Vorbereitung: Hier wird das Mapping des Slaves angelegt, die Steuerung in den Profile Velocity Mode geschaltet und anschließend die Power State Machine aktiviert, siehe CiA 402 Power State Machine.
  2. Benutzung: Hier wird der laufende Betrieb erläutert.
Vorbereitung

Für den Profile Velocity Mode ist es sinnvoll, dass der Master per Abbild folgende Daten erhält und versendet:

  • TX-Mapping (Daten, die von dem Master an den Slave verschickt werden): Controlword 6040h:00h) zur Steuerung des Slaves und die Target Velocity (60FFh:00h) zum Vorgeben einer Zielgeschwindigkeit.
  • RX-Mapping (Daten, die von dem Slave an den Master verschickt werden): Statusword (6041h:00h) zur Überwachung des Slaves und die aktuelle Geschwindigkeit (Velocity actual value, 606Ch:00h).
TX Mapping des Masters

Daten, die der Master an den Slave verschickt, müssen in das RX-Mapping des Slaves eingetragen werden.

Das RX-Mapping wird im Objekt 1600h hinterlegt (die Objekte 1601h bis 1603h werden in diesem Beispiel nicht genutzt).

  • Setzen des 1600h:00h auf den Wert "02h" (Anzahl der Mappings = "2"); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Mapping:
    • Nachricht Master an Slave: 01 2F 00 16 00 02 00 00 00 18
    • Nachricht Slave an Master: 01 60 00 16 00 00 00 00 00 AC
    Anmerkung: Für den Erhalt einer Antwort muss eine weitere Nachricht verschickt werden, siehe SPI-Nachricht! Diese wird in den Beispielen nicht aufgelistet.

  • Setzen des 1600h:01h auf den Wert "60400010h" (Mapping: Controlword); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 23 00 16 01 10 00 40 60 2B
    • Antwort Slave an Master: 01 60 00 16 01 00 00 00 00 61

  • Setzen des 1600h:02h auf den Wert "60FF0020h" (Mapping: Target Velocity); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 23 00 16 02 20 00 FF 60 37
    • Antwort Slave an Master: 01 60 00 16 02 00 00 00 00 2F

  • Setzen des 3402h:00h auf den Wert "01h" (Anzahl aktiver Mappings = "1"); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 2F 02 34 00 01 00 00 00 32
    • Antwort Slave an Master: 01 60 00 16 00 00 00 00 00 AC

  • Setzen des 3402h:01h auf den Wert "1600h" (Aktives Mapping-Objekt = 1600h); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 2B 02 34 01 00 16 00 00 FE
    • Antwort Slave an Master: 01 60 02 34 01 00 00 00 00 00

RX Mapping des Masters

Daten, die vom Slave an den Master verschickt werden, müssen in das TX-Mapping des Slaves eingetragen werden.

Das TX-Mapping wird im Objekt 1A00h hinterlegt (die Objekte 1A01h bis 1A03h werden in diesem Beispiel nicht genutzt).

  • Setzen des 1A00h:00h auf den Wert "02h" (Anzahl der Mappings = "2"); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 2F 00 1A 00 02 00 00 00 65
    • Antwort Slave an Master: 01 60 00 1A 00 00 00 00 00 D1

  • Setzen des 1A00h:01h auf den Wert "60410010h" (Mapping: Statusword); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 23 00 1A 01 10 00 41 60 92
    • Antwort Slave an Master: 01 60 00 1A 01 00 00 00 00 1C

  • Setzen des 1A00h:02h auf den Wert "606C0020h" (Mapping: Velocity actual value ); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 23 00 1A 02 20 00 6C 60 DC
    • Antwort Slave an Master: 01 60 00 1A 02 00 00 00 00 52

  • Setzen des 3403h:00h auf den Wert "01h" (Anzahl aktiver Mappings = "1"); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
    • Nachricht Master an Slave: 01 2F 03 34 00 01 00 00 00 0F
    • Antwort Slave an Master: 01 60 03 34 00 00 00 00 00 33

Sonstige Einstellung und Aktivierung

An dieser Stelle wird das Objekt Mode of operation (6060h:00h) auf den Wert "03h" gesetzt, um den Profile Velocity Mode auszuwählen, siehe Profile Velocity.

Setzen des 6060h:00 auf den Wert "03h" (Mode of operation = Profile Velocity); Header: Mailboxtyp CANopen, Busstatus Init, deshalb kein Abbild
  • Nachricht Master an Slave: 01 2F 60 60 00 03 00 00 00 95
  • Antwort Slave an Master: 01 60 60 60 00 00 00 00 00 AE
Das Mapping wird aktiv, sobald der SPI-Bus von Init auf Operational geschaltet wird. Für Änderungen muss der Bus zurück auf Init gesetzt werden, die Änderungen durchgeführt und im Anschluss der Bus wieder auf Operational geschaltet werden.

Betrieb

Der Steuerung lässt sich jetzt mit dem Abbild direkt Werte vorgeben. Um den Motor einzuschalten, ist es nötig, das Controlword erst auf den Wert "6", dann auf "7" und zuletzt auf "15" zu setzen.
  • Schalten der Controlwords 6040h:00h auf "06h"; Header: keine Mailbox, Busstatus Operational, Mapping vorhanden: 6040h:00h = 06h, 60FFh:00h = 0000h

    Nachricht Master an Slave:
    40 06 00 00 00 00 00 75

    Diese Nachricht enthält ein Abbild, die nachfolgende Abbildung zeigt die einzelnen Bytes.

     

  • Controlword 6040h:00h auf "07h" schalten; Header: keine Mailbox, Busstatus Operational, Mapping vorhanden: 6040h:00h = 07h, 60FFh:00h = 0000h

    Nachricht Master an Slave: 40 07 00 00 00 00 00 42

  • Controlword 6040h:00h auf "0Fh" schalten; Header: keine Mailbox, Busstatus Operational, Mapping vorhanden: 6040h:00h = 0Fh, 60FFh:00h = 0000h

    Nachricht Master an Slave: 40 0F 00 00 00 00 00 E3

Im folgendem Beispiel wird die Geschwindigkeit auf "200" gesetzt:

Controlword 6040h:00h auf "0Fh" und 60FFh:00h auf "200" (="1F4h") schalten; Header: keine Mailbox, Busstatus Operational, Mapping vorhanden:

Nachricht Master an Slave: 40 0F 00 F4 01 00 00 37

CRC

Für den Cyclic Redundancy Check (CRC) wird das Polynom x^8+x^5+x^4+x^0 verwendet. Der Startwert ist 0 (siehe auch Maxim 1-Wire 8-Bit CRC). Die CRC wird über das INFO-Byte, die Mailbox-Daten und Abbild-Daten berechnet.

Die CRC kann auch mit dem Codeabschnitt aus nachfolgendem Listing berechnet werden.

uint8_t crc_array[256] = { 0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41, 0x9d, 0xc3, 0x21, 0x7f,
0xfc, 0xa2, 0x40, 0x1e, 0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc,
0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0, 0xe1, 0xbf, 0x5d, 0x03,
0x80, 0xde, 0x3c, 0x62, 0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff, 0x46, 0x18, 0xfa, 0xa4,
0x27, 0x79, 0x9b, 0xc5, 0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58, 0x19, 0x47, 0xa5, 0xfb,
0x78, 0x26, 0xc4, 0x9a, 0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6,
0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24, 0xf8, 0xa6, 0x44, 0x1a,
0x99, 0xc7, 0x25, 0x7b, 0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9,
0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 0x4e, 0x10, 0xf2, 0xac,
0x2f, 0x71, 0x93, 0xcd, 0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50, 0xaf, 0xf1, 0x13, 0x4d,
0xce, 0x90, 0x72, 0x2c, 0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee,
0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 0xf0, 0xae, 0x4c, 0x12,
0x91, 0xcf, 0x2d, 0x73, 0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b, 0x57, 0x09, 0xeb, 0xb5,
0x36, 0x68, 0x8a, 0xd4, 0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16,
0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 0x2b, 0x75, 0x97, 0xc9,
0x4a, 0x14, 0xf6, 0xa8, 0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35, };

uint8_t Calculate8BitBlockCrc( uint8_t *data, uint16_t length )
{
	uint8_t initValue = 0;
	uint8_t i;
	for( i=0; i<length; ++i )
	{
		initValue = crc_array[data[i] ^ initValue];
	}
	return initValue;
}

SPI-Slave Verhalten im Fehlerfall

Falls der Master an den Slave einen Error State sendet, geht der Slave in den Init-Status.

Sollte der Slave einen Fehler in der Nachricht erkennen (beispielsweise ein CRC-Fehler), wird der Slave in seiner nächsten Antwortnachricht im Info-Byte den Error-State mit einer CANopen Mailbox signalisieren, die dann eine SDO-Abort-Nachricht enthält, und in den Init-State umschalten. Mit der nächsten Nachricht vom Master wird er dessen Vorgaben wieder folgen.

SPI-Sub-Master

Mittels des SPI-Sub-Master-Betriebs können Sie zwei Steuerungen kaskadiert an einem Master betreiben. Der Master steuert den Sub-Master direkt und den Sub-Slave indirekt.

Statusword und Controlword

Der Sub-Master besitzt ein Statusword und ein Controlword. Mit dem Controlword lässt sich der Sub-Master ein- und ausschalten sowie in einen der Zustände Init oder Operational bringen. Im Statusword lässt sich der Status des Sub-Masters und des Sub-Slaves auslesen.

Zustände des Sub-Masters

Der Sub-Master kann sich in einem von drei verschiedenen Zuständen befinden:

  • Init:
    • Sub-Slave kann mit CANopen Nachrichten versorgt werden.
    • Das Abbild wird nicht verschickt und kann konfiguriert werden.
    • Keine Synchronisation
  • Operational:
    • Sub-Slave kann mit CANopen Nachrichten versorgt werden.
    • Das Abbild wird verschickt.
    • Synchronisation zwischen Sub-Master und Sub-Slave

Der Master kann selbstständig auf den Status Operational schalten, dazu muss das Bit 1 Managed Slave des Controlwords 3410h:00h auf 1 gesetzt werden (siehe 3410h NanoSPI Comm Controlword).

Controlword

Das Controlword liegt im Objektverzeichnis im Eintrag 3410h:00h (siehe 3410h NanoSPI Comm Controlword).

Nach Einschalten des Mikrocontrollers ist der Sub-Master standardmäßig deaktiviert. Bevor er genutzt werden kann, muss er eingeschalten werden (Bit 0 = "1").

Zudem kann festgelegt werden, ob der Master die Zustände selbständig bis zum Status Operational durchläuft (Bit 1 = "1") oder ob der Sub-Master über weitere Bits von außen in die entsprechenden Zustände geführt werden soll (Bit 1 = "0"). Bei einem selbständigen Durchlauf ist es nicht möglich, das Mapping des Sub-Slaves noch zu konfigurieren.

Die Bits 2 und 3 schalten den Sub-Master in den jeweiligen Zustand Init und Operational. Folgende Abbildung zeigt die Übergänge mit den jeweiligen Bits des Controlwords.

Statusword

Das Statusword 3411h (3411h NanoSPI Comm Statusword) zeigt den jeweiligen Status des Sub-Masters und des Sub-Slaves an. Das Statusword ist zweigeteilt: das LSB hält den Status des Sub-Masters, das MSB enthält den Status des Sub-Slaves.

Sub-Slave Kommunikation

Befehle an den Sub-Slave werden über die Objekte 3410h bis 3417h übertragen, siehe 3410h NanoSPI Comm Controlword bis 3417h NanoSPI Slave Tx PDO Data.

Senden

Zum Senden einer Nachricht, muss die CANopen-Mailbox des Sub-Masters genutzt werden. Dieser muss aktiviert sein.

Die Zusammenstellung der Nachricht lässt sich auf zwei Arten erreichen:

  • Objekt 3413h wird mit allen Informationen gefüllt (Index, Subindex, Länge, Wert) und Bit 1 des Objekts 3412h wird auf "0" zum Lesen und "1" zum Schreiben gesetzt, siehe 3413h NanoSPI SDO Request und 3412h NanoSPI SDO Control.

  • Eine fertige SDO-Nachricht mit 8 Bytes wird in 3414h eingetragen , siehe 3414h NanoSPI SDO Raw Request. Das reduziert die Anzahl der OD-Zugriffe, allerdings muss der Anwender die Bits und Bytes der CANopen Nachricht selbst zusammenstellen.

Verschickt wird die Nachricht indem Bit 0 im Objekt 3412h:00 auf "1" gesetzt wird, wobei Bit 2 definiert, ob die Nachricht aus 3413h:00 (Bit 2 ist "0") oder 3414h:00 (Bit 2 ist "1") verschickt wird, siehe 3412h NanoSPI SDO Control.

Der Sub-Master erledigt den Versand der Nachricht und setzt das Bit 0 in 3412h zurück, die Antwort liegt im Objekt 3415h sobald das Bit 3 des Objekts 3412h auf "1" gewechselt hat, siehe 3415h NanoSPI SDO Response und 3412h NanoSPI SDO Control.

Ausfüllen einer SDO-Nachricht

Objekt 3413h enthält alle Speicherplätze für eine vollständige SDO-Nachricht, siehe 3413h NanoSPI SDO Request. Folgende Informationen sind beim Versenden wichtig:

  • 3413h:01h (1 Byte, rw): SDO Header, wird beim Versenden automatisch ausgefüllt, sollte nicht beschrieben werden
  • 3413h:02h (2 Byte, rw): Index des zu schreibenden Objekts
  • 3413h:03h (1 Byte, rw): Subindex des zu schreibenden Objekts
  • 3413h:04h (1 Byte, rw): Länge der Daten in Bytes
  • 3413h:05h (4 Byte, rw): Daten

Anschließend kann das Objekt verschickt werden, siehe Senden einer vorbereiteten Nachricht.

Senden einer vorbereiteten Nachricht

Existiert eine fertige SDO-Nachricht , lässt sie sich in die beiden Subindizes des Objekts 3414h:01h und 3414h:02h schreiben, siehe 3414h NanoSPI SDO Raw Request. Anschließend kann die Nachricht versendet werden.

Tipp: Objekt 3414h:01h enthält dabei die MSBs der Nachricht, Objekt 3414h:02h die LSBs.
▶   weiter

Inhalt