master/frame.h
changeset 73 9f4ea66d89a3
child 77 677967864795
equal deleted inserted replaced
72:7c986b717411 73:9f4ea66d89a3
       
     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 #define EC_MAX_DATA_SIZE (EC_MAX_FRAME_SIZE - EC_FRAME_HEADER_SIZE \
       
    20                                             - EC_COMMAND_HEADER_SIZE \
       
    21                                             - EC_COMMAND_FOOTER_SIZE)
       
    22 
       
    23 /*****************************************************************************/
       
    24 
       
    25 /**
       
    26    Status eines EtherCAT-Rahmens.
       
    27 */
       
    28 
       
    29 typedef enum {
       
    30   ec_frame_ready, ec_frame_sent, ec_frame_received
       
    31 }
       
    32 ec_frame_state_t;
       
    33 
       
    34 /*****************************************************************************/
       
    35 
       
    36 /**
       
    37    EtherCAT-Rahmen-Typ
       
    38 */
       
    39 
       
    40 typedef enum
       
    41 {
       
    42   ec_frame_type_none = 0x00, /**< Dummy */
       
    43   ec_frame_type_aprd = 0x01, /**< Auto-increment physical read */
       
    44   ec_frame_type_apwr = 0x02, /**< Auto-increment physical write */
       
    45   ec_frame_type_nprd = 0x04, /**< Node-addressed physical read */
       
    46   ec_frame_type_npwr = 0x05, /**< Node-addressed physical write */
       
    47   ec_frame_type_brd = 0x07,  /**< Broadcast read */
       
    48   ec_frame_type_bwr = 0x08,  /**< Broadcast write */
       
    49   ec_frame_type_lrw = 0x0C   /**< Logical read/write */
       
    50 }
       
    51 ec_frame_type_t;
       
    52 
       
    53 /*****************************************************************************/
       
    54 
       
    55 /**
       
    56    EtherCAT-Adresse.
       
    57 
       
    58    Im EtherCAT-Rahmen sind 4 Bytes für die Adresse reserviert, die je nach
       
    59    Kommandotyp, eine andere Bedeutung haben können: Bei Autoinkrementbefehlen
       
    60    sind die ersten zwei Bytes die (negative) Autoinkrement-Adresse, bei Knoten-
       
    61    adressierten Befehlen entsprechen sie der Knotenadresse. Das dritte und
       
    62    vierte Byte entspricht in diesen Fällen der physikalischen Speicheradresse
       
    63    auf dem Slave. Bei einer logischen Adressierung entsprechen alle vier Bytes
       
    64    der logischen Adresse.
       
    65 */
       
    66 
       
    67 typedef union
       
    68 {
       
    69   struct
       
    70   {
       
    71       uint16_t slave; /**< Adresse des Slaves */
       
    72       uint16_t mem; /**< Physikalische Speicheradresse im Slave */
       
    73   }
       
    74   physical; /**< Physikalische Adresse */
       
    75 
       
    76   uint32_t logical; /**< Logische Adresse */
       
    77   uint8_t raw[4]; /**< Rohdaten für die Generierung des Frames */
       
    78 }
       
    79 ec_address_t;
       
    80 
       
    81 /*****************************************************************************/
       
    82 
       
    83 /**
       
    84    EtherCAT-Frame.
       
    85 */
       
    86 
       
    87 typedef struct
       
    88 {
       
    89     ec_master_t *master; /**< EtherCAT-Master */
       
    90     ec_frame_type_t type; /**< Typ des Frames (APRD, NPWR, etc) */
       
    91     ec_address_t address; /**< Adresse des/der Empfänger */
       
    92     unsigned int data_length; /**< Länge der zu sendenden und/oder empfangenen
       
    93                                  Daten */
       
    94     ec_frame_state_t state; /**< Zustand des Kommandos */
       
    95     uint8_t index; /**< Kommando-Index, mit dem der Frame gesendet wurde
       
    96                             (wird vom Master beim Senden gesetzt). */
       
    97     uint16_t working_counter; /**< Working-Counter */
       
    98     uint8_t data[EC_MAX_FRAME_SIZE]; /**< Rahmendaten */
       
    99 }
       
   100 ec_frame_t;
       
   101 
       
   102 /*****************************************************************************/
       
   103 
       
   104 void ec_frame_init_nprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
   105                         unsigned int);
       
   106 void ec_frame_init_npwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
   107                         unsigned int, const unsigned char *);
       
   108 void ec_frame_init_aprd(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
   109                         unsigned int);
       
   110 void ec_frame_init_apwr(ec_frame_t *, ec_master_t *, uint16_t, uint16_t,
       
   111                         unsigned int, const unsigned char *);
       
   112 void ec_frame_init_brd(ec_frame_t *, ec_master_t *, uint16_t, unsigned int);
       
   113 void ec_frame_init_bwr(ec_frame_t *, ec_master_t *, uint16_t, unsigned int,
       
   114                        const unsigned char *);
       
   115 void ec_frame_init_lrw(ec_frame_t *, ec_master_t *, uint32_t, unsigned int,
       
   116                        unsigned char *);
       
   117 
       
   118 int ec_frame_send(ec_frame_t *);
       
   119 int ec_frame_receive(ec_frame_t *);
       
   120 int ec_frame_send_receive(ec_frame_t *);
       
   121 
       
   122 void ec_frame_print(const ec_frame_t *);
       
   123 
       
   124 /*****************************************************************************/
       
   125 
       
   126 #endif
       
   127 
       
   128 /* Emacs-Konfiguration
       
   129 ;;; Local Variables: ***
       
   130 ;;; c-basic-offset:4 ***
       
   131 ;;; End: ***
       
   132 */