Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of WIZnet_Library by
W5100.h
00001 /* Copyright (C) 2012 mbed.org, MIT License 00002 * 00003 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software 00004 * and associated documentation files (the "Software"), to deal in the Software without restriction, 00005 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 00006 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 00007 * furnished to do so, subject to the following conditions: 00008 * 00009 * The above copyright notice and this permission notice shall be included in all copies or 00010 * substantial portions of the Software. 00011 * 00012 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 00013 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00014 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 00015 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00016 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00017 * 00018 */ 00019 00020 #pragma once 00021 00022 #include "mbed.h" 00023 #include "mbed_debug.h" 00024 00025 #define TEST_ASSERT(A) while(!(A)){debug("\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; 00026 00027 #define DEFAULT_WAIT_RESP_TIMEOUT 500 00028 00029 enum Protocol { 00030 CLOSED = 0, 00031 TCP = 1, 00032 UDP = 2, 00033 }; 00034 00035 enum Command { 00036 OPEN = 0x01, 00037 LISTEN = 0x02, 00038 CONNECT = 0x04, 00039 DISCON = 0x08, 00040 CLOSE = 0x10, 00041 SEND = 0x20, 00042 SEND_MAC = 0x21, 00043 SEND_KEEP = 0x22, 00044 RECV = 0x40, 00045 00046 }; 00047 00048 enum Interrupt { 00049 INT_CON = 0x01, 00050 INT_DISCON = 0x02, 00051 INT_RECV = 0x04, 00052 INT_TIMEOUT = 0x08, 00053 INT_SEND_OK = 0x10, 00054 }; 00055 00056 enum Status { 00057 SOCK_CLOSED = 0x00, 00058 SOCK_INIT = 0x13, 00059 SOCK_LISTEN = 0x14, 00060 SOCK_ESTABLISHED = 0x17, 00061 SOCK_CLOSE_WAIT = 0x1c, 00062 SOCK_UDP = 0x22, 00063 }; 00064 00065 #define MAX_SOCK_NUM 4 00066 00067 #define MR 0x0000 00068 #define GAR 0x0001 00069 #define SUBR 0x0005 00070 #define SHAR 0x0009 00071 #define SIPR 0x000f 00072 00073 // W5100 socket 00074 #define Sn_MR 0x0400 00075 #define Sn_CR 0x0401 00076 #define Sn_IR 0x0402 00077 #define Sn_SR 0x0403 00078 #define Sn_PORT 0x0404 00079 #define Sn_DIPR 0x040c 00080 #define Sn_DPORT 0x0410 00081 //#define Sn_RXBUF_SIZE 0x401e 00082 //#define Sn_TXBUF_SIZE 0x401f 00083 #define Sn_TX_FSR 0x0420 00084 #define Sn_TX_WR 0x0424 00085 #define Sn_RX_RSR 0x0426 00086 #define Sn_RX_RD 0x0428 00087 00088 class WIZnet_Chip { 00089 public: 00090 /* 00091 * Constructor 00092 * 00093 * @param spi spi class 00094 * @param cs cs of the W5200 00095 * @param reset reset pin of the W5200 00096 */ 00097 WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset); 00098 WIZnet_Chip(SPI* spi, PinName cs, PinName reset); 00099 00100 /* 00101 * Connect the W5200 module to the ssid contained in the constructor. 00102 * 00103 * @return true if connected, false otherwise 00104 */ 00105 bool setip(); 00106 00107 /* 00108 * Disconnect the W5200 module from the access point 00109 * 00110 * @ returns true if successful 00111 */ 00112 bool disconnect(); 00113 00114 /* 00115 * Open a tcp connection with the specified host on the specified port 00116 * 00117 * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established) 00118 * @param port port 00119 * @ returns true if successful 00120 */ 00121 bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000); 00122 00123 /* 00124 * Set the protocol (UDP or TCP) 00125 * 00126 * @param p protocol 00127 * @ returns true if successful 00128 */ 00129 bool setProtocol(int socket, Protocol p); 00130 00131 /* 00132 * Reset the W5100 module 00133 */ 00134 void reset(); 00135 00136 00137 int wait_readable(int socket, int wait_time_ms, int req_size = 0); 00138 00139 int wait_writeable(int socket, int wait_time_ms, int req_size = 0); 00140 00141 /* 00142 * Check if a tcp link is active 00143 * 00144 * @returns true if successful 00145 */ 00146 bool is_connected(int socket); 00147 bool is_fin_received(int socket); 00148 /* 00149 * Close a tcp connection 00150 * 00151 * @ returns true if successful 00152 */ 00153 bool close(int socket); 00154 00155 /* 00156 * @param str string to be sent 00157 * @param len string length 00158 */ 00159 int send(int socket, const char * str, int len); 00160 00161 int recv(int socket, char* buf, int len); 00162 00163 /* 00164 * Return true if the module is using dhcp 00165 * 00166 * @returns true if the module is using dhcp 00167 */ 00168 bool isDHCP() { 00169 return dhcp; 00170 } 00171 00172 bool gethostbyname(const char* host, uint32_t* ip); 00173 00174 static WIZnet_Chip * getInstance() { 00175 return inst; 00176 }; 00177 00178 int new_socket(); 00179 uint16_t new_port(); 00180 void scmd(int socket, Command cmd); 00181 00182 template<typename T> 00183 void sreg(int socket, uint16_t addr, T data) { 00184 reg_wr<T>(addr+0x100*socket, data); 00185 } 00186 00187 template<typename T> 00188 T sreg(int socket, uint16_t addr) { 00189 return reg_rd<T>(addr+0x100*socket); 00190 } 00191 00192 template<typename T> 00193 void reg_wr(uint16_t addr, T data) { 00194 uint8_t buf[sizeof(T)]; 00195 *reinterpret_cast<T*>(buf) = data; 00196 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian 00197 uint8_t t = buf[i]; 00198 buf[i] = buf[sizeof(buf)-1-i]; 00199 buf[sizeof(buf)-1-i] = t; 00200 } 00201 spi_write(addr, buf, sizeof(buf)); 00202 } 00203 00204 template<typename T> 00205 T reg_rd(uint16_t addr) { 00206 uint8_t buf[sizeof(T)]; 00207 spi_read(addr, buf, sizeof(buf)); 00208 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian 00209 uint8_t t = buf[i]; 00210 buf[i] = buf[sizeof(buf)-1-i]; 00211 buf[sizeof(buf)-1-i] = t; 00212 } 00213 return *reinterpret_cast<T*>(buf); 00214 } 00215 00216 void reg_rd_mac(uint16_t addr, uint8_t* data) { 00217 spi_read(addr, data, 6); 00218 } 00219 00220 void reg_wr_ip(uint16_t addr, const char* ip) { 00221 uint8_t buf[4]; 00222 char* p = (char*)ip; 00223 for(int i = 0; i < 4; i++) { 00224 buf[i] = atoi(p); 00225 p = strchr(p, '.'); 00226 if (p == NULL) { 00227 break; 00228 } 00229 p++; 00230 } 00231 spi_write(addr, buf, sizeof(buf)); 00232 } 00233 00234 void sreg_ip(int socket, uint16_t addr, const char* ip) { 00235 reg_wr_ip(addr+0x100*socket, ip); 00236 } 00237 00238 protected: 00239 uint8_t mac[6]; 00240 uint32_t ip; 00241 uint32_t netmask; 00242 uint32_t gateway; 00243 uint32_t dnsaddr; 00244 bool dhcp; 00245 00246 static WIZnet_Chip* inst; 00247 00248 void reg_wr_mac(uint16_t addr, uint8_t* data) { 00249 spi_write(addr, data, 6); 00250 } 00251 00252 void spi_write(uint16_t addr, const uint8_t *buf, uint16_t len); 00253 void spi_read(uint16_t addr, uint8_t *buf, uint16_t len); 00254 SPI* spi; 00255 DigitalOut cs; 00256 DigitalOut reset_pin; 00257 }; 00258 00259 extern uint32_t str_to_ip(const char* str); 00260 extern void printfBytes(char* str, uint8_t* buf, int len); 00261 extern void printHex(uint8_t* buf, int len); 00262 extern void debug_hex(uint8_t* buf, int len);
Generated on Thu Jul 14 2022 08:03:44 by
