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