UIPEthernet library for Arduino IDE, Eclipse with arduino plugin and MBED/SMeshStudio (AVR,STM32F,ESP8266,Intel ARC32,Nordic nRF51,Teensy boards,Realtek Ameba(RTL8195A,RTL8710)), ENC28j60 network chip. Compatible with Wiznet W5100 Ethernet library API. Compiled and tested on Nucleo-F302R8. Master repository is: https://github.com/UIPEthernet/UIPEthernet/
utility/Enc28J60Network.h@3:6b1c9bd7773a, 2016-12-27 (annotated)
- Committer:
- cassyarduino
- Date:
- Tue Dec 27 12:49:39 2016 +0100
- Revision:
- 3:6b1c9bd7773a
- Parent:
- 0:e3fb1267e3c3
- Child:
- 19:e416943f7119
Changes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
cassyarduino | 0:e3fb1267e3c3 | 1 | /* |
cassyarduino | 0:e3fb1267e3c3 | 2 | Enc28J60NetworkClass.h |
cassyarduino | 0:e3fb1267e3c3 | 3 | UIPEthernet network driver for Microchip ENC28J60 Ethernet Interface. |
cassyarduino | 0:e3fb1267e3c3 | 4 | |
cassyarduino | 0:e3fb1267e3c3 | 5 | Copyright (c) 2013 Norbert Truchsess <norbert.truchsess@t-online.de> |
cassyarduino | 0:e3fb1267e3c3 | 6 | All rights reserved. |
cassyarduino | 0:e3fb1267e3c3 | 7 | |
cassyarduino | 0:e3fb1267e3c3 | 8 | inspired by enc28j60.c file from the AVRlib library by Pascal Stang. |
cassyarduino | 0:e3fb1267e3c3 | 9 | For AVRlib See http://www.procyonengineering.com/ |
cassyarduino | 0:e3fb1267e3c3 | 10 | |
cassyarduino | 0:e3fb1267e3c3 | 11 | This program is free software: you can redistribute it and/or modify |
cassyarduino | 0:e3fb1267e3c3 | 12 | it under the terms of the GNU General Public License as published by |
cassyarduino | 0:e3fb1267e3c3 | 13 | the Free Software Foundation, either version 3 of the License, or |
cassyarduino | 0:e3fb1267e3c3 | 14 | (at your option) any later version. |
cassyarduino | 0:e3fb1267e3c3 | 15 | |
cassyarduino | 0:e3fb1267e3c3 | 16 | This program is distributed in the hope that it will be useful, |
cassyarduino | 0:e3fb1267e3c3 | 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
cassyarduino | 0:e3fb1267e3c3 | 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
cassyarduino | 0:e3fb1267e3c3 | 19 | GNU General Public License for more details. |
cassyarduino | 0:e3fb1267e3c3 | 20 | |
cassyarduino | 0:e3fb1267e3c3 | 21 | You should have received a copy of the GNU General Public License |
cassyarduino | 0:e3fb1267e3c3 | 22 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
cassyarduino | 0:e3fb1267e3c3 | 23 | */ |
cassyarduino | 0:e3fb1267e3c3 | 24 | |
cassyarduino | 0:e3fb1267e3c3 | 25 | #ifndef Enc28J60Network_H_ |
cassyarduino | 0:e3fb1267e3c3 | 26 | #define Enc28J60Network_H_ |
cassyarduino | 0:e3fb1267e3c3 | 27 | |
cassyarduino | 0:e3fb1267e3c3 | 28 | #include "mempool.h" |
cassyarduino | 0:e3fb1267e3c3 | 29 | #if defined(__MBED__) |
cassyarduino | 0:e3fb1267e3c3 | 30 | #include <mbed.h> |
cassyarduino | 0:e3fb1267e3c3 | 31 | //UIPEthernet(SPI_MOSI, SPI_MISO, SPI_SCK, SPI_CS); |
cassyarduino | 0:e3fb1267e3c3 | 32 | #if defined(TARGET_LPC1768) |
cassyarduino | 0:e3fb1267e3c3 | 33 | #define SPI_MOSI p11 |
cassyarduino | 0:e3fb1267e3c3 | 34 | #define SPI_MISO p12 |
cassyarduino | 0:e3fb1267e3c3 | 35 | #define SPI_SCK p13 |
cassyarduino | 0:e3fb1267e3c3 | 36 | #define SPI_CS p8 |
cassyarduino | 0:e3fb1267e3c3 | 37 | #elif defined(TARGET_LPC1114) |
cassyarduino | 0:e3fb1267e3c3 | 38 | #define SPI_MOSI dp2 |
cassyarduino | 0:e3fb1267e3c3 | 39 | #define SPI_MISO dp1 |
cassyarduino | 0:e3fb1267e3c3 | 40 | #define SPI_SCK dp6 |
cassyarduino | 0:e3fb1267e3c3 | 41 | #define SPI_CS dp25 |
cassyarduino | 0:e3fb1267e3c3 | 42 | #elif defined(TARGET_LPC11U68) |
cassyarduino | 0:e3fb1267e3c3 | 43 | #define SPI_MOSI P0_9 |
cassyarduino | 0:e3fb1267e3c3 | 44 | #define SPI_MISO P0_8 |
cassyarduino | 0:e3fb1267e3c3 | 45 | #define SPI_SCK P1_29 |
cassyarduino | 0:e3fb1267e3c3 | 46 | #define SPI_CS P0_2 |
cassyarduino | 0:e3fb1267e3c3 | 47 | #elif defined(TARGET_NUCLEO_F103RB) || defined(TARGET_NUCLEO_L152RE) || defined(TARGET_NUCLEO_F030R8) \ |
cassyarduino | 0:e3fb1267e3c3 | 48 | || defined(TARGET_NUCLEO_F401RE) || defined(TARGET_NUCLEO_F302R8) || defined(TARGET_NUCLEO_L053R8) \ |
cassyarduino | 0:e3fb1267e3c3 | 49 | || defined(TARGET_NUCLEO_F411RE) || defined(TARGET_NUCLEO_F334R8) || defined(TARGET_NUCLEO_F072RB) \ |
cassyarduino | 0:e3fb1267e3c3 | 50 | || defined(TARGET_NUCLEO_F091RC) || defined(TARGET_NUCLEO_F303RE) || defined(TARGET_NUCLEO_F070RB) |
cassyarduino | 0:e3fb1267e3c3 | 51 | #define SPI_MOSI D4 |
cassyarduino | 0:e3fb1267e3c3 | 52 | #define SPI_MISO D5 |
cassyarduino | 0:e3fb1267e3c3 | 53 | #define SPI_SCK D3 |
cassyarduino | 0:e3fb1267e3c3 | 54 | #define SPI_CS D2 |
cassyarduino | 0:e3fb1267e3c3 | 55 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 56 | #define ENC28J60_CONTROL_CS SPI_CS |
cassyarduino | 0:e3fb1267e3c3 | 57 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 58 | |
cassyarduino | 0:e3fb1267e3c3 | 59 | #if !defined(ENC28J60_CONTROL_CS) |
cassyarduino | 0:e3fb1267e3c3 | 60 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 61 | // Arduino Uno (__AVR__) SS defined to pin 10 |
cassyarduino | 0:e3fb1267e3c3 | 62 | // Arduino Mega(__AVR_ATmega2560__) SS defined to pin 53 |
cassyarduino | 0:e3fb1267e3c3 | 63 | // ESP8266 (ESP8266) SS defined to pin 15 |
cassyarduino | 0:e3fb1267e3c3 | 64 | #define ENC28J60_CONTROL_CS SS |
cassyarduino | 0:e3fb1267e3c3 | 65 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 66 | // Arduino Due (ARDUINO_ARCH_SAM) BOARD_SPI_DEFAULT_SS (SS3) defined to pin 78 |
cassyarduino | 0:e3fb1267e3c3 | 67 | #define ENC28J60_CONTROL_CS BOARD_SPI_DEFAULT_SS |
cassyarduino | 0:e3fb1267e3c3 | 68 | #elif defined(STM32_MCU_SERIES) || defined(__STM32F1__) || defined(__STM32F3__) || defined(__STM32F4__) |
cassyarduino | 0:e3fb1267e3c3 | 69 | #ifdef ARDUINO_STM32F4_NETDUINO2PLUS |
cassyarduino | 0:e3fb1267e3c3 | 70 | #define ENC28J60_CONTROL_CS PC8 |
cassyarduino | 0:e3fb1267e3c3 | 71 | #else |
cassyarduino | 0:e3fb1267e3c3 | 72 | #define ENC28J60_CONTROL_CS SPI.nssPin() |
cassyarduino | 0:e3fb1267e3c3 | 73 | //#define ENC28J60_CONTROL_CS PA4 |
cassyarduino | 0:e3fb1267e3c3 | 74 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 75 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 76 | #if defined(ENC28J60_CONTROL_CS) |
cassyarduino | 3:6b1c9bd7773a | 77 | #warning "Not defined ENC28J60_CONTROL_CS. Use borad default SS pin setting. You can configure in 'utility/Enc28J60Network.h'." |
cassyarduino | 0:e3fb1267e3c3 | 78 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 79 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 80 | #if !defined(ENC28J60_CONTROL_CS) |
cassyarduino | 0:e3fb1267e3c3 | 81 | #error "Not defined ENC28J60_CONTROL_CS!" |
cassyarduino | 0:e3fb1267e3c3 | 82 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 83 | |
cassyarduino | 0:e3fb1267e3c3 | 84 | #if !defined(SPI_MOSI) |
cassyarduino | 0:e3fb1267e3c3 | 85 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 86 | #define SPI_MOSI MOSI |
cassyarduino | 0:e3fb1267e3c3 | 87 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 88 | #define SPI_MOSI PIN_SPI_MOSI |
cassyarduino | 0:e3fb1267e3c3 | 89 | #elif defined(__STM32F1__) || defined(__STM32F3__) || defined(__STM32F4__) |
cassyarduino | 0:e3fb1267e3c3 | 90 | #define SPI_MOSI SPI.mosiPin() |
cassyarduino | 0:e3fb1267e3c3 | 91 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 92 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 93 | #if !defined(SPI_MOSI) |
cassyarduino | 0:e3fb1267e3c3 | 94 | #error "Not defined SPI_MOSI!" |
cassyarduino | 0:e3fb1267e3c3 | 95 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 96 | |
cassyarduino | 0:e3fb1267e3c3 | 97 | #if !defined(SPI_MISO) |
cassyarduino | 0:e3fb1267e3c3 | 98 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 99 | #define SPI_MISO MISO |
cassyarduino | 0:e3fb1267e3c3 | 100 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 101 | #define SPI_MISO PIN_SPI_MISO |
cassyarduino | 0:e3fb1267e3c3 | 102 | #elif defined(__STM32F1__) || defined(__STM32F3__) || defined(__STM32F4__) |
cassyarduino | 0:e3fb1267e3c3 | 103 | #define SPI_MISO SPI.misoPin() |
cassyarduino | 0:e3fb1267e3c3 | 104 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 105 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 106 | #if !defined(SPI_MISO) |
cassyarduino | 0:e3fb1267e3c3 | 107 | #error "Not defined SPI_MISO!" |
cassyarduino | 0:e3fb1267e3c3 | 108 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 109 | #if !defined(SPI_SCK) |
cassyarduino | 0:e3fb1267e3c3 | 110 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 111 | #define SPI_SCK SCK |
cassyarduino | 0:e3fb1267e3c3 | 112 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 113 | #define SPI_SCK PIN_SPI_SCK |
cassyarduino | 0:e3fb1267e3c3 | 114 | #elif defined(__STM32F1__) || defined(__STM32F3__) || defined(__STM32F4__) |
cassyarduino | 0:e3fb1267e3c3 | 115 | #define SPI_SCK SPI.sckPin() |
cassyarduino | 0:e3fb1267e3c3 | 116 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 117 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 118 | #if !defined(SPI_SCK) |
cassyarduino | 0:e3fb1267e3c3 | 119 | #error "Not defined SPI_SCK!" |
cassyarduino | 0:e3fb1267e3c3 | 120 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 121 | |
cassyarduino | 0:e3fb1267e3c3 | 122 | #if defined(__MBED__) || defined(ARDUINO_ARCH_SAM) || defined(__STM32F1__) || defined(__STM32F3__) || defined(__STM32F4__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 123 | #include <SPI.h> |
cassyarduino | 0:e3fb1267e3c3 | 124 | #define ENC28J60_USE_SPILIB 1 |
cassyarduino | 0:e3fb1267e3c3 | 125 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 126 | |
cassyarduino | 0:e3fb1267e3c3 | 127 | #define UIP_RECEIVEBUFFERHANDLE 0xff |
cassyarduino | 0:e3fb1267e3c3 | 128 | |
cassyarduino | 0:e3fb1267e3c3 | 129 | /* |
cassyarduino | 0:e3fb1267e3c3 | 130 | * Empfangen von ip-header, arp etc... |
cassyarduino | 0:e3fb1267e3c3 | 131 | * wenn tcp/udp -> tcp/udp-callback -> assign new packet to connection |
cassyarduino | 0:e3fb1267e3c3 | 132 | */ |
cassyarduino | 0:e3fb1267e3c3 | 133 | |
cassyarduino | 0:e3fb1267e3c3 | 134 | class Enc28J60Network : public MemoryPool |
cassyarduino | 0:e3fb1267e3c3 | 135 | { |
cassyarduino | 0:e3fb1267e3c3 | 136 | |
cassyarduino | 0:e3fb1267e3c3 | 137 | private: |
cassyarduino | 0:e3fb1267e3c3 | 138 | static uint16_t nextPacketPtr; |
cassyarduino | 0:e3fb1267e3c3 | 139 | static uint8_t bank; |
cassyarduino | 0:e3fb1267e3c3 | 140 | static uint8_t erevid; |
cassyarduino | 0:e3fb1267e3c3 | 141 | |
cassyarduino | 0:e3fb1267e3c3 | 142 | static struct memblock receivePkt; |
cassyarduino | 0:e3fb1267e3c3 | 143 | |
cassyarduino | 0:e3fb1267e3c3 | 144 | static bool broadcast_enabled; //!< True if broadcasts enabled (used to allow temporary disable of broadcast for DHCP or other internal functions) |
cassyarduino | 0:e3fb1267e3c3 | 145 | |
cassyarduino | 0:e3fb1267e3c3 | 146 | static uint8_t readOp(uint8_t op, uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 147 | static void writeOp(uint8_t op, uint8_t address, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 148 | static uint16_t setReadPtr(memhandle handle, memaddress position, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 149 | static void setERXRDPT(void); |
cassyarduino | 0:e3fb1267e3c3 | 150 | static void readBuffer(uint16_t len, uint8_t* data); |
cassyarduino | 0:e3fb1267e3c3 | 151 | static void writeBuffer(uint16_t len, uint8_t* data); |
cassyarduino | 0:e3fb1267e3c3 | 152 | static uint8_t readByte(uint16_t addr); |
cassyarduino | 0:e3fb1267e3c3 | 153 | static void writeByte(uint16_t addr, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 154 | static void setBank(uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 155 | static uint8_t readReg(uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 156 | static void writeReg(uint8_t address, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 157 | static void writeRegPair(uint8_t address, uint16_t data); |
cassyarduino | 0:e3fb1267e3c3 | 158 | static void phyWrite(uint8_t address, uint16_t data); |
cassyarduino | 0:e3fb1267e3c3 | 159 | static uint16_t phyRead(uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 160 | static void clkout(uint8_t clk); |
cassyarduino | 0:e3fb1267e3c3 | 161 | |
cassyarduino | 0:e3fb1267e3c3 | 162 | static void enableBroadcast (bool temporary); |
cassyarduino | 0:e3fb1267e3c3 | 163 | static void disableBroadcast (bool temporary); |
cassyarduino | 0:e3fb1267e3c3 | 164 | static void enableMulticast (void); |
cassyarduino | 0:e3fb1267e3c3 | 165 | static void disableMulticast (void); |
cassyarduino | 0:e3fb1267e3c3 | 166 | |
cassyarduino | 0:e3fb1267e3c3 | 167 | static uint8_t readRegByte (uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 168 | static void writeRegByte (uint8_t address, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 169 | |
cassyarduino | 0:e3fb1267e3c3 | 170 | friend void enc28J60_mempool_block_move_callback(memaddress,memaddress,memaddress); |
cassyarduino | 0:e3fb1267e3c3 | 171 | |
cassyarduino | 0:e3fb1267e3c3 | 172 | public: |
cassyarduino | 0:e3fb1267e3c3 | 173 | |
cassyarduino | 0:e3fb1267e3c3 | 174 | void powerOn(void); |
cassyarduino | 0:e3fb1267e3c3 | 175 | void powerOff(void); |
cassyarduino | 0:e3fb1267e3c3 | 176 | static uint8_t geterevid(void); |
cassyarduino | 0:e3fb1267e3c3 | 177 | uint16_t PhyStatus(void); |
cassyarduino | 0:e3fb1267e3c3 | 178 | static bool linkStatus(void); |
cassyarduino | 0:e3fb1267e3c3 | 179 | |
cassyarduino | 0:e3fb1267e3c3 | 180 | static void init(uint8_t* macaddr); |
cassyarduino | 0:e3fb1267e3c3 | 181 | static memhandle receivePacket(void); |
cassyarduino | 0:e3fb1267e3c3 | 182 | static void freePacket(void); |
cassyarduino | 0:e3fb1267e3c3 | 183 | static memaddress blockSize(memhandle handle); |
cassyarduino | 0:e3fb1267e3c3 | 184 | static void sendPacket(memhandle handle); |
cassyarduino | 0:e3fb1267e3c3 | 185 | static uint16_t readPacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 186 | static uint16_t writePacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 187 | static void copyPacket(memhandle dest, memaddress dest_pos, memhandle src, memaddress src_pos, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 188 | static uint16_t chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 189 | }; |
cassyarduino | 0:e3fb1267e3c3 | 190 | |
cassyarduino | 0:e3fb1267e3c3 | 191 | extern Enc28J60Network Enc28J60; |
cassyarduino | 0:e3fb1267e3c3 | 192 | #endif /* Enc28J60NetworkClass_H_ */ |