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:
Mon Sep 29 05:03:41 2014 +0000
Revision:
7:da52bf0e0e5d
Parent:
5:8aefaef88f79
Child:
10:713b6d2aaefb
Added Serial interface for debugging

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