EasyCAT shield loopback test - EtherCAT slave example
Dependencies: mbed EasyCAT_lib
The EasyCAT Shield and boards
- 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.
- This is the EasyCAT product page on the EtherCAT® Technology Group website.
- The TestEasyCAT_LoopBack is a test program that transmits back to the EtherCAT master the data that the EtherCAT slave receives.
Import programTestEasyCAT_LoopBack
EasyCAT shield loopback test - EtherCAT slave example
Import libraryEasyCAT_lib
EasyCAT shield library - It allows you to make an EtherCAT slave
main.cpp@0:739b2b5ca0f6, 2017-09-12 (annotated)
- Committer:
- EasyCAT
- Date:
- Tue Sep 12 17:32:00 2017 +0000
- Revision:
- 0:739b2b5ca0f6
- Child:
- 1:c342bace09db
first release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EasyCAT | 0:739b2b5ca0f6 | 1 | //******************************************************************************************** |
EasyCAT | 0:739b2b5ca0f6 | 2 | // * |
EasyCAT | 0:739b2b5ca0f6 | 3 | // AB&T Tecnologie Informatiche - Ivrea Italy * |
EasyCAT | 0:739b2b5ca0f6 | 4 | // http://www.bausano.net * |
EasyCAT | 0:739b2b5ca0f6 | 5 | // https://www.ethercat.org/en/products/791FFAA126AD43859920EA64384AD4FD.htm * |
EasyCAT | 0:739b2b5ca0f6 | 6 | // * |
EasyCAT | 0:739b2b5ca0f6 | 7 | //******************************************************************************************** |
EasyCAT | 0:739b2b5ca0f6 | 8 | // * |
EasyCAT | 0:739b2b5ca0f6 | 9 | // This software is distributed as an example, in the hope that it could be useful, * |
EasyCAT | 0:739b2b5ca0f6 | 10 | // WITHOUT ANY WARRANTY, even the implied warranty of FITNESS FOR A PARTICULAR PURPOSE * |
EasyCAT | 0:739b2b5ca0f6 | 11 | // * |
EasyCAT | 0:739b2b5ca0f6 | 12 | //******************************************************************************************** |
EasyCAT | 0:739b2b5ca0f6 | 13 | |
EasyCAT | 0:739b2b5ca0f6 | 14 | |
EasyCAT | 0:739b2b5ca0f6 | 15 | //---- AB&T EasyCAT shield loopback test 170912 --------------------------------------------- |
EasyCAT | 0:739b2b5ca0f6 | 16 | // |
EasyCAT | 0:739b2b5ca0f6 | 17 | // Derived from the example Arduino project TestEasyCAT_LoopBack.ino |
EasyCAT | 0:739b2b5ca0f6 | 18 | // for the AB&T EasyCAT Arduino shield |
EasyCAT | 0:739b2b5ca0f6 | 19 | // |
EasyCAT | 0:739b2b5ca0f6 | 20 | // In this example the output bytes received by the EasyCAT are transmitted back to |
EasyCAT | 0:739b2b5ca0f6 | 21 | // the master, for test pourpose |
EasyCAT | 0:739b2b5ca0f6 | 22 | // |
EasyCAT | 0:739b2b5ca0f6 | 23 | // The EasyCAT must be set in STANDARD MODE (default setting) |
EasyCAT | 0:739b2b5ca0f6 | 24 | |
EasyCAT | 0:739b2b5ca0f6 | 25 | //----- Tested with the STM32 NUCLEO-F767ZI board -------------------------------------------- |
EasyCAT | 0:739b2b5ca0f6 | 26 | |
EasyCAT | 0:739b2b5ca0f6 | 27 | |
EasyCAT | 0:739b2b5ca0f6 | 28 | #include "mbed.h" |
EasyCAT | 0:739b2b5ca0f6 | 29 | #include "EasyCAT.h" // EasyCAT library to interface the LAN9252 |
EasyCAT | 0:739b2b5ca0f6 | 30 | |
EasyCAT | 0:739b2b5ca0f6 | 31 | |
EasyCAT | 0:739b2b5ca0f6 | 32 | void Application (void); |
EasyCAT | 0:739b2b5ca0f6 | 33 | |
EasyCAT | 0:739b2b5ca0f6 | 34 | |
EasyCAT | 0:739b2b5ca0f6 | 35 | |
EasyCAT | 0:739b2b5ca0f6 | 36 | EasyCAT EASYCAT; // EasyCAT instantiation |
EasyCAT | 0:739b2b5ca0f6 | 37 | |
EasyCAT | 0:739b2b5ca0f6 | 38 | |
EasyCAT | 0:739b2b5ca0f6 | 39 | //--- sanity check to see if the EasyCAT is set in STANDARD MODE -------------------------------------- |
EasyCAT | 0:739b2b5ca0f6 | 40 | |
EasyCAT | 0:739b2b5ca0f6 | 41 | #ifdef CUST_BYTE_NUM_OUT |
EasyCAT | 0:739b2b5ca0f6 | 42 | #error "The EasyCAT must be set in STANDARD MODE !!!" |
EasyCAT | 0:739b2b5ca0f6 | 43 | #endif |
EasyCAT | 0:739b2b5ca0f6 | 44 | |
EasyCAT | 0:739b2b5ca0f6 | 45 | #ifdef CUST_BYTE_NUM_IN |
EasyCAT | 0:739b2b5ca0f6 | 46 | #error "The EasyCAT must be set in STANDARD MODE !!!" |
EasyCAT | 0:739b2b5ca0f6 | 47 | #endif |
EasyCAT | 0:739b2b5ca0f6 | 48 | |
EasyCAT | 0:739b2b5ca0f6 | 49 | |
EasyCAT | 0:739b2b5ca0f6 | 50 | //---- pins declaration ------------------------------------------------------------------------------ |
EasyCAT | 0:739b2b5ca0f6 | 51 | |
EasyCAT | 0:739b2b5ca0f6 | 52 | DigitalOut Led(LED1); |
EasyCAT | 0:739b2b5ca0f6 | 53 | |
EasyCAT | 0:739b2b5ca0f6 | 54 | |
EasyCAT | 0:739b2b5ca0f6 | 55 | //--------------------------------------------------------------------------------------------- |
EasyCAT | 0:739b2b5ca0f6 | 56 | |
EasyCAT | 0:739b2b5ca0f6 | 57 | int main(void) |
EasyCAT | 0:739b2b5ca0f6 | 58 | { |
EasyCAT | 0:739b2b5ca0f6 | 59 | |
EasyCAT | 0:739b2b5ca0f6 | 60 | printf ("\nEasyCAT - Generic EtherCAT slave\n"); // print the banner |
EasyCAT | 0:739b2b5ca0f6 | 61 | |
EasyCAT | 0:739b2b5ca0f6 | 62 | //---- initialize the EasyCAT board ----- |
EasyCAT | 0:739b2b5ca0f6 | 63 | |
EasyCAT | 0:739b2b5ca0f6 | 64 | if (EASYCAT.Init() == true) // initialization |
EasyCAT | 0:739b2b5ca0f6 | 65 | { // succesfully completed |
EasyCAT | 0:739b2b5ca0f6 | 66 | printf ("initialized\n"); // |
EasyCAT | 0:739b2b5ca0f6 | 67 | } |
EasyCAT | 0:739b2b5ca0f6 | 68 | |
EasyCAT | 0:739b2b5ca0f6 | 69 | else // initialization failed |
EasyCAT | 0:739b2b5ca0f6 | 70 | { // the EasyCAT board was not recognized |
EasyCAT | 0:739b2b5ca0f6 | 71 | printf ("initialization failed\n"); // |
EasyCAT | 0:739b2b5ca0f6 | 72 | // The most common reason is that the SPI |
EasyCAT | 0:739b2b5ca0f6 | 73 | // chip select choosen on the board doesn't |
EasyCAT | 0:739b2b5ca0f6 | 74 | // match the one choosen by the firmware |
EasyCAT | 0:739b2b5ca0f6 | 75 | |
EasyCAT | 0:739b2b5ca0f6 | 76 | while (1) // stay in loop for ever |
EasyCAT | 0:739b2b5ca0f6 | 77 | { // with the led blinking |
EasyCAT | 0:739b2b5ca0f6 | 78 | Led = 1; // |
EasyCAT | 0:739b2b5ca0f6 | 79 | wait_ms(125); // |
EasyCAT | 0:739b2b5ca0f6 | 80 | Led = 0; // |
EasyCAT | 0:739b2b5ca0f6 | 81 | wait_ms(125); // |
EasyCAT | 0:739b2b5ca0f6 | 82 | } // |
EasyCAT | 0:739b2b5ca0f6 | 83 | } |
EasyCAT | 0:739b2b5ca0f6 | 84 | |
EasyCAT | 0:739b2b5ca0f6 | 85 | |
EasyCAT | 0:739b2b5ca0f6 | 86 | while (1) //---- main loop --------------------------- |
EasyCAT | 0:739b2b5ca0f6 | 87 | { |
EasyCAT | 0:739b2b5ca0f6 | 88 | // In the main loop we must call ciclically the |
EasyCAT | 0:739b2b5ca0f6 | 89 | // EasyCAT task and our application |
EasyCAT | 0:739b2b5ca0f6 | 90 | // |
EasyCAT | 0:739b2b5ca0f6 | 91 | // This allows the bidirectional exachange of the data |
EasyCAT | 0:739b2b5ca0f6 | 92 | // between the EtherCAT master and our application |
EasyCAT | 0:739b2b5ca0f6 | 93 | // |
EasyCAT | 0:739b2b5ca0f6 | 94 | // The EasyCAT cycle and the Master cycle are asynchronous |
EasyCAT | 0:739b2b5ca0f6 | 95 | |
EasyCAT | 0:739b2b5ca0f6 | 96 | wait_ms(10); // This delay allows us to set the EasyCAT cycle time |
EasyCAT | 0:739b2b5ca0f6 | 97 | // according to the needs of our application |
EasyCAT | 0:739b2b5ca0f6 | 98 | |
EasyCAT | 0:739b2b5ca0f6 | 99 | EASYCAT.MainTask(); // execute the EasyCAT task |
EasyCAT | 0:739b2b5ca0f6 | 100 | |
EasyCAT | 0:739b2b5ca0f6 | 101 | Application(); // execute the user application |
EasyCAT | 0:739b2b5ca0f6 | 102 | } |
EasyCAT | 0:739b2b5ca0f6 | 103 | } |
EasyCAT | 0:739b2b5ca0f6 | 104 | |
EasyCAT | 0:739b2b5ca0f6 | 105 | |
EasyCAT | 0:739b2b5ca0f6 | 106 | //---- user application ------------------------------------------------------------------------------ |
EasyCAT | 0:739b2b5ca0f6 | 107 | |
EasyCAT | 0:739b2b5ca0f6 | 108 | void Application () // the received bytes for the outputs |
EasyCAT | 0:739b2b5ca0f6 | 109 | // are transmitted back, simulating the inputs |
EasyCAT | 0:739b2b5ca0f6 | 110 | { |
EasyCAT | 0:739b2b5ca0f6 | 111 | uint8_t Index; |
EasyCAT | 0:739b2b5ca0f6 | 112 | |
EasyCAT | 0:739b2b5ca0f6 | 113 | for (Index=0; Index < BYTE_NUM; Index++) // BYTE_NUM is a constant declared in the library file "EasyCAT.h" |
EasyCAT | 0:739b2b5ca0f6 | 114 | // it defines the number of bytes for the input and for the output |
EasyCAT | 0:739b2b5ca0f6 | 115 | // when the EasyCAT is configured in STANDARD MODE (default setting) |
EasyCAT | 0:739b2b5ca0f6 | 116 | |
EasyCAT | 0:739b2b5ca0f6 | 117 | { // the data are crossed and complemented |
EasyCAT | 0:739b2b5ca0f6 | 118 | EASYCAT.BufferIn.Byte[BYTE_NUM - 1 - Index] = EASYCAT.BufferOut.Byte[Index] ^ 0xFF; |
EasyCAT | 0:739b2b5ca0f6 | 119 | |
EasyCAT | 0:739b2b5ca0f6 | 120 | // the data are trasmitted back as they are |
EasyCAT | 0:739b2b5ca0f6 | 121 | //EASYCAT.BufferIn.Byte[Index] = EASYCAT.BufferOut.Byte[Index]; |
EasyCAT | 0:739b2b5ca0f6 | 122 | } |
EasyCAT | 0:739b2b5ca0f6 | 123 | } |
EasyCAT | 0:739b2b5ca0f6 | 124 | |
EasyCAT | 0:739b2b5ca0f6 | 125 | |
EasyCAT | 0:739b2b5ca0f6 | 126 | |
EasyCAT | 0:739b2b5ca0f6 | 127 | |
EasyCAT | 0:739b2b5ca0f6 | 128 | |
EasyCAT | 0:739b2b5ca0f6 | 129 | |
EasyCAT | 0:739b2b5ca0f6 | 130 | |
EasyCAT | 0:739b2b5ca0f6 | 131 | |
EasyCAT | 0:739b2b5ca0f6 | 132 | |
EasyCAT | 0:739b2b5ca0f6 | 133 |