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 05:37:05 2014 +0000
Revision:
3:a5d99521e9cc
Parent:
2:e02950866c42
Child:
5:8aefaef88f79
fix some codes of reading Sn_RX_RSR, Sn_TX_FSR in W5500.cpp

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 if (socket < 0) {
Bongjun 0:e11e8793c3ce 173 return -1;
Bongjun 0:e11e8793c3ce 174 }
Bongjun 0:e11e8793c3ce 175 Timer t;
Bongjun 0:e11e8793c3ce 176 t.reset();
Bongjun 0:e11e8793c3ce 177 t.start();
Bongjun 0:e11e8793c3ce 178 while(1) {
Bongjun 3:a5d99521e9cc 179 //int size = sreg<uint16_t>(socket, Sn_RX_RSR);
Bongjun 3:a5d99521e9cc 180 int size, size2;
Bongjun 3:a5d99521e9cc 181 // during the reading Sn_RX_RSR, it has the possible change of this register.
Bongjun 3:a5d99521e9cc 182 // so read twice and get same value then use size information.
Bongjun 3:a5d99521e9cc 183 do {
Bongjun 3:a5d99521e9cc 184 size = sreg<uint16_t>(socket, Sn_RX_RSR);
Bongjun 3:a5d99521e9cc 185 size2 = sreg<uint16_t>(socket, Sn_RX_RSR);
Bongjun 3:a5d99521e9cc 186 } while (size != size2);
Bongjun 0:e11e8793c3ce 187
Bongjun 0:e11e8793c3ce 188 if (size > req_size) {
Bongjun 0:e11e8793c3ce 189 return size;
Bongjun 0:e11e8793c3ce 190 }
Bongjun 0:e11e8793c3ce 191 if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {
Bongjun 0:e11e8793c3ce 192 break;
Bongjun 0:e11e8793c3ce 193 }
Bongjun 0:e11e8793c3ce 194 }
Bongjun 0:e11e8793c3ce 195 return -1;
Bongjun 0:e11e8793c3ce 196 }
Bongjun 0:e11e8793c3ce 197
Bongjun 0:e11e8793c3ce 198 int WIZnet_Chip::wait_writeable(int socket, int wait_time_ms, int req_size)
Bongjun 0:e11e8793c3ce 199 {
Bongjun 0:e11e8793c3ce 200 if (socket < 0) {
Bongjun 0:e11e8793c3ce 201 return -1;
Bongjun 0:e11e8793c3ce 202 }
Bongjun 0:e11e8793c3ce 203 Timer t;
Bongjun 0:e11e8793c3ce 204 t.reset();
Bongjun 0:e11e8793c3ce 205 t.start();
Bongjun 0:e11e8793c3ce 206 while(1) {
Bongjun 0:e11e8793c3ce 207 //int size = sreg<uint16_t>(socket, Sn_TX_FSR);
Bongjun 3:a5d99521e9cc 208 int size, size2;
Bongjun 0:e11e8793c3ce 209 // during the reading Sn_TX_FSR, it has the possible change of this register.
Bongjun 0:e11e8793c3ce 210 // so read twice and get same value then use size information.
Bongjun 0:e11e8793c3ce 211 do {
Bongjun 0:e11e8793c3ce 212 size = sreg<uint16_t>(socket, Sn_TX_FSR);
Bongjun 0:e11e8793c3ce 213 size2 = sreg<uint16_t>(socket, Sn_TX_FSR);
Bongjun 0:e11e8793c3ce 214 } while (size != size2);
Bongjun 0:e11e8793c3ce 215 if (size > req_size) {
Bongjun 0:e11e8793c3ce 216 return size;
Bongjun 0:e11e8793c3ce 217 }
Bongjun 0:e11e8793c3ce 218 if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {
Bongjun 0:e11e8793c3ce 219 break;
Bongjun 0:e11e8793c3ce 220 }
Bongjun 0:e11e8793c3ce 221 }
Bongjun 0:e11e8793c3ce 222 return -1;
Bongjun 0:e11e8793c3ce 223 }
Bongjun 0:e11e8793c3ce 224
Bongjun 0:e11e8793c3ce 225 int WIZnet_Chip::send(int socket, const char * str, int len)
Bongjun 0:e11e8793c3ce 226 {
Bongjun 0:e11e8793c3ce 227 if (socket < 0) {
Bongjun 0:e11e8793c3ce 228 return -1;
Bongjun 0:e11e8793c3ce 229 }
Bongjun 0:e11e8793c3ce 230 uint16_t ptr = sreg<uint16_t>(socket, Sn_TX_WR);
Bongjun 0:e11e8793c3ce 231 uint8_t cntl_byte = (0x14 + (socket << 5));
Bongjun 0:e11e8793c3ce 232 spi_write(ptr, cntl_byte, (uint8_t*)str, len);
Bongjun 0:e11e8793c3ce 233 sreg<uint16_t>(socket, Sn_TX_WR, ptr + len);
Bongjun 0:e11e8793c3ce 234 scmd(socket, SEND);
Bongjun 0:e11e8793c3ce 235 uint8_t tmp_Sn_IR;
Bongjun 0:e11e8793c3ce 236 while (( (tmp_Sn_IR = sreg<uint8_t>(socket, Sn_IR)) & INT_SEND_OK) != INT_SEND_OK) {
Bongjun 0:e11e8793c3ce 237 // @Jul.10, 2014 fix contant name, and udp sendto function.
Bongjun 0:e11e8793c3ce 238 switch (sreg<uint8_t>(socket, Sn_SR)) {
Bongjun 0:e11e8793c3ce 239 case SOCK_CLOSED :
Bongjun 0:e11e8793c3ce 240 close(socket);
Bongjun 0:e11e8793c3ce 241 return 0;
Bongjun 0:e11e8793c3ce 242 //break;
Bongjun 0:e11e8793c3ce 243 case SOCK_UDP :
Bongjun 0:e11e8793c3ce 244 // ARP timeout is possible.
Bongjun 0:e11e8793c3ce 245 if ((tmp_Sn_IR & INT_TIMEOUT) == INT_TIMEOUT) {
Bongjun 0:e11e8793c3ce 246 sreg<uint8_t>(socket, Sn_IR, INT_TIMEOUT);
Bongjun 0:e11e8793c3ce 247 return 0;
Bongjun 0:e11e8793c3ce 248 }
Bongjun 0:e11e8793c3ce 249 break;
Bongjun 0:e11e8793c3ce 250 default :
Bongjun 0:e11e8793c3ce 251 break;
Bongjun 0:e11e8793c3ce 252 }
Bongjun 0:e11e8793c3ce 253 }
Bongjun 0:e11e8793c3ce 254 sreg<uint8_t>(socket, Sn_IR, INT_SEND_OK);
Bongjun 0:e11e8793c3ce 255
Bongjun 0:e11e8793c3ce 256 return len;
Bongjun 0:e11e8793c3ce 257 }
Bongjun 0:e11e8793c3ce 258
Bongjun 0:e11e8793c3ce 259 int WIZnet_Chip::recv(int socket, char* buf, int len)
Bongjun 0:e11e8793c3ce 260 {
Bongjun 0:e11e8793c3ce 261 if (socket < 0) {
Bongjun 0:e11e8793c3ce 262 return -1;
Bongjun 0:e11e8793c3ce 263 }
Bongjun 0:e11e8793c3ce 264 uint16_t ptr = sreg<uint16_t>(socket, Sn_RX_RD);
Bongjun 0:e11e8793c3ce 265 uint8_t cntl_byte = (0x18 + (socket << 5));
Bongjun 0:e11e8793c3ce 266 spi_read(ptr, cntl_byte, (uint8_t*)buf, len);
Bongjun 0:e11e8793c3ce 267 sreg<uint16_t>(socket, Sn_RX_RD, ptr + len);
Bongjun 0:e11e8793c3ce 268 scmd(socket, RECV);
Bongjun 0:e11e8793c3ce 269 return len;
Bongjun 0:e11e8793c3ce 270 }
Bongjun 0:e11e8793c3ce 271
Bongjun 0:e11e8793c3ce 272 int WIZnet_Chip::new_socket()
Bongjun 0:e11e8793c3ce 273 {
Bongjun 0:e11e8793c3ce 274 for(int s = 0; s < MAX_SOCK_NUM; s++) {
Bongjun 0:e11e8793c3ce 275 if (sreg<uint8_t>(s, Sn_SR) == SOCK_CLOSED) {
Bongjun 0:e11e8793c3ce 276 return s;
Bongjun 0:e11e8793c3ce 277 }
Bongjun 0:e11e8793c3ce 278 }
Bongjun 0:e11e8793c3ce 279 return -1;
Bongjun 0:e11e8793c3ce 280 }
Bongjun 0:e11e8793c3ce 281
Bongjun 0:e11e8793c3ce 282 uint16_t WIZnet_Chip::new_port()
Bongjun 0:e11e8793c3ce 283 {
Bongjun 0:e11e8793c3ce 284 uint16_t port = rand();
Bongjun 0:e11e8793c3ce 285 port |= 49152;
Bongjun 0:e11e8793c3ce 286 return port;
Bongjun 0:e11e8793c3ce 287 }
Bongjun 0:e11e8793c3ce 288
Bongjun 0:e11e8793c3ce 289 void WIZnet_Chip::scmd(int socket, Command cmd)
Bongjun 0:e11e8793c3ce 290 {
Bongjun 0:e11e8793c3ce 291 sreg<uint8_t>(socket, Sn_CR, cmd);
Bongjun 0:e11e8793c3ce 292 while(sreg<uint8_t>(socket, Sn_CR));
Bongjun 0:e11e8793c3ce 293 }
Bongjun 0:e11e8793c3ce 294
Bongjun 0:e11e8793c3ce 295 void WIZnet_Chip::spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len)
Bongjun 0:e11e8793c3ce 296 {
Bongjun 0:e11e8793c3ce 297 cs = 0;
Bongjun 0:e11e8793c3ce 298 spi->write(addr >> 8);
Bongjun 0:e11e8793c3ce 299 spi->write(addr & 0xff);
Bongjun 0:e11e8793c3ce 300 spi->write(cb);
Bongjun 0:e11e8793c3ce 301 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 302 spi->write(buf[i]);
Bongjun 0:e11e8793c3ce 303 }
Bongjun 0:e11e8793c3ce 304 cs = 1;
Bongjun 0:e11e8793c3ce 305
Bongjun 0:e11e8793c3ce 306 #if DBG_SPI
Bongjun 0:e11e8793c3ce 307 debug("[SPI]W %04x(%02x %d)", addr, cb, len);
Bongjun 0:e11e8793c3ce 308 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 309 debug(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 310 if (i > 16) {
Bongjun 0:e11e8793c3ce 311 debug(" ...");
Bongjun 0:e11e8793c3ce 312 break;
Bongjun 0:e11e8793c3ce 313 }
Bongjun 0:e11e8793c3ce 314 }
Bongjun 0:e11e8793c3ce 315 debug("\r\n");
Bongjun 0:e11e8793c3ce 316 #endif
Bongjun 0:e11e8793c3ce 317 }
Bongjun 0:e11e8793c3ce 318
Bongjun 0:e11e8793c3ce 319 void WIZnet_Chip::spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len)
Bongjun 0:e11e8793c3ce 320 {
Bongjun 0:e11e8793c3ce 321 cs = 0;
Bongjun 0:e11e8793c3ce 322 spi->write(addr >> 8);
Bongjun 0:e11e8793c3ce 323 spi->write(addr & 0xff);
Bongjun 0:e11e8793c3ce 324 spi->write(cb);
Bongjun 0:e11e8793c3ce 325 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 326 buf[i] = spi->write(0);
Bongjun 0:e11e8793c3ce 327 }
Bongjun 0:e11e8793c3ce 328 cs = 1;
Bongjun 0:e11e8793c3ce 329
Bongjun 0:e11e8793c3ce 330 #if DBG_SPI
Bongjun 0:e11e8793c3ce 331 debug("[SPI]R %04x(%02x %d)", addr, cb, len);
Bongjun 0:e11e8793c3ce 332 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 333 debug(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 334 if (i > 16) {
Bongjun 0:e11e8793c3ce 335 debug(" ...");
Bongjun 0:e11e8793c3ce 336 break;
Bongjun 0:e11e8793c3ce 337 }
Bongjun 0:e11e8793c3ce 338 }
Bongjun 0:e11e8793c3ce 339 debug("\r\n");
Bongjun 0:e11e8793c3ce 340 if ((addr&0xf0ff)==0x4026 || (addr&0xf0ff)==0x4003) {
Bongjun 0:e11e8793c3ce 341 wait_ms(200);
Bongjun 0:e11e8793c3ce 342 }
Bongjun 0:e11e8793c3ce 343 #endif
Bongjun 0:e11e8793c3ce 344 }
Bongjun 0:e11e8793c3ce 345
Bongjun 0:e11e8793c3ce 346 uint32_t str_to_ip(const char* str)
Bongjun 0:e11e8793c3ce 347 {
Bongjun 0:e11e8793c3ce 348 uint32_t ip = 0;
Bongjun 0:e11e8793c3ce 349 char* p = (char*)str;
Bongjun 0:e11e8793c3ce 350 for(int i = 0; i < 4; i++) {
Bongjun 0:e11e8793c3ce 351 ip |= atoi(p);
Bongjun 0:e11e8793c3ce 352 p = strchr(p, '.');
Bongjun 0:e11e8793c3ce 353 if (p == NULL) {
Bongjun 0:e11e8793c3ce 354 break;
Bongjun 0:e11e8793c3ce 355 }
Bongjun 0:e11e8793c3ce 356 ip <<= 8;
Bongjun 0:e11e8793c3ce 357 p++;
Bongjun 0:e11e8793c3ce 358 }
Bongjun 0:e11e8793c3ce 359 return ip;
Bongjun 0:e11e8793c3ce 360 }
Bongjun 0:e11e8793c3ce 361
Bongjun 0:e11e8793c3ce 362 void printfBytes(char* str, uint8_t* buf, int len)
Bongjun 0:e11e8793c3ce 363 {
Bongjun 0:e11e8793c3ce 364 printf("%s %d:", str, len);
Bongjun 0:e11e8793c3ce 365 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 366 printf(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 367 }
Bongjun 0:e11e8793c3ce 368 printf("\n");
Bongjun 0:e11e8793c3ce 369 }
Bongjun 0:e11e8793c3ce 370
Bongjun 0:e11e8793c3ce 371 void printHex(uint8_t* buf, int len)
Bongjun 0:e11e8793c3ce 372 {
Bongjun 0:e11e8793c3ce 373 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 374 if ((i%16) == 0) {
Bongjun 0:e11e8793c3ce 375 printf("%p", buf+i);
Bongjun 0:e11e8793c3ce 376 }
Bongjun 0:e11e8793c3ce 377 printf(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 378 if ((i%16) == 15) {
Bongjun 0:e11e8793c3ce 379 printf("\n");
Bongjun 0:e11e8793c3ce 380 }
Bongjun 0:e11e8793c3ce 381 }
Bongjun 0:e11e8793c3ce 382 printf("\n");
Bongjun 0:e11e8793c3ce 383 }
Bongjun 0:e11e8793c3ce 384
Bongjun 0:e11e8793c3ce 385 void debug_hex(uint8_t* buf, int len)
Bongjun 0:e11e8793c3ce 386 {
Bongjun 0:e11e8793c3ce 387 for(int i = 0; i < len; i++) {
Bongjun 0:e11e8793c3ce 388 if ((i%16) == 0) {
Bongjun 0:e11e8793c3ce 389 debug("%p", buf+i);
Bongjun 0:e11e8793c3ce 390 }
Bongjun 0:e11e8793c3ce 391 debug(" %02x", buf[i]);
Bongjun 0:e11e8793c3ce 392 if ((i%16) == 15) {
Bongjun 0:e11e8793c3ce 393 debug("\n");
Bongjun 0:e11e8793c3ce 394 }
Bongjun 0:e11e8793c3ce 395 }
Bongjun 0:e11e8793c3ce 396 debug("\n");
Bongjun 0:e11e8793c3ce 397 }
Bongjun 0:e11e8793c3ce 398
Bongjun 0:e11e8793c3ce 399 #endif