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@25:ef941d560208, 2017-01-14 (annotated)
- Committer:
- cassyarduino
- Date:
- Sat Jan 14 22:35:26 2017 +0100
- Revision:
- 25:ef941d560208
- Parent:
- 22:1ce14a6cd293
- Child:
- 33:7ba5d53df0f2
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 | 19:e416943f7119 | 59 | #if defined(STM32F3) //This is workaround for stm32duino STM32F3 |
cassyarduino | 19:e416943f7119 | 60 | #define BOARD_SPI1_NSS_PIN PA4 |
cassyarduino | 19:e416943f7119 | 61 | #define BOARD_SPI1_SCK_PIN PA5 |
cassyarduino | 19:e416943f7119 | 62 | #define BOARD_SPI1_MISO_PIN PA6 |
cassyarduino | 19:e416943f7119 | 63 | #define BOARD_SPI1_MOSI_PIN PA7 |
cassyarduino | 19:e416943f7119 | 64 | #endif //This is workaround for stm32duino STM32F3 |
cassyarduino | 19:e416943f7119 | 65 | |
cassyarduino | 25:ef941d560208 | 66 | #if defined(BOARD_discovery_f4) |
cassyarduino | 25:ef941d560208 | 67 | #define __STM32F4__ |
cassyarduino | 25:ef941d560208 | 68 | #endif |
cassyarduino | 25:ef941d560208 | 69 | |
cassyarduino | 0:e3fb1267e3c3 | 70 | #if !defined(ENC28J60_CONTROL_CS) |
cassyarduino | 0:e3fb1267e3c3 | 71 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 72 | // Arduino Uno (__AVR__) SS defined to pin 10 |
cassyarduino | 0:e3fb1267e3c3 | 73 | // Arduino Mega(__AVR_ATmega2560__) SS defined to pin 53 |
cassyarduino | 0:e3fb1267e3c3 | 74 | // ESP8266 (ESP8266) SS defined to pin 15 |
cassyarduino | 0:e3fb1267e3c3 | 75 | #define ENC28J60_CONTROL_CS SS |
cassyarduino | 0:e3fb1267e3c3 | 76 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 77 | // Arduino Due (ARDUINO_ARCH_SAM) BOARD_SPI_DEFAULT_SS (SS3) defined to pin 78 |
cassyarduino | 0:e3fb1267e3c3 | 78 | #define ENC28J60_CONTROL_CS BOARD_SPI_DEFAULT_SS |
cassyarduino | 19:e416943f7119 | 79 | #elif defined(STM32_MCU_SERIES) || defined(__STM32F1__) || defined(__STM32F3__) || defined(STM32F3) || defined(__STM32F4__) |
cassyarduino | 19:e416943f7119 | 80 | #if defined(BOARD_SPI1_NSS_PIN) |
cassyarduino | 19:e416943f7119 | 81 | #define ENC28J60_CONTROL_CS BOARD_SPI1_NSS_PIN |
cassyarduino | 19:e416943f7119 | 82 | #elif defined(ARDUINO_STM32F4_NETDUINO2PLUS) |
cassyarduino | 0:e3fb1267e3c3 | 83 | #define ENC28J60_CONTROL_CS PC8 |
cassyarduino | 0:e3fb1267e3c3 | 84 | #else |
cassyarduino | 0:e3fb1267e3c3 | 85 | #define ENC28J60_CONTROL_CS SPI.nssPin() |
cassyarduino | 0:e3fb1267e3c3 | 86 | //#define ENC28J60_CONTROL_CS PA4 |
cassyarduino | 0:e3fb1267e3c3 | 87 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 88 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 89 | #if defined(ENC28J60_CONTROL_CS) |
cassyarduino | 3:6b1c9bd7773a | 90 | #warning "Not defined ENC28J60_CONTROL_CS. Use borad default SS pin setting. You can configure in 'utility/Enc28J60Network.h'." |
cassyarduino | 0:e3fb1267e3c3 | 91 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 92 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 93 | #if !defined(ENC28J60_CONTROL_CS) |
cassyarduino | 0:e3fb1267e3c3 | 94 | #error "Not defined ENC28J60_CONTROL_CS!" |
cassyarduino | 0:e3fb1267e3c3 | 95 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 96 | |
cassyarduino | 0:e3fb1267e3c3 | 97 | #if !defined(SPI_MOSI) |
cassyarduino | 0:e3fb1267e3c3 | 98 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 99 | #define SPI_MOSI MOSI |
cassyarduino | 0:e3fb1267e3c3 | 100 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 101 | #define SPI_MOSI PIN_SPI_MOSI |
cassyarduino | 19:e416943f7119 | 102 | #elif defined(__STM32F1__) || defined(__STM32F3__) || defined(STM32F3) || defined(__STM32F4__) |
cassyarduino | 19:e416943f7119 | 103 | #if defined(BOARD_SPI1_MOSI_PIN) |
cassyarduino | 19:e416943f7119 | 104 | #define SPI_MOSI BOARD_SPI1_MOSI_PIN |
cassyarduino | 19:e416943f7119 | 105 | #else |
cassyarduino | 19:e416943f7119 | 106 | #define SPI_MOSI SPI.mosiPin() |
cassyarduino | 19:e416943f7119 | 107 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 108 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 109 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 110 | #if !defined(SPI_MOSI) |
cassyarduino | 0:e3fb1267e3c3 | 111 | #error "Not defined SPI_MOSI!" |
cassyarduino | 0:e3fb1267e3c3 | 112 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 113 | |
cassyarduino | 0:e3fb1267e3c3 | 114 | #if !defined(SPI_MISO) |
cassyarduino | 0:e3fb1267e3c3 | 115 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 116 | #define SPI_MISO MISO |
cassyarduino | 0:e3fb1267e3c3 | 117 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 118 | #define SPI_MISO PIN_SPI_MISO |
cassyarduino | 19:e416943f7119 | 119 | #elif defined(__STM32F1__) || defined(__STM32F3__) || defined(STM32F3) || defined(__STM32F4__) |
cassyarduino | 19:e416943f7119 | 120 | #if defined(BOARD_SPI1_MISO_PIN) |
cassyarduino | 19:e416943f7119 | 121 | #define SPI_MISO BOARD_SPI1_MISO_PIN |
cassyarduino | 19:e416943f7119 | 122 | #else |
cassyarduino | 19:e416943f7119 | 123 | #define SPI_MISO SPI.misoPin() |
cassyarduino | 19:e416943f7119 | 124 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 125 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 126 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 127 | #if !defined(SPI_MISO) |
cassyarduino | 0:e3fb1267e3c3 | 128 | #error "Not defined SPI_MISO!" |
cassyarduino | 0:e3fb1267e3c3 | 129 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 130 | #if !defined(SPI_SCK) |
cassyarduino | 0:e3fb1267e3c3 | 131 | #if defined(__AVR__) || defined(ESP8266) |
cassyarduino | 0:e3fb1267e3c3 | 132 | #define SPI_SCK SCK |
cassyarduino | 0:e3fb1267e3c3 | 133 | #elif defined(ARDUINO_ARCH_SAM) |
cassyarduino | 0:e3fb1267e3c3 | 134 | #define SPI_SCK PIN_SPI_SCK |
cassyarduino | 19:e416943f7119 | 135 | #elif defined(__STM32F1__) || defined(__STM32F3__) || defined(STM32F3) || defined(__STM32F4__) |
cassyarduino | 19:e416943f7119 | 136 | #if defined(BOARD_SPI1_SCK_PIN) |
cassyarduino | 19:e416943f7119 | 137 | #define SPI_SCK BOARD_SPI1_SCK_PIN |
cassyarduino | 19:e416943f7119 | 138 | #else |
cassyarduino | 19:e416943f7119 | 139 | #define SPI_SCK SPI.sckPin() |
cassyarduino | 19:e416943f7119 | 140 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 141 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 142 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 143 | #if !defined(SPI_SCK) |
cassyarduino | 0:e3fb1267e3c3 | 144 | #error "Not defined SPI_SCK!" |
cassyarduino | 0:e3fb1267e3c3 | 145 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 146 | |
cassyarduino | 19:e416943f7119 | 147 | #if defined(__MBED__) || defined(ARDUINO_ARCH_SAM) || defined(__STM32F1__) || defined(__STM32F3__) || defined(STM32F3) || defined(__STM32F4__) || defined(ESP8266) |
cassyarduino | 22:1ce14a6cd293 | 148 | #if defined(ARDUINO) && defined(STM32F3) |
cassyarduino | 19:e416943f7119 | 149 | #include "HardwareSPI.h" |
cassyarduino | 19:e416943f7119 | 150 | #else |
cassyarduino | 19:e416943f7119 | 151 | #include <SPI.h> |
cassyarduino | 19:e416943f7119 | 152 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 153 | #define ENC28J60_USE_SPILIB 1 |
cassyarduino | 0:e3fb1267e3c3 | 154 | #endif |
cassyarduino | 0:e3fb1267e3c3 | 155 | |
cassyarduino | 0:e3fb1267e3c3 | 156 | #define UIP_RECEIVEBUFFERHANDLE 0xff |
cassyarduino | 0:e3fb1267e3c3 | 157 | |
cassyarduino | 0:e3fb1267e3c3 | 158 | /* |
cassyarduino | 0:e3fb1267e3c3 | 159 | * Empfangen von ip-header, arp etc... |
cassyarduino | 0:e3fb1267e3c3 | 160 | * wenn tcp/udp -> tcp/udp-callback -> assign new packet to connection |
cassyarduino | 0:e3fb1267e3c3 | 161 | */ |
cassyarduino | 0:e3fb1267e3c3 | 162 | |
cassyarduino | 0:e3fb1267e3c3 | 163 | class Enc28J60Network : public MemoryPool |
cassyarduino | 0:e3fb1267e3c3 | 164 | { |
cassyarduino | 0:e3fb1267e3c3 | 165 | |
cassyarduino | 0:e3fb1267e3c3 | 166 | private: |
cassyarduino | 0:e3fb1267e3c3 | 167 | static uint16_t nextPacketPtr; |
cassyarduino | 0:e3fb1267e3c3 | 168 | static uint8_t bank; |
cassyarduino | 0:e3fb1267e3c3 | 169 | static uint8_t erevid; |
cassyarduino | 0:e3fb1267e3c3 | 170 | |
cassyarduino | 0:e3fb1267e3c3 | 171 | static struct memblock receivePkt; |
cassyarduino | 0:e3fb1267e3c3 | 172 | |
cassyarduino | 0:e3fb1267e3c3 | 173 | static bool broadcast_enabled; //!< True if broadcasts enabled (used to allow temporary disable of broadcast for DHCP or other internal functions) |
cassyarduino | 0:e3fb1267e3c3 | 174 | |
cassyarduino | 0:e3fb1267e3c3 | 175 | static uint8_t readOp(uint8_t op, uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 176 | static void writeOp(uint8_t op, uint8_t address, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 177 | static uint16_t setReadPtr(memhandle handle, memaddress position, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 178 | static void setERXRDPT(void); |
cassyarduino | 0:e3fb1267e3c3 | 179 | static void readBuffer(uint16_t len, uint8_t* data); |
cassyarduino | 0:e3fb1267e3c3 | 180 | static void writeBuffer(uint16_t len, uint8_t* data); |
cassyarduino | 0:e3fb1267e3c3 | 181 | static uint8_t readByte(uint16_t addr); |
cassyarduino | 0:e3fb1267e3c3 | 182 | static void writeByte(uint16_t addr, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 183 | static void setBank(uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 184 | static uint8_t readReg(uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 185 | static void writeReg(uint8_t address, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 186 | static void writeRegPair(uint8_t address, uint16_t data); |
cassyarduino | 0:e3fb1267e3c3 | 187 | static void phyWrite(uint8_t address, uint16_t data); |
cassyarduino | 0:e3fb1267e3c3 | 188 | static uint16_t phyRead(uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 189 | static void clkout(uint8_t clk); |
cassyarduino | 0:e3fb1267e3c3 | 190 | |
cassyarduino | 0:e3fb1267e3c3 | 191 | static void enableBroadcast (bool temporary); |
cassyarduino | 0:e3fb1267e3c3 | 192 | static void disableBroadcast (bool temporary); |
cassyarduino | 0:e3fb1267e3c3 | 193 | static void enableMulticast (void); |
cassyarduino | 0:e3fb1267e3c3 | 194 | static void disableMulticast (void); |
cassyarduino | 0:e3fb1267e3c3 | 195 | |
cassyarduino | 0:e3fb1267e3c3 | 196 | static uint8_t readRegByte (uint8_t address); |
cassyarduino | 0:e3fb1267e3c3 | 197 | static void writeRegByte (uint8_t address, uint8_t data); |
cassyarduino | 0:e3fb1267e3c3 | 198 | |
cassyarduino | 0:e3fb1267e3c3 | 199 | friend void enc28J60_mempool_block_move_callback(memaddress,memaddress,memaddress); |
cassyarduino | 0:e3fb1267e3c3 | 200 | |
cassyarduino | 0:e3fb1267e3c3 | 201 | public: |
cassyarduino | 0:e3fb1267e3c3 | 202 | |
cassyarduino | 0:e3fb1267e3c3 | 203 | void powerOn(void); |
cassyarduino | 0:e3fb1267e3c3 | 204 | void powerOff(void); |
cassyarduino | 0:e3fb1267e3c3 | 205 | static uint8_t geterevid(void); |
cassyarduino | 0:e3fb1267e3c3 | 206 | uint16_t PhyStatus(void); |
cassyarduino | 0:e3fb1267e3c3 | 207 | static bool linkStatus(void); |
cassyarduino | 0:e3fb1267e3c3 | 208 | |
cassyarduino | 0:e3fb1267e3c3 | 209 | static void init(uint8_t* macaddr); |
cassyarduino | 0:e3fb1267e3c3 | 210 | static memhandle receivePacket(void); |
cassyarduino | 0:e3fb1267e3c3 | 211 | static void freePacket(void); |
cassyarduino | 0:e3fb1267e3c3 | 212 | static memaddress blockSize(memhandle handle); |
cassyarduino | 0:e3fb1267e3c3 | 213 | static void sendPacket(memhandle handle); |
cassyarduino | 0:e3fb1267e3c3 | 214 | static uint16_t readPacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 215 | static uint16_t writePacket(memhandle handle, memaddress position, uint8_t* buffer, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 216 | static void copyPacket(memhandle dest, memaddress dest_pos, memhandle src, memaddress src_pos, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 217 | static uint16_t chksum(uint16_t sum, memhandle handle, memaddress pos, uint16_t len); |
cassyarduino | 0:e3fb1267e3c3 | 218 | }; |
cassyarduino | 0:e3fb1267e3c3 | 219 | |
cassyarduino | 0:e3fb1267e3c3 | 220 | extern Enc28J60Network Enc28J60; |
cassyarduino | 0:e3fb1267e3c3 | 221 | #endif /* Enc28J60NetworkClass_H_ */ |