CANOpen, SDO mit Arduino schicken

OP #6001769
Hallo,

Ich habe einen CANopen Slave, welchen ich mit einem Arduino ansteuern 
möchte. Der CAN-Bus funktioniert soweit tiptop und ich kann Daten 
verschicken und empfangen, jedoch weiss ich nicht, wie ich nun eine SDO 
schicken kann, um damit das OD zu manipulieren.

Der Aufbau des CAN-Frames ist im Anhang zu finden. Der Slave hat Node 
Adresse 10. Im OD möchte ich auf den Index 0x2301, SubIndex 0x00 
zugreifen, ein int64_t Wert.

Wie genau baue ich da die CAN Message auf? Die can_id müsste ja zuerst 
einmal den function code beinhalten (0b1100 für SDO transmit) sowie die 
node id (0x0A). Wo genau kommt nun aber der Index und der SubIndex hin?

Hier noch der Auszug aus dem Header der Library für CAN:
1
#ifndef CAN_H_
2
#define CAN_H_
3

4
#include <stdint.h>
5

6

7
typedef unsigned char __u8;
8
typedef unsigned short __u16;
9
typedef unsigned long __u32;
10

11

12
/* special address description flags for the CAN_ID */
13
#define CAN_EFF_FLAG 0x80000000UL /* EFF/SFF is set in the MSB */
14
#define CAN_RTR_FLAG 0x40000000UL /* remote transmission request */
15
#define CAN_ERR_FLAG 0x20000000UL /* error message frame */
16

17
/* valid bits in CAN ID for frame formats */
18
#define CAN_SFF_MASK 0x000007FFUL /* standard frame format (SFF) */
19
#define CAN_EFF_MASK 0x1FFFFFFFUL /* extended frame format (EFF) */
20
#define CAN_ERR_MASK 0x1FFFFFFFUL /* omit EFF, RTR, ERR flags */
21

22
/*
23
 * Controller Area Network Identifier structure
24
 *
25
 * bit 0-28 : CAN identifier (11/29 bit)
26
 * bit 29   : error message frame flag (0 = data frame, 1 = error message)
27
 * bit 30   : remote transmission request flag (1 = rtr frame)
28
 * bit 31   : frame format flag (0 = standard 11 bit, 1 = extended 29 bit)
29
 */
30
typedef __u32 canid_t;
31

32
#define CAN_SFF_ID_BITS     11
33
#define CAN_EFF_ID_BITS     29
34

35
/* CAN payload length and DLC definitions according to ISO 11898-1 */
36
#define CAN_MAX_DLC 8
37
#define CAN_MAX_DLEN 8
38

39
struct can_frame {
40
    canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */
41
    __u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
42
    __u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
43
};
44

45
#endif /* CAN_H_ */

Gruss Bert
Angehängte Dateien:
OP #6001803
Danke,

Ich kenne grundlegend wie CANOpen funktioniert, habe es schon mehrfach 
verwendet, aber die Wrapping Funktionen für SDOs habe ich noch nie 
selbst geschrieben.

https://www.csselectronics.com/screen/page/canopen-tutorial-simple-intro/language/en

NMT ist im pre-operational mode und somit kann es bereits SDOs 
empfangen.

Grundsätzlich müsste der SDO Frame wie angehängt aussehen. Wenn ich nun 
nur einen CAN Frame verwenden möchte, dann darf ich da maximal eine 
4byte Payload verschicken:

- Für Transmit ist der Function Code - >0b1100
- CCS ist auf download -> 0b001
- 1 Bit Reserve -> 0b0
- 2 Bit für Bytes die keine Daten enthalten in der Payload -> 0b00
- 1 Bit, ob alle Daten in einem Frame sind -> 0b1
- 1 Bit, ob Datengröße in den oberen 2 Bit angegeben ist -> 0b1
- 2 Byte Index -> 0x2302
- 1 Byte Subindex -> 0x00
- 4 Byte Payload -> int32_t value

Kann das so hinkommen?
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.