Forum: Mikrocontroller und Digitale Elektronik CANOpen, SDO mit Arduino schicken


von Bert S. (kautschuck)


Angehängte Dateien:

Lesenswert?

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

: Bearbeitet durch User
von R. B. (britzi)


Lesenswert?

Hi,

schau mal hier:
https://de.nanotec.com/produkte/manual/PD4C_CAN_DE/bus%252Fcan%252Fcan_reference.html/

Dort und auf den folgenden Seiten (unten auf "Weiter" klicken) findest 
du eine gute Erklärung von CANopen.

Nur SDO reicht in der Regel nicht. Schau dir auch mal NMT an, um den 
Node überhaupt erstmal betriebsbereit zu machen.

: Bearbeitet durch User
von Bert S. (kautschuck)


Angehängte Dateien:

Lesenswert?

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?

von Nils (Gast)


Lesenswert?

Bert S. schrieb:
> Kann das so hinkommen?

Sieht auf den ersten Blick schlüssig aus.

Probier es doch einfach aus. Wenn Deine SDO stimmt, dann bekommst Du 
auch eine Antwort vom Gerät.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.