diff -r 7c986b717411 -r 9f4ea66d89a3 master/frame.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/master/frame.h Thu Feb 23 09:58:50 2006 +0000 @@ -0,0 +1,132 @@ +/****************************************************************************** + * + * f r a m e . h + * + * Struktur für einen EtherCAT-Rahmen. + * + * $Id$ + * + *****************************************************************************/ + +#ifndef _EC_FRAME_H_ +#define _EC_FRAME_H_ + +#include "globals.h" +#include "../include/EtherCAT_rt.h" + +/*****************************************************************************/ + +#define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE - EC_FRAME_HEADER_SIZE \ + - EC_COMMAND_HEADER_SIZE \ + - EC_COMMAND_FOOTER_SIZE) + +/*****************************************************************************/ + +/** + Status eines EtherCAT-Rahmens. +*/ + +typedef enum { + ec_frame_ready, ec_frame_sent, ec_frame_received +} +ec_frame_state_t; + +/*****************************************************************************/ + +/** + EtherCAT-Rahmen-Typ +*/ + +typedef enum +{ + ec_frame_type_none = 0x00, /**< Dummy */ + ec_frame_type_aprd = 0x01, /**< Auto-increment physical read */ + ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */ + ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */ + ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */ + ec_frame_type_brd = 0x07, /**< Broadcast read */ + ec_frame_type_bwr = 0x08, /**< Broadcast write */ + ec_frame_type_lrw = 0x0C /**< Logical read/write */ +} +ec_frame_type_t; + +/*****************************************************************************/ + +/** + EtherCAT-Adresse. + + Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach + Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen + sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten- + adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und + vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse + auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes + der logischen Adresse. +*/ + +typedef union +{ + struct + { + uint16_t slave; /**< Adresse des Slaves */ + uint16_t mem; /**< Physikalische Speicheradresse im Slave */ + } + physical; /**< Physikalische Adresse */ + + uint32_t logical; /**< Logische Adresse */ + uint8_t raw[4]; /**< Rohdaten für die Generierung des Frames */ +} +ec_address_t; + +/*****************************************************************************/ + +/** + EtherCAT-Frame. +*/ + +typedef struct +{ + ec_master_t *master; /**< EtherCAT-Master */ + ec_frame_type_t type; /**< Typ des Frames (APRD, NPWR, etc) */ + ec_address_t address; /**< Adresse des/der Empfänger */ + unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen + Daten */ + ec_frame_state_t state; /**< Zustand des Kommandos */ + uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde + (wird vom Master beim Senden gesetzt). */ + uint16_t working_counter; /**< Working-Counter */ + uint8_t data[EC_MAX_FRAME_SIZE]; /**< Rahmendaten */ +} +ec_frame_t; + +/*****************************************************************************/ + +void ec_frame_init_nprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, + unsigned int); +void ec_frame_init_npwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, + unsigned int, const unsigned char *); +void ec_frame_init_aprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, + unsigned int); +void ec_frame_init_apwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t, + unsigned int, const unsigned char *); +void ec_frame_init_brd(ec_frame_t *, ec_master_t *, uint16_t, unsigned int); +void ec_frame_init_bwr(ec_frame_t *, ec_master_t *, uint16_t, unsigned int, + const unsigned char *); +void ec_frame_init_lrw(ec_frame_t *, ec_master_t *, uint32_t, unsigned int, + unsigned char *); + +int ec_frame_send(ec_frame_t *); +int ec_frame_receive(ec_frame_t *); +int ec_frame_send_receive(ec_frame_t *); + +void ec_frame_print(const ec_frame_t *); + +/*****************************************************************************/ + +#endif + +/* Emacs-Konfiguration +;;; Local Variables: *** +;;; c-basic-offset:4 *** +;;; End: *** +*/