This is the Interface library for WIZnet W5500 chip which forked of EthernetInterfaceW5500, WIZnetInterface and WIZ550ioInterface. This library has simple name as "W5500Interface". and can be used for Wiz550io users also.

Dependents:   EvrythngApi Websocket_Ethernet_HelloWorld_W5500 Websocket_Ethernet_W5500 CurrentWeatherData_W5500 ... more

Information

It has EthernetInterface class like official EthernetInterface , but uses Wiznet chip driver codes.

So this library can use only the WIZnet W5500 or WIZ550io users.

This library has referred to many project such as WIZ550ioInterface, WiflyInterface and WIZnet Library.

Thanks all.

Committer:
kaizen
Date:
Fri Sep 26 08:05:41 2014 +0000
Revision:
5:8aefaef88f79
Parent:
0:e11e8793c3ce
Child:
9:dfffa4d6f022
Modified for using MQTT protocol ( IBMIoTClient )

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bongjun 0:e11e8793c3ce 1 #pragma once
Bongjun 0:e11e8793c3ce 2
Bongjun 0:e11e8793c3ce 3 #include "mbed.h"
Bongjun 0:e11e8793c3ce 4 #include "mbed_debug.h"
Bongjun 0:e11e8793c3ce 5
Bongjun 0:e11e8793c3ce 6 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};
Bongjun 0:e11e8793c3ce 7
Bongjun 0:e11e8793c3ce 8 #define DEFAULT_WAIT_RESP_TIMEOUT 500
Bongjun 0:e11e8793c3ce 9
Bongjun 0:e11e8793c3ce 10
Bongjun 0:e11e8793c3ce 11 #define MAX_SOCK_NUM 8
Bongjun 0:e11e8793c3ce 12
Bongjun 0:e11e8793c3ce 13 #define MR 0x0000
Bongjun 0:e11e8793c3ce 14 #define GAR 0x0001
Bongjun 0:e11e8793c3ce 15 #define SUBR 0x0005
Bongjun 0:e11e8793c3ce 16 #define SHAR 0x0009
Bongjun 0:e11e8793c3ce 17 #define SIPR 0x000f
kaizen 5:8aefaef88f79 18 #define PHYCFGR 0x002e
Bongjun 0:e11e8793c3ce 19
Bongjun 0:e11e8793c3ce 20 // W5500 socket register
Bongjun 0:e11e8793c3ce 21 #define Sn_MR 0x0000
Bongjun 0:e11e8793c3ce 22 #define Sn_CR 0x0001
Bongjun 0:e11e8793c3ce 23 #define Sn_IR 0x0002
Bongjun 0:e11e8793c3ce 24 #define Sn_SR 0x0003
Bongjun 0:e11e8793c3ce 25 #define Sn_PORT 0x0004
Bongjun 0:e11e8793c3ce 26 #define Sn_DIPR 0x000c
Bongjun 0:e11e8793c3ce 27 #define Sn_DPORT 0x0010
Bongjun 0:e11e8793c3ce 28 #define Sn_RXBUF_SIZE 0x001e
Bongjun 0:e11e8793c3ce 29 #define Sn_TXBUF_SIZE 0x001f
Bongjun 0:e11e8793c3ce 30 #define Sn_TX_FSR 0x0020
Bongjun 0:e11e8793c3ce 31 #define Sn_TX_WR 0x0024
Bongjun 0:e11e8793c3ce 32 #define Sn_RX_RSR 0x0026
Bongjun 0:e11e8793c3ce 33 #define Sn_RX_RD 0x0028
Bongjun 0:e11e8793c3ce 34
Bongjun 0:e11e8793c3ce 35 class WIZnet_Chip {
Bongjun 0:e11e8793c3ce 36 public:
kaizen 5:8aefaef88f79 37
kaizen 5:8aefaef88f79 38 enum Protocol { CLOSED = 0, TCP = 1, UDP = 2,};
kaizen 5:8aefaef88f79 39 enum Command { OPEN = 0x01, LISTEN = 0x02, CONNECT = 0x04, DISCON = 0x08, CLOSE = 0x10, SEND = 0x20, \
kaizen 5:8aefaef88f79 40 SEND_MAC = 0x21, SEND_KEEP = 0x22, RECV = 0x40, };
kaizen 5:8aefaef88f79 41 enum Interrupt { INT_CON = 0x01, INT_DISCON = 0x02, INT_RECV = 0x04, INT_TIMEOUT = 0x08, INT_SEND_OK = 0x10,};
kaizen 5:8aefaef88f79 42
kaizen 5:8aefaef88f79 43 enum Status { SOCK_CLOSED = 0x00, SOCK_INIT = 0x13, SOCK_LISTEN = 0x14, SOCK_SYNSENT = 0x15, SOCK_ESTABLISHED = 0x17, \
kaizen 5:8aefaef88f79 44 SOCK_CLOSE_WAIT = 0x1c, SOCK_UDP = 0x22, };
kaizen 5:8aefaef88f79 45
Bongjun 0:e11e8793c3ce 46 /*
Bongjun 0:e11e8793c3ce 47 * Constructor
Bongjun 0:e11e8793c3ce 48 *
Bongjun 0:e11e8793c3ce 49 * @param spi spi class
Bongjun 0:e11e8793c3ce 50 * @param cs cs of the W5500
Bongjun 0:e11e8793c3ce 51 * @param reset reset pin of the W5500
Bongjun 0:e11e8793c3ce 52 */
Bongjun 0:e11e8793c3ce 53 WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);
Bongjun 0:e11e8793c3ce 54 WIZnet_Chip(SPI* spi, PinName cs, PinName reset);
Bongjun 0:e11e8793c3ce 55
Bongjun 0:e11e8793c3ce 56 /*
Bongjun 0:e11e8793c3ce 57 * Set MAC Address to W5500
Bongjun 0:e11e8793c3ce 58 *
Bongjun 0:e11e8793c3ce 59 * @return true if connected, false otherwise
Bongjun 0:e11e8793c3ce 60 */
Bongjun 0:e11e8793c3ce 61 bool setmac();
Bongjun 0:e11e8793c3ce 62
Bongjun 0:e11e8793c3ce 63 /*
Bongjun 0:e11e8793c3ce 64 * Set Network Informations (SrcIP, Netmask, Gataway)
Bongjun 0:e11e8793c3ce 65 *
Bongjun 0:e11e8793c3ce 66 * @return true if connected, false otherwise
Bongjun 0:e11e8793c3ce 67 */
Bongjun 0:e11e8793c3ce 68 bool setip();
Bongjun 0:e11e8793c3ce 69
Bongjun 0:e11e8793c3ce 70 /*
kaizen 5:8aefaef88f79 71 * Get Link Status
kaizen 5:8aefaef88f79 72 *
kaizen 5:8aefaef88f79 73 * @return true if Link up, false Link down
kaizen 5:8aefaef88f79 74 */
kaizen 5:8aefaef88f79 75 bool linkstatus();
kaizen 5:8aefaef88f79 76
kaizen 5:8aefaef88f79 77 /*
Bongjun 0:e11e8793c3ce 78 * Disconnect the connection
Bongjun 0:e11e8793c3ce 79 *
Bongjun 0:e11e8793c3ce 80 * @ returns true
Bongjun 0:e11e8793c3ce 81 */
Bongjun 0:e11e8793c3ce 82 bool disconnect();
Bongjun 0:e11e8793c3ce 83
Bongjun 0:e11e8793c3ce 84 /*
Bongjun 0:e11e8793c3ce 85 * Open a tcp connection with the specified host on the specified port
Bongjun 0:e11e8793c3ce 86 *
Bongjun 0:e11e8793c3ce 87 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)
Bongjun 0:e11e8793c3ce 88 * @param port port
Bongjun 0:e11e8793c3ce 89 * @ returns true if successful
Bongjun 0:e11e8793c3ce 90 */
Bongjun 0:e11e8793c3ce 91 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);
Bongjun 0:e11e8793c3ce 92
Bongjun 0:e11e8793c3ce 93 /*
Bongjun 0:e11e8793c3ce 94 * Set the protocol (UDP or TCP)
Bongjun 0:e11e8793c3ce 95 *
Bongjun 0:e11e8793c3ce 96 * @param p protocol
Bongjun 0:e11e8793c3ce 97 * @ returns true if successful
Bongjun 0:e11e8793c3ce 98 */
Bongjun 0:e11e8793c3ce 99 bool setProtocol(int socket, Protocol p);
Bongjun 0:e11e8793c3ce 100
Bongjun 0:e11e8793c3ce 101 /*
Bongjun 0:e11e8793c3ce 102 * Reset the W5500
Bongjun 0:e11e8793c3ce 103 */
Bongjun 0:e11e8793c3ce 104 void reset();
Bongjun 0:e11e8793c3ce 105
Bongjun 0:e11e8793c3ce 106 int wait_readable(int socket, int wait_time_ms, int req_size = 0);
Bongjun 0:e11e8793c3ce 107
Bongjun 0:e11e8793c3ce 108 int wait_writeable(int socket, int wait_time_ms, int req_size = 0);
Bongjun 0:e11e8793c3ce 109
Bongjun 0:e11e8793c3ce 110 /*
Bongjun 0:e11e8793c3ce 111 * Check if a tcp link is active
Bongjun 0:e11e8793c3ce 112 *
Bongjun 0:e11e8793c3ce 113 * @returns true if successful
Bongjun 0:e11e8793c3ce 114 */
Bongjun 0:e11e8793c3ce 115 bool is_connected(int socket);
Bongjun 0:e11e8793c3ce 116
Bongjun 0:e11e8793c3ce 117 /*
Bongjun 0:e11e8793c3ce 118 * Close a tcp connection
Bongjun 0:e11e8793c3ce 119 *
Bongjun 0:e11e8793c3ce 120 * @ returns true if successful
Bongjun 0:e11e8793c3ce 121 */
Bongjun 0:e11e8793c3ce 122 bool close(int socket);
Bongjun 0:e11e8793c3ce 123
Bongjun 0:e11e8793c3ce 124 /*
Bongjun 0:e11e8793c3ce 125 * @param str string to be sent
Bongjun 0:e11e8793c3ce 126 * @param len string length
Bongjun 0:e11e8793c3ce 127 */
Bongjun 0:e11e8793c3ce 128 int send(int socket, const char * str, int len);
Bongjun 0:e11e8793c3ce 129
Bongjun 0:e11e8793c3ce 130 int recv(int socket, char* buf, int len);
Bongjun 0:e11e8793c3ce 131
Bongjun 0:e11e8793c3ce 132 /*
Bongjun 0:e11e8793c3ce 133 * Return true if the module is using dhcp
Bongjun 0:e11e8793c3ce 134 *
Bongjun 0:e11e8793c3ce 135 * @returns true if the module is using dhcp
Bongjun 0:e11e8793c3ce 136 */
Bongjun 0:e11e8793c3ce 137 bool isDHCP() {
Bongjun 0:e11e8793c3ce 138 return dhcp;
Bongjun 0:e11e8793c3ce 139 }
Bongjun 0:e11e8793c3ce 140
Bongjun 0:e11e8793c3ce 141 bool gethostbyname(const char* host, uint32_t* ip);
Bongjun 0:e11e8793c3ce 142
Bongjun 0:e11e8793c3ce 143 static WIZnet_Chip * getInstance() {
Bongjun 0:e11e8793c3ce 144 return inst;
Bongjun 0:e11e8793c3ce 145 };
Bongjun 0:e11e8793c3ce 146
Bongjun 0:e11e8793c3ce 147 int new_socket();
Bongjun 0:e11e8793c3ce 148 uint16_t new_port();
Bongjun 0:e11e8793c3ce 149 void scmd(int socket, Command cmd);
Bongjun 0:e11e8793c3ce 150
Bongjun 0:e11e8793c3ce 151 template<typename T>
Bongjun 0:e11e8793c3ce 152 void sreg(int socket, uint16_t addr, T data) {
Bongjun 0:e11e8793c3ce 153 reg_wr<T>(addr, (0x0C + (socket << 5)), data);
Bongjun 0:e11e8793c3ce 154 }
Bongjun 0:e11e8793c3ce 155
Bongjun 0:e11e8793c3ce 156 template<typename T>
Bongjun 0:e11e8793c3ce 157 T sreg(int socket, uint16_t addr) {
Bongjun 0:e11e8793c3ce 158 return reg_rd<T>(addr, (0x08 + (socket << 5)));
Bongjun 0:e11e8793c3ce 159 }
Bongjun 0:e11e8793c3ce 160
Bongjun 0:e11e8793c3ce 161 template<typename T>
Bongjun 0:e11e8793c3ce 162 void reg_wr(uint16_t addr, T data) {
Bongjun 0:e11e8793c3ce 163 return reg_wr(addr, 0x04, data);
Bongjun 0:e11e8793c3ce 164 }
Bongjun 0:e11e8793c3ce 165
Bongjun 0:e11e8793c3ce 166 template<typename T>
Bongjun 0:e11e8793c3ce 167 void reg_wr(uint16_t addr, uint8_t cb, T data) {
Bongjun 0:e11e8793c3ce 168 uint8_t buf[sizeof(T)];
Bongjun 0:e11e8793c3ce 169 *reinterpret_cast<T*>(buf) = data;
Bongjun 0:e11e8793c3ce 170 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian
Bongjun 0:e11e8793c3ce 171 uint8_t t = buf[i];
Bongjun 0:e11e8793c3ce 172 buf[i] = buf[sizeof(buf)-1-i];
Bongjun 0:e11e8793c3ce 173 buf[sizeof(buf)-1-i] = t;
Bongjun 0:e11e8793c3ce 174 }
Bongjun 0:e11e8793c3ce 175 spi_write(addr, cb, buf, sizeof(buf));
Bongjun 0:e11e8793c3ce 176 }
Bongjun 0:e11e8793c3ce 177
Bongjun 0:e11e8793c3ce 178 template<typename T>
Bongjun 0:e11e8793c3ce 179 T reg_rd(uint16_t addr) {
Bongjun 0:e11e8793c3ce 180 return reg_rd<T>(addr, 0x00);
Bongjun 0:e11e8793c3ce 181 }
Bongjun 0:e11e8793c3ce 182
Bongjun 0:e11e8793c3ce 183 template<typename T>
Bongjun 0:e11e8793c3ce 184 T reg_rd(uint16_t addr, uint8_t cb) {
Bongjun 0:e11e8793c3ce 185 uint8_t buf[sizeof(T)];
Bongjun 0:e11e8793c3ce 186 spi_read(addr, cb, buf, sizeof(buf));
Bongjun 0:e11e8793c3ce 187 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian
Bongjun 0:e11e8793c3ce 188 uint8_t t = buf[i];
Bongjun 0:e11e8793c3ce 189 buf[i] = buf[sizeof(buf)-1-i];
Bongjun 0:e11e8793c3ce 190 buf[sizeof(buf)-1-i] = t;
Bongjun 0:e11e8793c3ce 191 }
Bongjun 0:e11e8793c3ce 192 return *reinterpret_cast<T*>(buf);
Bongjun 0:e11e8793c3ce 193 }
Bongjun 0:e11e8793c3ce 194
Bongjun 0:e11e8793c3ce 195 void reg_rd_mac(uint16_t addr, uint8_t* data) {
Bongjun 0:e11e8793c3ce 196 spi_read(addr, 0x00, data, 6);
Bongjun 0:e11e8793c3ce 197 }
Bongjun 0:e11e8793c3ce 198
Bongjun 0:e11e8793c3ce 199 void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {
Bongjun 0:e11e8793c3ce 200 uint8_t buf[4];
Bongjun 0:e11e8793c3ce 201 char* p = (char*)ip;
Bongjun 0:e11e8793c3ce 202 for(int i = 0; i < 4; i++) {
Bongjun 0:e11e8793c3ce 203 buf[i] = atoi(p);
Bongjun 0:e11e8793c3ce 204 p = strchr(p, '.');
Bongjun 0:e11e8793c3ce 205 if (p == NULL) {
Bongjun 0:e11e8793c3ce 206 break;
Bongjun 0:e11e8793c3ce 207 }
Bongjun 0:e11e8793c3ce 208 p++;
Bongjun 0:e11e8793c3ce 209 }
Bongjun 0:e11e8793c3ce 210 spi_write(addr, cb, buf, sizeof(buf));
Bongjun 0:e11e8793c3ce 211 }
Bongjun 0:e11e8793c3ce 212
Bongjun 0:e11e8793c3ce 213 void sreg_ip(int socket, uint16_t addr, const char* ip) {
Bongjun 0:e11e8793c3ce 214 reg_wr_ip(addr, (0x0C + (socket << 5)), ip);
Bongjun 0:e11e8793c3ce 215 }
Bongjun 0:e11e8793c3ce 216
Bongjun 0:e11e8793c3ce 217 protected:
Bongjun 0:e11e8793c3ce 218 uint8_t mac[6];
Bongjun 0:e11e8793c3ce 219 uint32_t ip;
Bongjun 0:e11e8793c3ce 220 uint32_t netmask;
Bongjun 0:e11e8793c3ce 221 uint32_t gateway;
Bongjun 0:e11e8793c3ce 222 uint32_t dnsaddr;
Bongjun 0:e11e8793c3ce 223 bool dhcp;
Bongjun 0:e11e8793c3ce 224
Bongjun 0:e11e8793c3ce 225 static WIZnet_Chip* inst;
Bongjun 0:e11e8793c3ce 226
Bongjun 0:e11e8793c3ce 227 void reg_wr_mac(uint16_t addr, uint8_t* data) {
Bongjun 0:e11e8793c3ce 228 spi_write(addr, 0x04, data, 6);
Bongjun 0:e11e8793c3ce 229 }
Bongjun 0:e11e8793c3ce 230
Bongjun 0:e11e8793c3ce 231 void spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len);
Bongjun 0:e11e8793c3ce 232 void spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len);
Bongjun 0:e11e8793c3ce 233 SPI* spi;
Bongjun 0:e11e8793c3ce 234 DigitalOut cs;
Bongjun 0:e11e8793c3ce 235 DigitalOut reset_pin;
Bongjun 0:e11e8793c3ce 236 };
Bongjun 0:e11e8793c3ce 237
Bongjun 0:e11e8793c3ce 238 extern uint32_t str_to_ip(const char* str);
Bongjun 0:e11e8793c3ce 239 extern void printfBytes(char* str, uint8_t* buf, int len);
Bongjun 0:e11e8793c3ce 240 extern void printHex(uint8_t* buf, int len);
Bongjun 0:e11e8793c3ce 241 extern void debug_hex(uint8_t* buf, int len);