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:
embeddist
Date:
Tue Apr 28 13:52:23 2015 +0000
Revision:
11:5499fa2d8898
Parent:
10:713b6d2aaefb
Remove the setting of tx/rx buffer in SWReset

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