master/frame.h
changeset 98 f564d0929292
parent 97 e6264685dd7b
child 99 72e375b0b308
equal deleted inserted replaced
97:e6264685dd7b 98:f564d0929292
     1 /******************************************************************************
       
     2  *
       
     3  *  f r a m e . h
       
     4  *
       
     5  *  Struktur für einen EtherCAT-Rahmen.
       
     6  *
       
     7  *  $Id$
       
     8  *
       
     9  *****************************************************************************/
       
    10 
       
    11 #ifndef _EC_FRAME_H_
       
    12 #define _EC_FRAME_H_
       
    13 
       
    14 #include "globals.h"
       
    15 #include "../include/EtherCAT_rt.h"
       
    16 
       
    17 /*****************************************************************************/
       
    18 
       
    19 /**
       
    20    EtherCAT-Rahmen-Typ
       
    21 */
       
    22 
       
    23 typedef enum
       
    24 {
       
    25   ec_frame_type_none = 0x00, /**< Dummy */
       
    26   ec_frame_type_aprd = 0x01, /**< Auto-increment physical read */
       
    27   ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */
       
    28   ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */
       
    29   ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */
       
    30   ec_frame_type_brd  = 0x07, /**< Broadcast read */
       
    31   ec_frame_type_bwr  = 0x08, /**< Broadcast write */
       
    32   ec_frame_type_lrw  = 0x0C  /**< Logical read/write */
       
    33 }
       
    34 ec_frame_type_t;
       
    35 
       
    36 /*****************************************************************************/
       
    37 
       
    38 /**
       
    39    EtherCAT-Adresse.
       
    40 
       
    41    Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach
       
    42    Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen
       
    43    sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten-
       
    44    adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und
       
    45    vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse
       
    46    auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes
       
    47    der logischen Adresse.
       
    48 */
       
    49 
       
    50 typedef union
       
    51 {
       
    52   struct
       
    53   {
       
    54       uint16_t slave; /**< Adresse des Slaves (Ringposition oder Knoten) */
       
    55       uint16_t mem; /**< Physikalische Speicheradresse im Slave */
       
    56   }
       
    57   physical; /**< Physikalische Adresse */
       
    58 
       
    59   uint32_t logical; /**< Logische Adresse */
       
    60 }
       
    61 ec_address_t;
       
    62 
       
    63 /*****************************************************************************/
       
    64 
       
    65 /**
       
    66    EtherCAT-Frame.
       
    67 */
       
    68 
       
    69 typedef struct
       
    70 {
       
    71     ec_master_t *master; /**< EtherCAT-Master */
       
    72     ec_frame_type_t type; /**< Typ des Frames (APRD, NPWR, etc) */
       
    73     ec_address_t address; /**< Adresse des/der Empfänger */
       
    74     unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen
       
    75                                  Daten */
       
    76     uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde
       
    77                             (wird vom Master beim Senden gesetzt). */
       
    78     uint16_t working_counter; /**< Working-Counter */
       
    79     uint8_t data[EC_MAX_FRAME_SIZE]; /**< Rahmendaten */
       
    80 }
       
    81 ec_frame_t;
       
    82 
       
    83 /*****************************************************************************/
       
    84 
       
    85 void ec_frame_init_nprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
    86                         unsigned int);
       
    87 void ec_frame_init_npwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
    88                         unsigned int, const unsigned char *);
       
    89 void ec_frame_init_aprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
    90                         unsigned int);
       
    91 void ec_frame_init_apwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
    92                         unsigned int, const unsigned char *);
       
    93 void ec_frame_init_brd(ec_frame_t *, ec_master_t *, uint16_t, unsigned int);
       
    94 void ec_frame_init_bwr(ec_frame_t *, ec_master_t *, uint16_t, unsigned int,
       
    95                        const unsigned char *);
       
    96 void ec_frame_init_lrw(ec_frame_t *, ec_master_t *, uint32_t, unsigned int,
       
    97                        unsigned char *);
       
    98 
       
    99 int ec_frame_send(ec_frame_t *);
       
   100 int ec_frame_receive(ec_frame_t *);
       
   101 int ec_frame_send_receive(ec_frame_t *);
       
   102 
       
   103 /*****************************************************************************/
       
   104 
       
   105 #endif
       
   106 
       
   107 /* Emacs-Konfiguration
       
   108 ;;; Local Variables: ***
       
   109 ;;; c-basic-offset:4 ***
       
   110 ;;; End: ***
       
   111 */