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:
Bongjun
Date:
Wed Aug 20 00:28:37 2014 +0000
Revision:
0:e11e8793c3ce
Child:
2:e02950866c42
first release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Bongjun 0:e11e8793c3ce 1
Bongjun 0:e11e8793c3ce 2 #include "mbed.h"
Bongjun 0:e11e8793c3ce 3 #include "mbed_debug.h"
Bongjun 0:e11e8793c3ce 4 #include "wiznet.h"
Bongjun 0:e11e8793c3ce 5 #include "DNSClient.h"
Bongjun 0:e11e8793c3ce 6
Bongjun 0:e11e8793c3ce 7 #ifdef USE_W5500
Bongjun 0:e11e8793c3ce 8
Bongjun 0:e11e8793c3ce 9 //Debug is disabled by default
Bongjun 0:e11e8793c3ce 10 #if 0
Bongjun 0:e11e8793c3ce 11 #define DBG(...) do{debug("%p %d %s ", this,__LINE__,__PRETTY_FUNCTION__); debug(__VA_ARGS__); } while(0);
Bongjun 0:e11e8793c3ce 12 //#define DBG(x, ...) debug("[W5500:DBG]"x"\r\n", ##__VA_ARGS__);
Bongjun 0:e11e8793c3ce 13 #define WARN(x, ...) debug("[W5500:WARN]"x"\r\n", ##__VA_ARGS__);
Bongjun 0:e11e8793c3ce 14 #define ERR(x, ...) debug("[W5500:ERR]"x"\r\n", ##__VA_ARGS__);
Bongjun 0:e11e8793c3ce 15 #else
Bongjun 0:e11e8793c3ce 16 #define DBG(x, ...)
Bongjun 0:e11e8793c3ce 17 #define WARN(x, ...)
Bongjun 0:e11e8793c3ce 18 #define ERR(x, ...)
Bongjun 0:e11e8793c3ce 19 #endif
Bongjun 0:e11e8793c3ce 20
Bongjun 0:e11e8793c3ce 21 #if 1
Bongjun 0:e11e8793c3ce 22 #define INFO(x, ...) debug("[W5500:INFO]"x"\r\n", ##__VA_ARGS__);
Bongjun 0:e11e8793c3ce 23 #else
Bongjun 0:e11e8793c3ce 24 #define INFO(x, ...)
Bongjun 0:e11e8793c3ce 25 #endif
Bongjun 0:e11e8793c3ce 26
Bongjun 0:e11e8793c3ce 27 #define DBG_SPI 0
Bongjun 0:e11e8793c3ce 28
Bongjun 0:e11e8793c3ce 29 WIZnet_Chip* WIZnet_Chip::inst;
Bongjun 0:e11e8793c3ce 30
Bongjun 0:e11e8793c3ce 31 WIZnet_Chip::WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName _cs, PinName _reset):
Bongjun 0:e11e8793c3ce 32 cs(_cs), reset_pin(_reset)
Bongjun 0:e11e8793c3ce 33 {
Bongjun 0:e11e8793c3ce 34 spi = new SPI(mosi, miso, sclk);
Bongjun 0:e11e8793c3ce 35 cs = 1;
Bongjun 0:e11e8793c3ce 36 reset_pin = 1;
Bongjun 0:e11e8793c3ce 37 inst = this;
Bongjun 0:e11e8793c3ce 38 }
Bongjun 0:e11e8793c3ce 39
Bongjun 0:e11e8793c3ce 40 WIZnet_Chip::WIZnet_Chip(SPI* spi, PinName _cs, PinName _reset):
Bongjun 0:e11e8793c3ce 41 cs(_cs), reset_pin(_reset)
Bongjun 0:e11e8793c3ce 42 {
Bongjun 0:e11e8793c3ce 43 this->spi = spi;
Bongjun 0:e11e8793c3ce 44 cs = 1;
Bongjun 0:e11e8793c3ce 45 reset_pin = 1;
Bongjun 0:e11e8793c3ce 46 inst = this;
Bongjun 0:e11e8793c3ce 47 }
Bongjun 0:e11e8793c3ce 48
Bongjun 0:e11e8793c3ce 49 bool WIZnet_Chip::setmac()
Bongjun 0:e11e8793c3ce 50 {
Bongjun 0:e11e8793c3ce 51
Bongjun 0:e11e8793c3ce 52 for (int i =0; i < 6; i++) reg_wr<uint8_t>(SHAR+i, mac[i]);
Bongjun 0:e11e8793c3ce 53
Bongjun 0:e11e8793c3ce 54 return true;
Bongjun 0:e11e8793c3ce 55 }
Bongjun 0:e11e8793c3ce 56
Bongjun 0:e11e8793c3ce 57 // Set the IP
Bongjun 0:e11e8793c3ce 58 bool WIZnet_Chip::setip()
Bongjun 0:e11e8793c3ce 59 {
Bongjun 0:e11e8793c3ce 60 reg_wr<uint32_t>(SIPR, ip);
Bongjun 0:e11e8793c3ce 61 reg_wr<uint32_t>(GAR, gateway);
Bongjun 0:e11e8793c3ce 62 reg_wr<uint32_t>(SUBR, netmask);
Bongjun 0:e11e8793c3ce 63 return true;
Bongjun 0:e11e8793c3ce 64 }
Bongjun 0:e11e8793c3ce 65
Bongjun 0:e11e8793c3ce 66 bool WIZnet_Chip::setProtocol(int socket, Protocol p)
Bongjun 0:e11e8793c3ce 67 {
Bongjun 0:e11e8793c3ce 68 if (socket < 0) {
Bongjun 0:e11e8793c3ce 69 return false;
Bongjun 0:e11e8793c3ce 70 }
Bongjun 0:e11e8793c3ce 71 sreg<uint8_t>(socket, Sn_MR, p);
Bongjun 0:e11e8793c3ce 72 return true;
Bongjun 0:e11e8793c3ce 73 }
Bongjun 0:e11e8793c3ce 74
Bongjun 0:e11e8793c3ce 75 bool WIZnet_Chip::connect(int socket, const char * host, int port, int timeout_ms)
Bongjun 0:e11e8793c3ce 76 {
Bongjun 0:e11e8793c3ce 77 if (socket < 0) {
Bongjun 0:e11e8793c3ce 78 return false;
Bongjun 0:e11e8793c3ce 79 }
Bongjun 0:e11e8793c3ce 80 sreg<uint8_t>(socket, Sn_MR, TCP);
Bongjun 0:e11e8793c3ce 81 scmd(socket, OPEN);
Bongjun 0:e11e8793c3ce 82 sreg_ip(socket, Sn_DIPR, host);
Bongjun 0:e11e8793c3ce 83 sreg<uint16_t>(socket, Sn_DPORT, port);
Bongjun 0:e11e8793c3ce 84 sreg<uint16_t>(socket, Sn_PORT, new_port());
Bongjun 0:e11e8793c3ce 85 scmd(socket, CONNECT);
Bongjun 0:e11e8793c3ce 86 Timer t;
Bongjun 0:e11e8793c3ce 87 t.reset();
Bongjun 0:e11e8793c3ce 88 t.start();
Bongjun 0:e11e8793c3ce 89 while(!is_connected(socket)) {
Bongjun 0:e11e8793c3ce 90 if (t.read_ms() > timeout_ms) {
Bongjun 0:e11e8793c3ce 91 return false;
Bongjun 0:e11e8793c3ce 92 }
Bongjun 0:e11e8793c3ce 93 }
Bongjun 0:e11e8793c3ce 94 return true;
Bongjun 0:e11e8793c3ce 95 }
Bongjun 0:e11e8793c3ce 96
Bongjun 0:e11e8793c3ce 97 bool WIZnet_Chip::gethostbyname(const char* host, uint32_t* ip)
Bongjun 0:e11e8793c3ce 98 {
Bongjun 0:e11e8793c3ce 99 uint32_t addr = str_to_ip(host);
Bongjun 0:e11e8793c3ce 100 char buf[17];
Bongjun 0:e11e8793c3ce 101 snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff);
Bongjun 0:e11e8793c3ce 102 if (strcmp(buf, host) == 0) {
Bongjun 0:e11e8793c3ce 103 *ip = addr;
Bongjun 0:e11e8793c3ce 104 return true;
Bongjun 0:e11e8793c3ce 105 }
Bongjun 0:e11e8793c3ce 106 DNSClient client;
Bongjun 0:e11e8793c3ce 107 if(client.lookup(host)) {
Bongjun 0:e11e8793c3ce 108 *ip = client.ip;
Bongjun 0:e11e8793c3ce 109 return true;
Bongjun 0:e11e8793c3ce 110 }
Bongjun 0:e11e8793c3ce 111 return false;
Bongjun 0:e11e8793c3ce 112 }
Bongjun 0:e11e8793c3ce 113
Bongjun 0:e11e8793c3ce 114 bool WIZnet_Chip::disconnect()
Bongjun 0:e11e8793c3ce 115 {
Bongjun 0:e11e8793c3ce 116 return true;
Bongjun 0:e11e8793c3ce 117 }
Bongjun 0:e11e8793c3ce 118
Bongjun 0:e11e8793c3ce 119 bool WIZnet_Chip::is_connected(int socket)
Bongjun 0:e11e8793c3ce 120 {
Bongjun 0:e11e8793c3ce 121 uint8_t tmpSn_SR;
Bongjun 0:e11e8793c3ce 122 tmpSn_SR = sreg<uint8_t>(socket, Sn_SR);
Bongjun 0:e11e8793c3ce 123 // packet sending is possible, when state is SOCK_CLOSE_WAIT.
Bongjun 0:e11e8793c3ce 124 if ((tmpSn_SR == SOCK_ESTABLISHED) || (tmpSn_SR == SOCK_CLOSE_WAIT)) {
Bongjun 0:e11e8793c3ce 125 return true;
Bongjun 0:e11e8793c3ce 126 }
Bongjun 0:e11e8793c3ce 127 return false;
Bongjun 0:e11e8793c3ce 128 }
Bongjun 0:e11e8793c3ce 129
Bongjun 0:e11e8793c3ce 130 // Reset the chip & set the buffer
Bongjun 0:e11e8793c3ce 131 void WIZnet_Chip::reset()
Bongjun 0:e11e8793c3ce 132 {
Bongjun 0:e11e8793c3ce 133 reset_pin = 1;
Bongjun 0:e11e8793c3ce 134 reset_pin = 0;
Bongjun 0:e11e8793c3ce 135 wait_us(500); // 500us (w5500)
Bongjun 0:e11e8793c3ce 136 reset_pin = 1;
Bongjun 0:e11e8793c3ce 137 wait_ms(400); // 400ms (w5500)
Bongjun 0:e11e8793c3ce 138
Bongjun 0:e11e8793c3ce 139 #if defined(USE_WIZ550IO_MAC)
Bongjun 0:e11e8793c3ce 140 //reg_rd_mac(SHAR, mac); // read the MAC address inside the module
Bongjun 0:e11e8793c3ce 141 #endif
Bongjun 0:e11e8793c3ce 142
Bongjun 0:e11e8793c3ce 143 //reg_wr_mac(SHAR, mac);
Bongjun 0:e11e8793c3ce 144
Bongjun 0:e11e8793c3ce 145 // set RX and TX buffer size
Bongjun 0:e11e8793c3ce 146 for (int socket = 0; socket < MAX_SOCK_NUM; socket++) {
Bongjun 0:e11e8793c3ce 147 sreg<uint8_t>(socket, Sn_RXBUF_SIZE, 2);
Bongjun 0:e11e8793c3ce 148 sreg<uint8_t>(socket, Sn_TXBUF_SIZE, 2);
Bongjun 0:e11e8793c3ce 149 }
Bongjun 0:e11e8793c3ce 150 }
Bongjun 0:e11e8793c3ce 151
Bongjun 0:e11e8793c3ce 152
Bongjun 0:e11e8793c3ce 153 bool WIZnet_Chip::close(int socket)
Bongjun 0:e11e8793c3ce 154 {
Bongjun 0:e11e8793c3ce 155 if (socket < 0) {
Bongjun 0:e11e8793c3ce 156 return false;
Bongjun 0:e11e8793c3ce 157 }
Bongjun 0:e11e8793c3ce 158 // if not connected, return
Bongjun 0:e11e8793c3ce 159 if (sreg<uint8_t>(socket, Sn_SR) == SOCK_CLOSED) {
Bongjun 0:e11e8793c3ce 160 return true;
Bongjun 0:e11e8793c3ce 161 }
Bongjun 0:e11e8793c3ce 162 if (sreg<uint8_t>(socket, Sn_MR) == TCP) {
Bongjun 0:e11e8793c3ce 163 scmd(socket, DISCON);
Bongjun 0:e11e8793c3ce 164 }
Bongjun 0:e11e8793c3ce 165 scmd(socket, CLOSE);
Bongjun 0:e11e8793c3ce 166 sreg<uint8_t>(socket, Sn_IR, 0xff);
Bongjun 0:e11e8793c3ce 167 return true;
Bongjun 0:e11e8793c3ce 168 }
Bongjun 0:e11e8793c3ce 169
Bongjun 0:e11e8793c3ce 170 int WIZnet_Chip::wait_readable(int socket, int wait_time_ms, int req_size)
Bongjun 0:e11e8793c3ce 171 {
Bongjun 0:e11e8793c3ce 172 int size, size2;
Bongjun 0:e11e8793c3ce 173 if (socket < 0) {
Bongjun 0:e11e8793c3ce 174 return -1;
Bongjun 0:e11e8793c3ce 175 }
Bongjun 0:e11e8793c3ce 176 Timer t;
Bongjun 0:e11e8793c3ce 177 t.reset();
Bongjun 0:e11e8793c3ce 178 t.start();
Bongjun 0:e11e8793c3ce 179 while(1) {
Bongjun 0:e11e8793c3ce 180 //int size = sreg<uint16_t>(socket, Sn_RX_RSR);
Bongjun 0:e11e8793c3ce 181 // during the reading Sn_RX_RXR, it has the possible change of this register.
Bongjun 0:e11e8793c3ce 182 // so read twice and get same value then use size information.
Bongjun 0:e11e8793c3ce 183 do {
Bongjun 0:e11e8793c3ce 184 size = sreg<uint16_t>(socket, Sn_RX_RSR);
Bongjun 0:e11e8793c3ce 185 size2 = sreg<uint16_t>(socket, Sn_RX_RSR);
Bongjun 0:e11e8793c3ce 186 } while (size != size2);
Bongjun 0:e11e8793c3ce 187
Bongjun 0:e11e8793c3ce 188
Bongjun 0:e11e8793c3ce 189 if (size > req_size) {
Bongjun 0:e11e8793c3ce 190 return size;
Bongjun 0:e11e8793c3ce 191 }
Bongjun 0:e11e8793c3ce 192 if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {
Bongjun 0:e11e8793c3ce 193 break;
Bongjun 0:e11e8793c3ce 194 }
Bongjun 0:e11e8793c3ce 195 }
Bongjun 0:e11e8793c3ce 196 return -1;
Bongjun 0:e11e8793c3ce 197 }
Bongjun 0:e11e8793c3ce 198
Bongjun 0:e11e8793c3ce 199 int WIZnet_Chip::wait_writeable(int socket, int wait_time_ms, int req_size)
Bongjun 0:e11e8793c3ce 200 {
Bongjun 0:e11e8793c3ce 201 int size, size2;
Bongjun 0:e11e8793c3ce 202 if (socket < 0) {
Bongjun 0:e11e8793c3ce 203 return -1;
Bongjun 0:e11e8793c3ce 204 }
Bongjun 0:e11e8793c3ce 205 Timer t;
Bongjun 0:e11e8793c3ce 206 t.reset();
Bongjun 0:e11e8793c3ce 207 t.start();
Bongjun 0:e11e8793c3ce 208 while(1) {
Bongjun 0:e11e8793c3ce 209 //int size = sreg<uint16_t>(socket, Sn_TX_FSR);
Bongjun 0:e11e8793c3ce 210 // during the reading Sn_TX_FSR, it has the possible change of this register.
Bongjun 0:e11e8793c3ce 211 // so read twice and get same value then use size information.
Bongjun 0:e11e8793c3ce 212 do {
Bongjun 0:e11e8793c3ce 213 size = sreg<uint16_t>(socket, Sn_TX_FSR);
Bongjun 0:e11e8793c3ce 214 size2 = sreg<uint16_t>(socket, Sn_TX_FSR);
Bongjun 0:e11e8793c3ce 215 } while (size != size2);
Bongjun 0:e11e8793c3ce 216 if (size > req_size) {
Bongjun 0:e11e8793c3ce 217 return size;
Bongjun 0:e11e8793c3ce 218 }
Bongjun 0:e11e8793c3ce 219 if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {
Bongjun 0:e11e8793c3ce 220 break;
Bongjun 0:e11e8793c3ce 221 }
Bongjun 0:e11e8793c3ce 222 }
Bongjun 0:e11e8793c3ce 223 return -1;
Bongjun 0:e11e8793c3ce 224 }
Bongjun 0:e11e8793c3ce 225
Bongjun 0:e11e8793c3ce 226 int WIZnet_Chip::send(int socket, const char * str, int len)
Bongjun 0:e11e8793c3ce 227 {
Bongjun 0:e11e8793c3ce 228 if (socket < 0) {
Bongjun 0:e11e8793c3ce 229 return -1;
Bongjun 0:e11e8793c3ce 230 }
Bongjun 0:e11e8793c3ce 231 uint16_t ptr = sreg<uint16_t>(socket, Sn_TX_WR);
Bongjun 0:e11e8793c3ce 232 uint8_t cntl_byte = (0x14 + (socket << 5));
Bongjun 0:e11e8793c3ce 233 spi_write(ptr, cntl_byte, (uint8_t*)str, len);
Bongjun 0:e11e8793c3ce 234 sreg<uint16_t>(socket, Sn_TX_WR, ptr + len);
Bongjun 0:e11e8793c3ce 235 scmd(socket, SEND);
Bongjun 0:e11e8793c3ce 236 uint8_t tmp_Sn_IR;
Bongjun 0:e11e8793c3ce 237 while (( (tmp_Sn_IR = sreg<uint8_t>(socket, Sn_IR)) & INT_SEND_OK) != INT_SEND_OK) {
Bongjun 0:e11e8793c3ce 238 // @Jul.10, 2014 fix contant name, and udp sendto function.
Bongjun 0:e11e8793c3ce 239 switch (sreg<uint8_t>(socket, Sn_SR)) {
Bongjun 0:e11e8793c3ce 240 case SOCK_CLOSED :
Bongjun 0:e11e8793c3ce 241 close(socket);
Bongjun 0:e11e8793c3ce 242 return 0;
Bongjun 0:e11e8793c3ce 243 //break;
Bongjun 0:e11e8793c3ce 244 case SOCK_UDP :
Bongjun 0:e11e8793c3ce 245 // ARP timeout is possible.
Bongjun 0:e11e8793c3ce 246 if ((tmp_Sn_IR & INT_TIMEOUT) == INT_TIMEOUT) {
Bongjun 0:e11e8793c3ce 247 sreg<uint8_t>(socket, Sn_IR, INT_TIMEOUT);
Bongjun 0:e11e8793c3ce 248 return 0;
Bongjun 0:e11e8793c3ce 249 }
Bongjun 0:e11e8793c3ce 250 break;
Bongjun 0:e11e8793c3ce 251 default :
Bongjun 0:e11e8793c3ce 252 break;
Bongjun 0:e11e8793c3ce 253 }
Bongjun 0:e11e8793c3ce 254 }
Bongjun 0:e11e8793c3ce 255 sreg<uint8_t>(socket, Sn_IR, INT_SEND_OK);
Bongjun 0:e11e8793c3ce 256
Bongjun 0:e11e8793c3ce 257 return len;
Bongjun 0:e11e8793c3ce 258 }
Bongjun 0:e11e8793c3ce 259
Bongjun 0:e11e8793c3ce 260 int WIZnet_Chip::recv(int socket, char* buf, int len)
Bongjun 0:e11e8793c3ce 261 {
Bongjun 0:e11e8793c3ce 262 if (socket < 0) {
Bongjun 0:e11e8793c3ce 263 return -1;
Bongjun 0:e11e8793c3ce 264 }
Bongjun 0:e11e8793c3ce 265 uint16_t ptr = sreg<uint16_t>(socket, Sn_RX_RD);
Bongjun 0:e11e8793c3ce 266 uint8_t cntl_byte = (0x18 + (socket << 5));
Bongjun 0:e11e8793c3ce 267 spi_read(ptr, cntl_byte, (uint8_t*)buf, len);
Bongjun 0:e11e8793c3ce 268 sreg<uint16_t>(socket, Sn_RX_RD, ptr + len);
Bongjun 0:e11e8793c3ce 269 scmd(socket, RECV);
Bongjun 0:e11e8793c3ce 270 return len;
Bongjun 0:e11e8793c3ce 271 }
Bongjun 0:e11e8793c3ce 272
Bongjun 0:e11e8793c3ce 273 int WIZnet_Chip::new_socket()
Bongjun 0:e11e8793c3ce 274 {
Bongjun 0:e11e8793c3ce 275 for(int s = 0; s < MAX_SOCK_NUM; s++) {
Bongjun 0:e11e8793c3ce 276 if (sreg<uint8_t>(s, Sn_SR) == SOCK_CLOSED) {
Bongjun 0:e11e8793c3ce 277 return s;
Bongjun 0:e11e8793c3ce 278 }
Bongjun 0:e11e8793c3ce 279 }
Bongjun 0:e11e8793c3ce 280 return -1;
Bongjun 0:e11e8793c3ce 281 }
Bongjun 0:e11e8793c3ce 282
Bongjun 0:e11e8793c3ce 283 uint16_t WIZnet_Chip::new_port()
Bongjun 0:e11e8793c3ce 284 {
Bongjun 0:e11e8793c3ce 285 uint16_t port = rand();
Bongjun 0:e11e8793c3ce 286 port |= 49152;
Bongjun 0:e11e8793c3ce 287 return port;
Bongjun 0:e11e8793c3ce 288 }
Bongjun 0:e11e8793c3ce 289
Bongjun 0:e11e8793c3ce 290 void WIZnet_Chip::scmd(int socket, Command cmd)
Bongjun 0:e11e8793c3ce 291 {
Bongjun 0:e11e8793c3ce 292 sreg<uint8_t>(socket, Sn_CR, cmd);
Bongjun 0:e11e8793c3ce 293 while(sreg<uint8_t>(socket, Sn_CR));
Bongjun 0:e11e8793c3ce 294 }
Bongjun 0:e11e8793c3ce 295
Bongjun 0:e11e8793c3ce 296 void WIZnet_Chip::spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len)
Bongjun 0:e11e8793c3ce 297 {
Bongjun 0:e11e8793c3ce 298 cs = 0;
Bongjun 0:e11e8793c3ce 299 spi->write(addr >> 8);
Bongjun 0:e11e8793c3ce 300 spi->write(addr & 0xff);
Bongjun 0:e11e8793c3ce 301 spi->write(cb);
Bongjun 0:e11e8793c3ce 302 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 303 spi->write(buf[i]);
Bongjun 0:e11e8793c3ce 304 }
Bongjun 0:e11e8793c3ce 305 cs = 1;
Bongjun 0:e11e8793c3ce 306
Bongjun 0:e11e8793c3ce 307 #if DBG_SPI
Bongjun 0:e11e8793c3ce 308 debug("[SPI]W %04x(%02x %d)", addr, cb, len);
Bongjun 0:e11e8793c3ce 309 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 310 debug(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 311 if (i > 16) {
Bongjun 0:e11e8793c3ce 312 debug(" ...");
Bongjun 0:e11e8793c3ce 313 break;
Bongjun 0:e11e8793c3ce 314 }
Bongjun 0:e11e8793c3ce 315 }
Bongjun 0:e11e8793c3ce 316 debug("\r\n");
Bongjun 0:e11e8793c3ce 317 #endif
Bongjun 0:e11e8793c3ce 318 }
Bongjun 0:e11e8793c3ce 319
Bongjun 0:e11e8793c3ce 320 void WIZnet_Chip::spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len)
Bongjun 0:e11e8793c3ce 321 {
Bongjun 0:e11e8793c3ce 322 cs = 0;
Bongjun 0:e11e8793c3ce 323 spi->write(addr >> 8);
Bongjun 0:e11e8793c3ce 324 spi->write(addr & 0xff);
Bongjun 0:e11e8793c3ce 325 spi->write(cb);
Bongjun 0:e11e8793c3ce 326 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 327 buf[i] = spi->write(0);
Bongjun 0:e11e8793c3ce 328 }
Bongjun 0:e11e8793c3ce 329 cs = 1;
Bongjun 0:e11e8793c3ce 330
Bongjun 0:e11e8793c3ce 331 #if DBG_SPI
Bongjun 0:e11e8793c3ce 332 debug("[SPI]R %04x(%02x %d)", addr, cb, len);
Bongjun 0:e11e8793c3ce 333 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 334 debug(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 335 if (i > 16) {
Bongjun 0:e11e8793c3ce 336 debug(" ...");
Bongjun 0:e11e8793c3ce 337 break;
Bongjun 0:e11e8793c3ce 338 }
Bongjun 0:e11e8793c3ce 339 }
Bongjun 0:e11e8793c3ce 340 debug("\r\n");
Bongjun 0:e11e8793c3ce 341 if ((addr&0xf0ff)==0x4026 || (addr&0xf0ff)==0x4003) {
Bongjun 0:e11e8793c3ce 342 wait_ms(200);
Bongjun 0:e11e8793c3ce 343 }
Bongjun 0:e11e8793c3ce 344 #endif
Bongjun 0:e11e8793c3ce 345 }
Bongjun 0:e11e8793c3ce 346
Bongjun 0:e11e8793c3ce 347 uint32_t str_to_ip(const char* str)
Bongjun 0:e11e8793c3ce 348 {
Bongjun 0:e11e8793c3ce 349 uint32_t ip = 0;
Bongjun 0:e11e8793c3ce 350 char* p = (char*)str;
Bongjun 0:e11e8793c3ce 351 for(int i = 0; i < 4; i++) {
Bongjun 0:e11e8793c3ce 352 ip |= atoi(p);
Bongjun 0:e11e8793c3ce 353 p = strchr(p, '.');
Bongjun 0:e11e8793c3ce 354 if (p == NULL) {
Bongjun 0:e11e8793c3ce 355 break;
Bongjun 0:e11e8793c3ce 356 }
Bongjun 0:e11e8793c3ce 357 ip <<= 8;
Bongjun 0:e11e8793c3ce 358 p++;
Bongjun 0:e11e8793c3ce 359 }
Bongjun 0:e11e8793c3ce 360 return ip;
Bongjun 0:e11e8793c3ce 361 }
Bongjun 0:e11e8793c3ce 362
Bongjun 0:e11e8793c3ce 363 void printfBytes(char* str, uint8_t* buf, int len)
Bongjun 0:e11e8793c3ce 364 {
Bongjun 0:e11e8793c3ce 365 printf("%s %d:", str, len);
Bongjun 0:e11e8793c3ce 366 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 367 printf(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 368 }
Bongjun 0:e11e8793c3ce 369 printf("\n");
Bongjun 0:e11e8793c3ce 370 }
Bongjun 0:e11e8793c3ce 371
Bongjun 0:e11e8793c3ce 372 void printHex(uint8_t* buf, int len)
Bongjun 0:e11e8793c3ce 373 {
Bongjun 0:e11e8793c3ce 374 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 375 if ((i%16) == 0) {
Bongjun 0:e11e8793c3ce 376 printf("%p", buf+i);
Bongjun 0:e11e8793c3ce 377 }
Bongjun 0:e11e8793c3ce 378 printf(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 379 if ((i%16) == 15) {
Bongjun 0:e11e8793c3ce 380 printf("\n");
Bongjun 0:e11e8793c3ce 381 }
Bongjun 0:e11e8793c3ce 382 }
Bongjun 0:e11e8793c3ce 383 printf("\n");
Bongjun 0:e11e8793c3ce 384 }
Bongjun 0:e11e8793c3ce 385
Bongjun 0:e11e8793c3ce 386 void debug_hex(uint8_t* buf, int len)
Bongjun 0:e11e8793c3ce 387 {
Bongjun 0:e11e8793c3ce 388 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 389 if ((i%16) == 0) {
Bongjun 0:e11e8793c3ce 390 debug("%p", buf+i);
Bongjun 0:e11e8793c3ce 391 }
Bongjun 0:e11e8793c3ce 392 debug(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 393 if ((i%16) == 15) {
Bongjun 0:e11e8793c3ce 394 debug("\n");
Bongjun 0:e11e8793c3ce 395 }
Bongjun 0:e11e8793c3ce 396 }
Bongjun 0:e11e8793c3ce 397 debug("\n");
Bongjun 0:e11e8793c3ce 398 }
Bongjun 0:e11e8793c3ce 399
Bongjun 0:e11e8793c3ce 400 #endif