EtherCAT slave that reads 3 Xsens IMU's connected to a Xbus Master

Dependencies:   MODSERIAL mbed KL25Z_ClockControl

Fork of EtherCAT by First Last

Revision:
0:a8daa9348a67
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EtherCAT/esc.h	Mon Nov 17 13:55:07 2014 +0000
@@ -0,0 +1,445 @@
+/*
+ * SOES Simple Open EtherCAT Slave
+ *
+ * File    : esc.h
+ * Version : 1.0.0
+ * Date    : 11-07-2010
+ * Copyright (C) 2007-2010 Arthur Ketels
+ *
+ * SOES is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the Free
+ * Software Foundation.
+ *
+ * SOES is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * As a special exception, if other files instantiate templates or use macros
+ * or inline functions from this file, or you compile this file and link it
+ * with other works to produce a work based on this file, this file does not
+ * by itself cause the resulting work to be covered by the GNU General Public
+ * License. However the source code for this file must still be made available
+ * in accordance with section (3) of the GNU General Public License.
+ *
+ * This exception does not invalidate any other reasons why a work based on
+ * this file might be covered by the GNU General Public License.
+ *
+ * The EtherCAT Technology, the trade name and logo "EtherCAT" are the intellectual
+ * property of, and protected by Beckhoff Automation GmbH.
+ */
+#ifndef __esc__
+#define __esc__
+
+// storage modifier for data stored in flashmemory
+#define FLASHSTORE              const
+//#define FLASHSTORE
+#define PACKED					__attribute__((__packed__))
+
+#define ESCREG_ADDRESS          0x0010
+#define ESCREG_DLSTATUS         0x0110
+#define ESCREG_ALCONTROL        0x0120
+#define ESCREG_ALSTATUS         0x0130
+#define ESCREG_ALERROR          0x0134
+#define ESCREG_ALEVENT_SM_MASK  0x0310
+#define ESCREG_ALEVENT_SMCHANGE 0x0010
+#define ESCREG_ALEVENT_CONTROL  0x0001
+#define ESCREG_ALEVENT_SM2		0x0400
+#define ESCREG_WDSTATUS         0x0440
+#define ESCREG_SM0              0x0800
+#define ESCREG_SM0STATUS        ESCREG_SM0 + 5
+#define ESCREG_SM0PDI           ESCREG_SM0 + 7
+#define ESCREG_SM1              ESCREG_SM0 + 0x08
+#define ESCREG_SM2              ESCREG_SM0 + 0x10
+#define ESCREG_SM3              ESCREG_SM0 + 0x18
+#define ESCREG_LOCALTIME		0x0910
+#define ESCREG_SMENABLE_BIT     0x01
+
+#define ESCinit         		0x01
+#define ESCpreop        		0x02
+#define ESCsafeop       		0x04
+#define ESCop           		0x08
+#define ESCerror        		0x10
+
+#define INIT_TO_INIT            0x11
+#define INIT_TO_PREOP           0x21
+#define INIT_TO_BOOT            0x31
+#define INIT_TO_SAFEOP          0x41
+#define INIT_TO_OP              0x81
+#define PREOP_TO_INIT           0x12
+#define PREOP_TO_PREOP          0x22
+#define PREOP_TO_BOOT           0x32
+#define PREOP_TO_SAFEOP         0x42
+#define PREOP_TO_OP             0x82
+#define SAFEOP_TO_INIT          0x14
+#define SAFEOP_TO_PREOP         0x24
+#define SAFEOP_TO_BOOT          0x34
+#define SAFEOP_TO_SAFEOP        0x44
+#define SAFEOP_TO_OP            0x84
+#define OP_TO_INIT              0x18
+#define OP_TO_PREOP             0x28
+#define OP_TO_BOOT              0x38
+#define OP_TO_SAFEOP            0x48
+#define OP_TO_OP                0x88
+
+#define ALERR_NONE                      0x0000
+#define ALERR_INVALIDSTATECHANGE        0x0011
+#define ALERR_UNKNOWNSTATE              0x0012
+#define ALERR_BOOTNOTSUPPORTED          0x0013
+#define ALERR_INVALIDMBXCONFIG          0x0016
+#define ALERR_INVALIDSMCONFIG           0x0017
+#define ALERR_WATCHDOG					0x0019
+#define ALERR_INVALIDOUTPUTSM			0x001D
+#define ALERR_INVALIDINPUTSM			0x001E
+
+#define MBXERR_SYNTAX                   0x0001
+#define MBXERR_UNSUPPORTEDPROTOCOL      0x0002
+#define MBXERR_INVALIDCHANNEL           0x0003
+#define MBXERR_SERVICENOTSUPPORTED      0x0004
+#define MBXERR_INVALIDHEADER            0x0005
+#define MBXERR_SIZETOOSHORT             0x0006
+#define MBXERR_NOMOREMEMORY             0x0007
+#define MBXERR_INVALIDSIZE              0x0008
+
+#define ABORT_NOTOGGLE                  0x05030000
+#define ABORT_UNKNOWN                   0x05040001
+#define ABORT_UNSUPPORTED               0x06010000
+#define ABORT_WRITEONLY                 0x06010001
+#define ABORT_READONLY                  0x06010002
+#define ABORT_NOOBJECT                  0x06020000
+#define ABORT_TYPEMISMATCH              0x06070010
+#define ABORT_NOSUBINDEX                0x06090011
+#define ABORT_GENERALERROR              0x08000000
+#define ABORT_NOTINTHISSTATE            0x08000022
+
+#define MBXstate_idle                   0x00
+#define MBXstate_inclaim                0x01
+#define MBXstate_outclaim               0x02
+#define MBXstate_outreq                 0x03
+#define MBXstate_outpost                0x04
+#define MBXstate_backup                 0x05
+#define MBXstate_again                  0x06
+
+#define COE_DEFAULTLENGTH               0x0a
+#define COE_HEADERSIZE                  0x0a
+#define COE_SEGMENTHEADERSIZE           0x03
+#define COE_SDOREQUEST                  0x02
+#define COE_SDORESPONSE                 0x03
+#define COE_SDOINFORMATION              0x08
+#define COE_COMMAND_SDOABORT            0x80
+#define COE_COMMAND_UPLOADREQUEST       0x40
+#define COE_COMMAND_UPLOADRESPONSE      0x40
+#define COE_COMMAND_UPLOADSEGMENT       0x00
+#define COE_COMMAND_UPLOADSEGREQ        0x60
+#define COE_COMMAND_DOWNLOADRESPONSE    0x60
+#define COE_COMMAND_LASTSEGMENTBIT      0x01
+#define COE_SIZE_INDICATOR              0x01
+#define COE_EXPEDITED_INDICATOR         0x02
+#define COE_COMPLETEACCESS              0x10
+#define COE_TOGGLEBIT                   0x10
+#define COE_INFOERROR                   0x07
+#define COE_GETODLISTRESPONSE           0x02
+#define COE_GETODRESPONSE               0x04
+#define COE_ENTRYDESCRIPTIONRESPONSE    0x06
+#define COE_VALUEINFO_ACCESS            0x01
+#define COE_VALUEINFO_OBJECT            0x02
+#define COE_VALUEINFO_MAPPABLE          0x04
+#define COE_VALUEINFO_TYPE              0x08
+#define COE_VALUEINFO_DEFAULT           0x10
+#define COE_VALUEINFO_MINIMUM           0x20
+#define COE_VALUEINFO_MAXIMUM           0x40
+
+//////////////////////////////////////////////////////////
+#define MBXSIZE                 		0x80
+#define MBXBUFFERS              		3
+
+#define MBX0_sma                		0x1000
+#define MBX0_sml                		MBXSIZE
+#define MBX0_sme                		MBX0_sma+MBX0_sml-1
+#define MBX0_smc                		0x26
+#define MBX1_sma                		0x1080
+#define MBX1_sml                		MBXSIZE
+#define MBX1_sme                		MBX1_sma+MBX1_sml-1
+#define MBX1_smc                		0x22
+
+#define SM2_sma                 		0x1100
+#define SM2_smc                 		0x24
+#define SM2_act					0x01
+#define SM3_sma                 		0x1180
+#define SM3_smc                 		0x20
+#define SM3_act					0x01
+/////////////////////////////////////////////////////////////
+
+#define MBXHSIZE 						sizeof(_MBXh)
+#define MBXDSIZE 						MBXSIZE-MBXHSIZE
+
+#define MBXERR                  		0x00
+#define MBXAOE 		        	        0x01
+#define MBXEOE      		            0x02
+#define MBXCOE		        	        0x03
+#define MBXFOE      		            0x04
+#define MBXODL      		            0x10
+#define MBXOD               		    0x20
+#define MBXED      			            0x30
+#define MBXSEU              		    0x40
+#define MBXSED                  		0x50
+
+#define SMRESULT_ERRSM0					0x01
+#define SMRESULT_ERRSM1					0x02
+#define SMRESULT_ERRSM2					0x04
+#define SMRESULT_ERRSM3					0x08
+
+// Attention! this struct is always little-endian
+typedef struct  PACKED
+  {
+    uint16        PSA;
+    uint16        Length;
+
+#if defined(EC_LITTLE_ENDIAN)
+    uint8         Mode:2;
+    uint8         Direction:2;
+    uint8         IntECAT:1;
+    uint8         IntPDI:1;
+    uint8         WTE:1;
+    uint8         R1:1;
+
+    uint8         IntW:1;
+    uint8         IntR:1;
+    uint8         R2:1;
+    uint8         MBXstat:1;
+    uint8         BUFstat:2;
+    uint8         R3:2;
+
+    uint8         ECsm:1;
+    uint8         ECrep:1;
+    uint8         ECr4:4;
+    uint8         EClatchEC:1;
+    uint8         EClatchPDI:1;
+
+    uint8         PDIsm:1;
+    uint8         PDIrep:1;
+    uint8         PDIr5:6;
+#endif
+
+#if defined(EC_BIG_ENDIAN)
+    uint8         R1:1;
+    uint8         WTE:1;
+    uint8         IntPDI:1;
+    uint8         IntECAT:1;
+    uint8         Direction:2;
+    uint8         Mode:2;
+
+    uint8         R3:2;
+    uint8         BUFstat:2;
+    uint8         MBXstat:1;
+    uint8         R2:1;
+    uint8         IntR:1;
+    uint8         IntW:1;
+
+    uint8         EClatchPDI:1;
+    uint8         EClatchEC:1;
+    uint8         ECr4:4;
+    uint8         ECrep:1;
+    uint8         ECsm:1;
+
+    uint8         PDIr5:6;
+    uint8         PDIrep:1;
+    uint8         PDIsm:1;
+#endif
+  } _ESCsm;
+
+// Attention! this struct is always little-endian
+typedef struct PACKED
+  {
+    uint16        PSA;
+    uint16        Length;
+    uint8         Command;
+    uint8         Status;
+    uint8         ActESC;
+    uint8         ActPDI;
+  } _ESCsm2;
+
+typedef FLASHSTORE struct PACKED
+  {
+    uint16        PSA;
+    uint16        Length;
+    uint8         Command;
+  } _ESCsmCompact;
+
+typedef struct
+  {
+    uint16        ALevent;
+    uint16        ALstatus;
+    uint16        ALcontrol;
+    uint16        ALerror;
+    uint16        DLstatus;
+    uint16        address;
+    uint8         mbxcnt;
+    uint8         mbxincnt;
+    uint8         mbxoutpost;
+    uint8         mbxbackup;
+    uint8         xoe;
+    uint8         txcue;
+    uint8         mbxfree;
+    uint8         segmented;
+    void          *data;
+    uint16        entries;
+    uint16        frags;
+    uint16        fragsleft;
+
+#if defined(EC_LITTLE_ENDIAN)
+    uint8         r1:1;
+    uint8         toggle:1;
+    uint8         r2:6;
+#endif
+
+#if defined(EC_BIG_ENDIAN)
+    uint8         r2:6;
+    uint8         toggle:1;
+    uint8         r1:1;
+#endif
+
+	uint8		  SMtestresult;
+    int16         temp;
+    uint16        wdcnt;
+    uint32        PrevTime;
+    uint32        Time;
+    _ESCsm        SM[4];
+  } _ESCvar;
+
+typedef struct PACKED
+  {
+    uint16        length;
+    uint16        address;
+
+#if defined(EC_LITTLE_ENDIAN)
+    uint8         channel:6;
+    uint8         priority:2;
+
+    uint8         mbxtype:4;
+    uint8         mbxcnt: 4;
+#endif
+
+#if defined(EC_BIG_ENDIAN)
+    uint8         priority:2;
+    uint8         channel:6;
+
+    uint8         mbxcnt: 4;
+    uint8         mbxtype:4;
+#endif
+  } _MBXh;
+
+typedef struct PACKED
+  {
+    _MBXh         header;
+    uint8         b[MBXDSIZE];
+  } _MBX;
+
+typedef struct PACKED
+  {
+	uint16        numberservice;
+  } _COEh;
+
+typedef struct PACKED
+  {
+#if defined(EC_LITTLE_ENDIAN)
+	uint8         opcode:7;
+	uint8         incomplete:1;
+#endif
+
+#if defined(EC_BIG_ENDIAN)
+	uint8         incomplete:1;
+	uint8         opcode:7;
+#endif
+
+    uint8         reserved;
+    uint16        fragmentsleft;
+  } _INFOh;
+
+typedef struct PACKED
+  {
+    _MBXh         mbxheader;
+    uint16        type;
+    uint16        detail;
+  } _MBXerr;
+
+typedef struct PACKED
+  {
+    _MBXh         mbxheader;
+    _COEh         coeheader;
+    uint8         command;
+    uint16        index;
+    uint8         subindex;
+    uint32        size;
+  } _COEsdo;
+
+typedef struct PACKED
+  {
+    _MBXh         mbxheader;
+    _COEh         coeheader;
+    _INFOh        infoheader;
+    uint16        index;
+    uint16        datatype;
+    uint8         maxsub;
+    uint8         objectcode;
+    char          name;
+  } _COEobjdesc;
+
+typedef struct PACKED
+  {
+    _MBXh         mbxheader;
+    _COEh         coeheader;
+    _INFOh        infoheader;
+    uint16        index;
+    uint8         subindex;
+    uint8         valueinfo;
+    uint16        datatype;
+    uint16        bitlength;
+    uint16        access;
+    char          name;
+  } _COEentdesc;
+
+// state definition in mailbox
+// 0 : idle
+// 1 : claimed for inbox
+// 2 : claimed for outbox
+// 3 : request post outbox
+// 4 : outbox posted not send
+// 5 : backup outbox
+// 6 : mailbox needs to be transmitted again
+typedef struct
+  {
+    uint8         state;
+  } _MBXcontrol;
+
+uint16 sizeTXPDO(void);
+uint16 sizeRXPDO(void);
+uint8 ESC_read(uint16 address,void *buf,uint8 len,void *tALevent);
+uint8 ESC_write(uint16 address,void *buf,uint8 len,void *tALevent);
+void ESC_ALerror(uint16 errornumber);
+void ESC_ALstatus(uint8 status);
+void ESC_SMstatus(uint8 n);
+uint8 ESC_WDstatus(void);
+uint8 ESC_startmbx(uint8 state);
+void ESC_stopmbx(void);
+uint8 ESC_mbxprocess(void);
+void ESC_coeprocess(void);
+void ESC_xoeprocess(void);
+uint8 ESC_startinput(uint8 state);
+void ESC_stopinput(void);
+uint8 ESC_startoutput(uint8 state);
+void ESC_stopoutput(void);
+void ESC_ALevent(void);
+void ESC_state(void);
+extern void ESC_objecthandler(uint16 index, uint8 subindex);
+extern void APP_safeoutput(void);
+
+extern _ESCvar         ESCvar;
+extern _MBX            MBX[MBXBUFFERS];
+extern _MBXcontrol     MBXcontrol[MBXBUFFERS];
+extern uint8           MBXrun;
+extern uint16          SM2_sml,SM3_sml;
+extern uint8		   SDO1C12size;
+
+#endif
+