EasyCAT shield library - It allows you to make an EtherCAT slave

Dependents:   TestEasyCAT_SM_sync TestEasyCAT_LoopBack TestEasyCAT_DC_sync TestEasyCAT

The EasyCAT Shield and /static/img/mbed.gif boards

/media/uploads/EasyCAT/easycat_onnucleo.jpg

  • The EasyCAT Shield is an Arduino shield, designed and manufactured in Italy by AB&T Tecnologie Informatiche, that allow us to build a custom EtherCAT® slave in an easy way.
  • The EasyCAT Shield uses the 3x2 SPI connector to communicate with the microcontroller. This connector is standard on all the Arduino boards but some Arduino compatible boards don’t provide it. In this case, the SPI signal are always present on pins 13,12,and 11. Some examples of this boards are the STM32 Nucleo and the NXP LPCXpresso, part of the Mbed ecosystem.
  • To address this issue in the EasyCAT Shield revision “C” there are three solder jumpers, on the bottom side of the board, that allow us to connect the SPI signals, SCK,MISO and MOSI, also on pins 13, 12 and 11.

/media/uploads/EasyCAT/spi_selection_jumpered.jpg

  • For your convenience the EasyCAT Shield can be ordered with the three solder jumpers already bridged and with the 3x2 connector not installed on the board. To request this option select EasyCAT spi_on_13_12_11 in the webshop.

Import libraryEasyCAT_lib

EasyCAT shield library - It allows you to make an EtherCAT slave

Committer:
EasyCAT
Date:
Sat Apr 10 14:49:17 2021 +0000
Revision:
3:7d8b74ba7225
Parent:
0:7816b38c99cc
Updated for OS6 compatibility

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EasyCAT 0:7816b38c99cc 1 //********************************************************************************************
EasyCAT 0:7816b38c99cc 2 // *
EasyCAT 0:7816b38c99cc 3 // AB&T Tecnologie Informatiche - Ivrea Italy *
EasyCAT 0:7816b38c99cc 4 // http://www.bausano.net *
EasyCAT 0:7816b38c99cc 5 // https://www.ethercat.org/en/products/791FFAA126AD43859920EA64384AD4FD.htm *
EasyCAT 0:7816b38c99cc 6 // *
EasyCAT 0:7816b38c99cc 7 //********************************************************************************************
EasyCAT 0:7816b38c99cc 8 // *
EasyCAT 0:7816b38c99cc 9 // This software is distributed as an example, in the hope that it could be useful, *
EasyCAT 0:7816b38c99cc 10 // WITHOUT ANY WARRANTY, even the implied warranty of FITNESS FOR A PARTICULAR PURPOSE *
EasyCAT 0:7816b38c99cc 11 // *
EasyCAT 0:7816b38c99cc 12 //********************************************************************************************
EasyCAT 0:7816b38c99cc 13
EasyCAT 0:7816b38c99cc 14
EasyCAT 0:7816b38c99cc 15 //----- EasyCAT library for mbed boards 170912 ----------------------------------------------
EasyCAT 0:7816b38c99cc 16 //----- Derived from the AB&T EasyCAT Arduino shield library V 1.5 --------------------------
EasyCAT 0:7816b38c99cc 17
EasyCAT 0:7816b38c99cc 18 //----- Tested with the STM32 NUCLEO-F767ZI board -------------------------------------------
EasyCAT 0:7816b38c99cc 19
EasyCAT 0:7816b38c99cc 20
EasyCAT 0:7816b38c99cc 21
EasyCAT 0:7816b38c99cc 22
EasyCAT 0:7816b38c99cc 23 #ifndef EasyCAT_H
EasyCAT 0:7816b38c99cc 24 #define EasyCAT_H
EasyCAT 0:7816b38c99cc 25
EasyCAT 0:7816b38c99cc 26
EasyCAT 0:7816b38c99cc 27
EasyCAT 0:7816b38c99cc 28
EasyCAT 0:7816b38c99cc 29 //****** PDO configuration parameters ********************************************************
EasyCAT 0:7816b38c99cc 30
EasyCAT 0:7816b38c99cc 31 // Here we can define how many I/O bytes our EasyCAT can exchange
EasyCAT 0:7816b38c99cc 32
EasyCAT 0:7816b38c99cc 33 // We can use STANDARD MODE or CUSTOM MODE
EasyCAT 0:7816b38c99cc 34 // !!! Warning: CUSTOM MODE is recommended only for advanced users !!!
EasyCAT 0:7816b38c99cc 35
EasyCAT 0:7816b38c99cc 36 // In STANDARD MODE the EasyCAT exchanges a fixed number of bytes
EasyCAT 0:7816b38c99cc 37 // in input and in output
EasyCAT 0:7816b38c99cc 38 // The number of bytes in input are equal to the number of bytes in output
EasyCAT 0:7816b38c99cc 39 // Valid values are 16, 32, 64, 128
EasyCAT 0:7816b38c99cc 40 //
EasyCAT 0:7816b38c99cc 41 // The configuration EEPROM on board of the EasyCAT must be
EasyCAT 0:7816b38c99cc 42 // loaded with the corresponding bin file, provided by AB&T
EasyCAT 0:7816b38c99cc 43 //
EasyCAT 0:7816b38c99cc 44 // The EasyCAT is shipped configured for 32+32 bytes I.E. with
EasyCAT 0:7816b38c99cc 45 // the "EasyCAT_32_32.bin" file loaded into the configuration EEPROM
EasyCAT 0:7816b38c99cc 46
EasyCAT 0:7816b38c99cc 47
EasyCAT 0:7816b38c99cc 48 //-- BYTE_NUM ----------- Byte exchanged ------ Config EEPROM file
EasyCAT 0:7816b38c99cc 49
EasyCAT 0:7816b38c99cc 50 //#define BYTE_NUM 16 // 16 + 16 EasyCAT_16_16.bin
EasyCAT 0:7816b38c99cc 51 #define BYTE_NUM 32 // 32 + 32 EasyCAT_32_32.bin
EasyCAT 0:7816b38c99cc 52 //#define BYTE_NUM 64 // 64 + 64 EasyCAT_64_64.bin
EasyCAT 0:7816b38c99cc 53 //#define BYTE_NUM 128 // 128 + 128 EasyCAT_128_128.bin
EasyCAT 0:7816b38c99cc 54
EasyCAT 0:7816b38c99cc 55
EasyCAT 0:7816b38c99cc 56
EasyCAT 0:7816b38c99cc 57 // In CUSTOM MODE, recommended only for advanced users, the EasyCAT exchanges
EasyCAT 0:7816b38c99cc 58 // a configurable number of bytes, between 0 and 128, in input and in output
EasyCAT 0:7816b38c99cc 59 // The number of bytes in input and in output can be different
EasyCAT 0:7816b38c99cc 60 //
EasyCAT 0:7816b38c99cc 61 // The configuration EEPROM on board of the EasyCAT must be
EasyCAT 0:7816b38c99cc 62 // loaded with a suitable bin file, provided by the user
EasyCAT 0:7816b38c99cc 63 // or with the "EasyCAT_configurable.bin" file provided by AB&T
EasyCAT 0:7816b38c99cc 64
EasyCAT 0:7816b38c99cc 65 // Comment all the above BYTE_NUM #define for the STANDARD MODE
EasyCAT 0:7816b38c99cc 66 // and define here the custom number of exchanged bytes
EasyCAT 0:7816b38c99cc 67
EasyCAT 0:7816b38c99cc 68 //----- CUSTOM_MODE example -------
EasyCAT 0:7816b38c99cc 69 //
EasyCAT 0:7816b38c99cc 70 //#define CUST_BYTE_NUM_OUT 49 // total number of bytes in output
EasyCAT 0:7816b38c99cc 71 //#define CUST_BYTE_NUM_IN 17 // total number of bytes in input
EasyCAT 0:7816b38c99cc 72
EasyCAT 0:7816b38c99cc 73 // We can also customize names and data types for the PDOs
EasyCAT 0:7816b38c99cc 74 // see the example in this file (look for tag "Custom data types example")
EasyCAT 0:7816b38c99cc 75
EasyCAT 0:7816b38c99cc 76 //*************************************************************************************
EasyCAT 0:7816b38c99cc 77
EasyCAT 0:7816b38c99cc 78
EasyCAT 0:7816b38c99cc 79
EasyCAT 0:7816b38c99cc 80 //-- the preprocessor calculates the parameters necessary to transfer out data ---
EasyCAT 0:7816b38c99cc 81
EasyCAT 0:7816b38c99cc 82 // define TOT_BYTE_NUM_OUT as the total
EasyCAT 0:7816b38c99cc 83 // number of byte you need to
EasyCAT 0:7816b38c99cc 84 // transfer in output (between 0 and 128)
EasyCAT 0:7816b38c99cc 85 // this must match your ESI XML
EasyCAT 0:7816b38c99cc 86
EasyCAT 0:7816b38c99cc 87 #ifdef BYTE_NUM
EasyCAT 0:7816b38c99cc 88 #define TOT_BYTE_NUM_OUT BYTE_NUM // bytes in output
EasyCAT 0:7816b38c99cc 89 #else
EasyCAT 0:7816b38c99cc 90 #define TOT_BYTE_NUM_OUT CUST_BYTE_NUM_OUT // any number between 0 and 128
EasyCAT 0:7816b38c99cc 91 #endif
EasyCAT 0:7816b38c99cc 92
EasyCAT 0:7816b38c99cc 93
EasyCAT 0:7816b38c99cc 94 #if ((TOT_BYTE_NUM_OUT & 0x03) != 0x00) // number of bytes in output
EasyCAT 0:7816b38c99cc 95 #define TOT_BYTE_NUM_ROUND_OUT ((TOT_BYTE_NUM_OUT | 0x03) + 1)
EasyCAT 0:7816b38c99cc 96 #else // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 97 #define TOT_BYTE_NUM_ROUND_OUT TOT_BYTE_NUM_OUT //
EasyCAT 0:7816b38c99cc 98 #endif //
EasyCAT 0:7816b38c99cc 99
EasyCAT 0:7816b38c99cc 100 #if TOT_BYTE_NUM_OUT > 64 // if we have more then 64 bytes
EasyCAT 0:7816b38c99cc 101 // we have to split the transfer in two
EasyCAT 0:7816b38c99cc 102
EasyCAT 0:7816b38c99cc 103 #define SEC_BYTE_NUM_OUT (TOT_BYTE_NUM_OUT - 64) // number of bytes of the second transfer
EasyCAT 0:7816b38c99cc 104
EasyCAT 0:7816b38c99cc 105 #if ((SEC_BYTE_NUM_OUT & 0x03) != 0x00) // number of bytes of the second transfer
EasyCAT 0:7816b38c99cc 106 #define SEC_BYTE_NUM_ROUND_OUT ((SEC_BYTE_NUM_OUT | 0x03) + 1)
EasyCAT 0:7816b38c99cc 107 #else // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 108 #define SEC_BYTE_NUM_ROUND_OUT SEC_BYTE_NUM_OUT//
EasyCAT 0:7816b38c99cc 109 #endif //
EasyCAT 0:7816b38c99cc 110
EasyCAT 0:7816b38c99cc 111 #define SEC_LONG_NUM_OUT SEC_BYTE_NUM_ROUND_OUT/4// number of long of the second transfer
EasyCAT 0:7816b38c99cc 112
EasyCAT 0:7816b38c99cc 113 #define FST_BYTE_NUM_OUT 64 // number of bytes of the first transfer
EasyCAT 0:7816b38c99cc 114 #define FST_BYTE_NUM_ROUND_OUT 64 // number of bytes of the first transfer
EasyCAT 0:7816b38c99cc 115 // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 116 #define FST_LONG_NUM_OUT 16 // number of long of the second transfer
EasyCAT 0:7816b38c99cc 117
EasyCAT 0:7816b38c99cc 118
EasyCAT 0:7816b38c99cc 119 #else // if we have 64 bytes max we tranfert
EasyCAT 0:7816b38c99cc 120 // them in just one round
EasyCAT 0:7816b38c99cc 121
EasyCAT 0:7816b38c99cc 122 #define FST_BYTE_NUM_OUT TOT_BYTE_NUM_OUT // number of bytes of the first and only transfer
EasyCAT 0:7816b38c99cc 123
EasyCAT 0:7816b38c99cc 124 #if ((FST_BYTE_NUM_OUT & 0x03) != 0x00) // number of bytes of the first and only transfer
EasyCAT 0:7816b38c99cc 125 #define FST_BYTE_NUM_ROUND_OUT ((FST_BYTE_NUM_OUT | 0x03) + 1)
EasyCAT 0:7816b38c99cc 126 #else // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 127 #define FST_BYTE_NUM_ROUND_OUT FST_BYTE_NUM_OUT
EasyCAT 0:7816b38c99cc 128 #endif
EasyCAT 0:7816b38c99cc 129
EasyCAT 0:7816b38c99cc 130 #define FST_LONG_NUM_OUT FST_BYTE_NUM_ROUND_OUT/4// number of long of the first and only transfer
EasyCAT 0:7816b38c99cc 131
EasyCAT 0:7816b38c99cc 132 #define SEC_BYTE_NUM_OUT 0 // we don't use the second round
EasyCAT 0:7816b38c99cc 133 #define SEC_BYTE_NUM_ROUND_OUT 0 //
EasyCAT 0:7816b38c99cc 134 #define SEC_LONG_NUM_OUT 0 //
EasyCAT 0:7816b38c99cc 135
EasyCAT 0:7816b38c99cc 136 #endif
EasyCAT 0:7816b38c99cc 137
EasyCAT 0:7816b38c99cc 138
EasyCAT 0:7816b38c99cc 139 //-- the preprocessor calculates the parameters necessary to transfer in data ---
EasyCAT 0:7816b38c99cc 140
EasyCAT 0:7816b38c99cc 141 // define TOT_BYTE_NUM_IN the total
EasyCAT 0:7816b38c99cc 142 // number of byte you need to
EasyCAT 0:7816b38c99cc 143 // transfer in input (between 0 and 128)
EasyCAT 0:7816b38c99cc 144
EasyCAT 0:7816b38c99cc 145 #ifdef BYTE_NUM
EasyCAT 0:7816b38c99cc 146 #define TOT_BYTE_NUM_IN BYTE_NUM // bytes in input
EasyCAT 0:7816b38c99cc 147 #else
EasyCAT 0:7816b38c99cc 148 #define TOT_BYTE_NUM_IN CUST_BYTE_NUM_IN // any number between 0 and 128
EasyCAT 0:7816b38c99cc 149 #endif
EasyCAT 0:7816b38c99cc 150
EasyCAT 0:7816b38c99cc 151
EasyCAT 0:7816b38c99cc 152 #if ((TOT_BYTE_NUM_IN & 0x03) != 0x00) // number of bytes in output
EasyCAT 0:7816b38c99cc 153 #define TOT_BYTE_NUM_ROUND_IN ((TOT_BYTE_NUM_IN | 0x03) + 1)
EasyCAT 0:7816b38c99cc 154 #else // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 155 #define TOT_BYTE_NUM_ROUND_IN TOT_BYTE_NUM_IN //
EasyCAT 0:7816b38c99cc 156 #endif //
EasyCAT 0:7816b38c99cc 157
EasyCAT 0:7816b38c99cc 158 #if TOT_BYTE_NUM_IN > 64 // if we have more then 64 bytes
EasyCAT 0:7816b38c99cc 159 // we have to split the transfer in two
EasyCAT 0:7816b38c99cc 160
EasyCAT 0:7816b38c99cc 161 #define SEC_BYTE_NUM_IN (TOT_BYTE_NUM_IN - 64) // number of bytes of the second transfer
EasyCAT 0:7816b38c99cc 162
EasyCAT 0:7816b38c99cc 163 #if ((SEC_BYTE_NUM_IN & 0x03) != 0x00) // number of bytes of the second transfer
EasyCAT 0:7816b38c99cc 164 #define SEC_BYTE_NUM_ROUND_IN ((SEC_BYTE_NUM_IN | 0x03) + 1)
EasyCAT 0:7816b38c99cc 165 #else // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 166 #define SEC_BYTE_NUM_ROUND_IN SEC_BYTE_NUM_IN //
EasyCAT 0:7816b38c99cc 167 #endif //
EasyCAT 0:7816b38c99cc 168
EasyCAT 0:7816b38c99cc 169 #define SEC_LONG_NUM_IN SEC_BYTE_NUM_ROUND_IN/4 // number of long of the second transfer
EasyCAT 0:7816b38c99cc 170
EasyCAT 0:7816b38c99cc 171 #define FST_BYTE_NUM_IN 64 // number of bytes of the first transfer
EasyCAT 0:7816b38c99cc 172 #define FST_BYTE_NUM_ROUND_IN 64 // number of bytes of the first transfer
EasyCAT 0:7816b38c99cc 173 // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 174 #define FST_LONG_NUM_IN 16 // number of long of the second transfer
EasyCAT 0:7816b38c99cc 175
EasyCAT 0:7816b38c99cc 176
EasyCAT 0:7816b38c99cc 177 #else // if we have 64 bytes max we tranfert
EasyCAT 0:7816b38c99cc 178 // them in just one round
EasyCAT 0:7816b38c99cc 179
EasyCAT 0:7816b38c99cc 180 #define FST_BYTE_NUM_IN TOT_BYTE_NUM_IN // number of bytes of the first and only transfer
EasyCAT 0:7816b38c99cc 181
EasyCAT 0:7816b38c99cc 182 #if ((FST_BYTE_NUM_IN & 0x03) != 0x00) // number of bytes of the first and only transfer
EasyCAT 0:7816b38c99cc 183 #define FST_BYTE_NUM_ROUND_IN ((FST_BYTE_NUM_IN | 0x03) + 1)
EasyCAT 0:7816b38c99cc 184 #else // rounded to 4 (long)
EasyCAT 0:7816b38c99cc 185 #define FST_BYTE_NUM_ROUND_IN FST_BYTE_NUM_IN
EasyCAT 0:7816b38c99cc 186 #endif
EasyCAT 0:7816b38c99cc 187
EasyCAT 0:7816b38c99cc 188 #define FST_LONG_NUM_IN FST_BYTE_NUM_ROUND_IN/4 // number of long of the first and only transfer
EasyCAT 0:7816b38c99cc 189
EasyCAT 0:7816b38c99cc 190 #define SEC_BYTE_NUM_IN 0 // we don't use the second round
EasyCAT 0:7816b38c99cc 191 #define SEC_BYTE_NUM_ROUND_IN 0 //
EasyCAT 0:7816b38c99cc 192 #define SEC_LONG_NUM_IN 0 //
EasyCAT 0:7816b38c99cc 193
EasyCAT 0:7816b38c99cc 194 #endif
EasyCAT 0:7816b38c99cc 195
EasyCAT 0:7816b38c99cc 196
EasyCAT 0:7816b38c99cc 197 //---------------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 198
EasyCAT 0:7816b38c99cc 199 //----------------- sanity check -------------------------------------------------------
EasyCAT 0:7816b38c99cc 200
EasyCAT 0:7816b38c99cc 201
EasyCAT 0:7816b38c99cc 202 #ifdef BYTE_NUM // STANDARD MODE and CUSTOM MODE
EasyCAT 0:7816b38c99cc 203 // cannot be defined at the same time
EasyCAT 0:7816b38c99cc 204 #ifdef CUST_BYTE_NUM_OUT
EasyCAT 0:7816b38c99cc 205 #error "BYTE_NUM and CUST_BYTE_NUM_OUT cannot be defined at the same time !!!!"
EasyCAT 0:7816b38c99cc 206 #error "define them correctly in file EasyCAT.h"
EasyCAT 0:7816b38c99cc 207 #endif
EasyCAT 0:7816b38c99cc 208
EasyCAT 0:7816b38c99cc 209 #ifdef CUST_BYTE_NUM_IN
EasyCAT 0:7816b38c99cc 210 #error "BYTE_NUM and CUST_BYTE_NUM_IN cannot be defined at the same time !!!!"
EasyCAT 0:7816b38c99cc 211 #error "define them correctly in file EasyCAT.h"
EasyCAT 0:7816b38c99cc 212 #endif
EasyCAT 0:7816b38c99cc 213 #endif
EasyCAT 0:7816b38c99cc 214
EasyCAT 0:7816b38c99cc 215 #ifdef BYTE_NUM //--- for BYTE_NUM we accept only 16 32 64 128 --
EasyCAT 0:7816b38c99cc 216
EasyCAT 0:7816b38c99cc 217 #if ((BYTE_NUM !=16) && (BYTE_NUM !=32) && (BYTE_NUM !=64) && (BYTE_NUM !=128))
EasyCAT 0:7816b38c99cc 218 #error "BYTE_NUM must be 16, 32, 64 or 128 !!! define it correctly in file EasyCAT.h"
EasyCAT 0:7816b38c99cc 219 #endif
EasyCAT 0:7816b38c99cc 220
EasyCAT 0:7816b38c99cc 221 #else
EasyCAT 0:7816b38c99cc 222 //--- CUST_BYTE_NUM_OUT and CUST_BYTE_NUM_IN --------
EasyCAT 0:7816b38c99cc 223 // must be max 128
EasyCAT 0:7816b38c99cc 224 #if (CUST_BYTE_NUM_OUT > 128)
EasyCAT 0:7816b38c99cc 225 #error "CUST_BYTE_NUM_OUT must be max 128 !!! define it correctly in file EasyCAT.h"
EasyCAT 0:7816b38c99cc 226 #endif
EasyCAT 0:7816b38c99cc 227
EasyCAT 0:7816b38c99cc 228 #if (CUST_BYTE_NUM_IN > 128)
EasyCAT 0:7816b38c99cc 229 #error "CUST_BYTE_NUM_IN must be max 128 !!! define it correctly in file EasyCAT.h"
EasyCAT 0:7816b38c99cc 230 #endif
EasyCAT 0:7816b38c99cc 231
EasyCAT 0:7816b38c99cc 232 #endif
EasyCAT 0:7816b38c99cc 233
EasyCAT 0:7816b38c99cc 234
EasyCAT 0:7816b38c99cc 235 //*************************************************************************************************
EasyCAT 0:7816b38c99cc 236
EasyCAT 0:7816b38c99cc 237
EasyCAT 0:7816b38c99cc 238
EasyCAT 0:7816b38c99cc 239
EasyCAT 0:7816b38c99cc 240 //---- LAN9252 registers --------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 241
EasyCAT 0:7816b38c99cc 242 //---- access to EtherCAT registers -------------------
EasyCAT 0:7816b38c99cc 243
EasyCAT 0:7816b38c99cc 244 #define ECAT_CSR_DATA 0x0300 // EtherCAT CSR Interface Data Register
EasyCAT 0:7816b38c99cc 245 #define ECAT_CSR_CMD 0x0304 // EtherCAT CSR Interface Command Register
EasyCAT 0:7816b38c99cc 246
EasyCAT 0:7816b38c99cc 247
EasyCAT 0:7816b38c99cc 248 //---- access to EtherCAT process RAM -----------------
EasyCAT 0:7816b38c99cc 249
EasyCAT 0:7816b38c99cc 250 #define ECAT_PRAM_RD_ADDR_LEN 0x0308 // EtherCAT Process RAM Read Address and Length Register
EasyCAT 0:7816b38c99cc 251 #define ECAT_PRAM_RD_CMD 0x030C // EtherCAT Process RAM Read Command Register
EasyCAT 0:7816b38c99cc 252 #define ECAT_PRAM_WR_ADDR_LEN 0x0310 // EtherCAT Process RAM Write Address and Length Register
EasyCAT 0:7816b38c99cc 253 #define ECAT_PRAM_WR_CMD 0x0314 // EtherCAT Process RAM Write Command Register
EasyCAT 0:7816b38c99cc 254
EasyCAT 0:7816b38c99cc 255 #define ECAT_PRAM_RD_DATA 0x0000 // EtherCAT Process RAM Read Data FIFO
EasyCAT 0:7816b38c99cc 256 #define ECAT_PRAM_WR_DATA 0x0020 // EtherCAT Process RAM Write Data FIFO
EasyCAT 0:7816b38c99cc 257
EasyCAT 0:7816b38c99cc 258 //---- EtherCAT registers -----------------------------
EasyCAT 0:7816b38c99cc 259
EasyCAT 0:7816b38c99cc 260 #define AL_STATUS 0x0130 // AL status
EasyCAT 0:7816b38c99cc 261 #define WDOG_STATUS 0x0440 // watch dog status
EasyCAT 0:7816b38c99cc 262 #define AL_EVENT_MASK 0x0204 // AL event interrupt mask
EasyCAT 0:7816b38c99cc 263
EasyCAT 0:7816b38c99cc 264 //---- LAN9252 registers ------------------------------
EasyCAT 0:7816b38c99cc 265
EasyCAT 0:7816b38c99cc 266 #define HW_CFG 0x0074 // hardware configuration register
EasyCAT 0:7816b38c99cc 267 #define BYTE_TEST 0x0064 // byte order test register
EasyCAT 0:7816b38c99cc 268 #define RESET_CTL 0x01F8 // reset register
EasyCAT 0:7816b38c99cc 269 #define ID_REV 0x0050 // chip ID and revision
EasyCAT 0:7816b38c99cc 270 #define IRQ_CFG 0x0054 // interrupt configuration
EasyCAT 0:7816b38c99cc 271 #define INT_EN 0x005C // interrupt enable
EasyCAT 0:7816b38c99cc 272
EasyCAT 0:7816b38c99cc 273
EasyCAT 0:7816b38c99cc 274 //---- LAN9252 flags ------------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 275
EasyCAT 0:7816b38c99cc 276 #define ECAT_CSR_BUSY 0x80
EasyCAT 0:7816b38c99cc 277
EasyCAT 0:7816b38c99cc 278 #define PRAM_ABORT 0x40000000
EasyCAT 0:7816b38c99cc 279
EasyCAT 0:7816b38c99cc 280 #define PRAM_BUSY 0x80
EasyCAT 0:7816b38c99cc 281
EasyCAT 0:7816b38c99cc 282 #define PRAM_AVAIL 0x01
EasyCAT 0:7816b38c99cc 283
EasyCAT 0:7816b38c99cc 284 #define READY 0x08
EasyCAT 0:7816b38c99cc 285
EasyCAT 0:7816b38c99cc 286 #define DIGITAL_RST 0x00000001
EasyCAT 0:7816b38c99cc 287
EasyCAT 0:7816b38c99cc 288
EasyCAT 0:7816b38c99cc 289 //---- EtherCAT flags -----------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 290
EasyCAT 0:7816b38c99cc 291 // EtherCAT state machine
EasyCAT 0:7816b38c99cc 292
EasyCAT 0:7816b38c99cc 293 #define ESM_INIT 0x01 // init
EasyCAT 0:7816b38c99cc 294 #define ESM_PREOP 0x02 // pre-operational
EasyCAT 0:7816b38c99cc 295 #define ESM_BOOT 0x03 // bootstrap
EasyCAT 0:7816b38c99cc 296 #define ESM_SAFEOP 0x04 // safe-operational
EasyCAT 0:7816b38c99cc 297 #define ESM_OP 0x08 // operational
EasyCAT 0:7816b38c99cc 298
EasyCAT 0:7816b38c99cc 299
EasyCAT 0:7816b38c99cc 300 //--- ESC commands --------------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 301
EasyCAT 0:7816b38c99cc 302 #define ESC_WRITE 0x80
EasyCAT 0:7816b38c99cc 303 #define ESC_READ 0xC0
EasyCAT 0:7816b38c99cc 304
EasyCAT 0:7816b38c99cc 305
EasyCAT 0:7816b38c99cc 306 //---- SPI ----------------------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 307
EasyCAT 0:7816b38c99cc 308 #define COMM_SPI_READ 0x03
EasyCAT 0:7816b38c99cc 309 #define COMM_SPI_WRITE 0x02
EasyCAT 0:7816b38c99cc 310
EasyCAT 0:7816b38c99cc 311 #define DUMMY_BYTE 0xFF
EasyCAT 0:7816b38c99cc 312
EasyCAT 0:7816b38c99cc 313
EasyCAT 0:7816b38c99cc 314
EasyCAT 0:7816b38c99cc 315 //---- typedef ------------------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 316
EasyCAT 0:7816b38c99cc 317 typedef union
EasyCAT 0:7816b38c99cc 318 {
EasyCAT 0:7816b38c99cc 319 unsigned short Word;
EasyCAT 0:7816b38c99cc 320 unsigned char Byte[2];
EasyCAT 0:7816b38c99cc 321 } UWORD;
EasyCAT 0:7816b38c99cc 322
EasyCAT 0:7816b38c99cc 323 typedef union
EasyCAT 0:7816b38c99cc 324 {
EasyCAT 0:7816b38c99cc 325 unsigned long Long;
EasyCAT 0:7816b38c99cc 326 unsigned short Word[2];
EasyCAT 0:7816b38c99cc 327 unsigned char Byte[4];
EasyCAT 0:7816b38c99cc 328 } ULONG;
EasyCAT 0:7816b38c99cc 329
EasyCAT 0:7816b38c99cc 330
EasyCAT 0:7816b38c99cc 331 typedef union //-- output buffer -----------------
EasyCAT 0:7816b38c99cc 332 { //
EasyCAT 0:7816b38c99cc 333 uint8_t Byte [TOT_BYTE_NUM_ROUND_OUT]; //
EasyCAT 0:7816b38c99cc 334
EasyCAT 0:7816b38c99cc 335 #if CUST_BYTE_NUM_OUT > 0 //----- Custom data types example -----
EasyCAT 0:7816b38c99cc 336 /* //
EasyCAT 0:7816b38c99cc 337 struct // Here we can define our custom
EasyCAT 0:7816b38c99cc 338 { // data types and names for the outputs
EasyCAT 0:7816b38c99cc 339 //
EasyCAT 0:7816b38c99cc 340 uint8_t Control; // The total number of bytes declared
EasyCAT 0:7816b38c99cc 341 float PreZone1; // in this structure must be equal
EasyCAT 0:7816b38c99cc 342 float CommZone1; // to the value assigned to CUST_BYTE_NUM_OUT
EasyCAT 0:7816b38c99cc 343 float RampZone1; //
EasyCAT 0:7816b38c99cc 344 float PreZone2; // In this case 1+ 4+4+4+ 4+4+4+ 4+4+4+ 4+4+4 = 49
EasyCAT 0:7816b38c99cc 345 float CommZone2; //
EasyCAT 0:7816b38c99cc 346 float RampZone2; //
EasyCAT 0:7816b38c99cc 347 float PreZone3; //
EasyCAT 0:7816b38c99cc 348 float CommZone3; //
EasyCAT 0:7816b38c99cc 349 float RampZone3; //
EasyCAT 0:7816b38c99cc 350 float PreZone4; //
EasyCAT 0:7816b38c99cc 351 float CommZone4; //
EasyCAT 0:7816b38c99cc 352 float RampZone4; //
EasyCAT 0:7816b38c99cc 353 }Cust; //
EasyCAT 0:7816b38c99cc 354 */ //
EasyCAT 0:7816b38c99cc 355 #endif //
EasyCAT 0:7816b38c99cc 356
EasyCAT 0:7816b38c99cc 357 } PROCBUFFER_OUT; //
EasyCAT 0:7816b38c99cc 358
EasyCAT 0:7816b38c99cc 359
EasyCAT 0:7816b38c99cc 360 typedef union //-- input buffer ------------------
EasyCAT 0:7816b38c99cc 361 { //
EasyCAT 0:7816b38c99cc 362 uint8_t Byte [TOT_BYTE_NUM_ROUND_IN]; //
EasyCAT 0:7816b38c99cc 363
EasyCAT 0:7816b38c99cc 364 #if CUST_BYTE_NUM_IN > 0 //----- Custom data types example ------
EasyCAT 0:7816b38c99cc 365 /* //
EasyCAT 0:7816b38c99cc 366 struct // Here we can define our custom
EasyCAT 0:7816b38c99cc 367 { // data types and names for the inputs
EasyCAT 0:7816b38c99cc 368 //
EasyCAT 0:7816b38c99cc 369 uint8_t Status; // The total number of bytes declared
EasyCAT 0:7816b38c99cc 370 float TempZone1; // in this structure must be equal
EasyCAT 0:7816b38c99cc 371 float TempZone2; // to the value assigned to CUST_BYTE_NUM_IN
EasyCAT 0:7816b38c99cc 372 float TempZone3; //
EasyCAT 0:7816b38c99cc 373 float TempZone4; // In this case 1+ 4+4+4+4 = 17
EasyCAT 0:7816b38c99cc 374 }Cust; //
EasyCAT 0:7816b38c99cc 375 */ //
EasyCAT 0:7816b38c99cc 376 #endif //
EasyCAT 0:7816b38c99cc 377
EasyCAT 0:7816b38c99cc 378 } PROCBUFFER_IN; //
EasyCAT 0:7816b38c99cc 379
EasyCAT 0:7816b38c99cc 380
EasyCAT 0:7816b38c99cc 381 typedef enum
EasyCAT 0:7816b38c99cc 382 {
EasyCAT 0:7816b38c99cc 383 ASYNC,
EasyCAT 0:7816b38c99cc 384 DC_SYNC,
EasyCAT 0:7816b38c99cc 385 SM_SYNC
EasyCAT 0:7816b38c99cc 386 }SyncMode;
EasyCAT 0:7816b38c99cc 387
EasyCAT 0:7816b38c99cc 388
EasyCAT 0:7816b38c99cc 389
EasyCAT 0:7816b38c99cc 390 //-------------------------------------------------------------------------------------------------
EasyCAT 0:7816b38c99cc 391
EasyCAT 0:7816b38c99cc 392 class EasyCAT
EasyCAT 0:7816b38c99cc 393 {
EasyCAT 0:7816b38c99cc 394 public:
EasyCAT 0:7816b38c99cc 395 EasyCAT(); // default constructor
EasyCAT 0:7816b38c99cc 396 EasyCAT(PinName SCS);
EasyCAT 0:7816b38c99cc 397 EasyCAT(SyncMode Sync);
EasyCAT 0:7816b38c99cc 398 EasyCAT(PinName SCS, SyncMode Sync);
EasyCAT 0:7816b38c99cc 399
EasyCAT 0:7816b38c99cc 400
EasyCAT 0:7816b38c99cc 401 unsigned char MainTask(); // EtherCAT main task
EasyCAT 0:7816b38c99cc 402 // must be called cyclically by the application
EasyCAT 0:7816b38c99cc 403
EasyCAT 0:7816b38c99cc 404 bool Init(); // EasyCAT board initialization
EasyCAT 0:7816b38c99cc 405
EasyCAT 0:7816b38c99cc 406 PROCBUFFER_OUT BufferOut; // output process data buffer
EasyCAT 0:7816b38c99cc 407 PROCBUFFER_IN BufferIn; // input process data buffer
EasyCAT 0:7816b38c99cc 408
EasyCAT 0:7816b38c99cc 409
EasyCAT 0:7816b38c99cc 410 private:
EasyCAT 0:7816b38c99cc 411 void SPIWriteRegisterDirect (unsigned short Address, unsigned long DataOut);
EasyCAT 0:7816b38c99cc 412 unsigned long SPIReadRegisterDirect (unsigned short Address, unsigned char Len);
EasyCAT 0:7816b38c99cc 413
EasyCAT 0:7816b38c99cc 414 void SPIWriteRegisterIndirect (unsigned long DataOut, unsigned short Address, unsigned char Len);
EasyCAT 0:7816b38c99cc 415 unsigned long SPIReadRegisterIndirect (unsigned short Address, unsigned char Len);
EasyCAT 0:7816b38c99cc 416
EasyCAT 0:7816b38c99cc 417 void SPIReadProcRamFifo();
EasyCAT 0:7816b38c99cc 418 void SPIWriteProcRamFifo();
EasyCAT 0:7816b38c99cc 419
EasyCAT 0:7816b38c99cc 420 PinName SCS_;
EasyCAT 0:7816b38c99cc 421 SyncMode Sync_;
EasyCAT 0:7816b38c99cc 422 };
EasyCAT 0:7816b38c99cc 423
EasyCAT 0:7816b38c99cc 424 #endif