This is WIZnet Ethernet Interface using Hardware TCP/IP chip, W5500, W5200 and W5100. One of them can be selected by enabling it in wiznet.h.
Dependents: Embedded_web EmailButton EmailButton HTTPClient_Weather ... more
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 00148 /* 00149 * Check if FIN received. 00150 * 00151 * @returns true if successful 00152 */ 00153 bool is_fin_received(int socket); 00154 00155 /* 00156 * Close a tcp connection 00157 * 00158 * @ returns true if successful 00159 */ 00160 bool close(int socket); 00161 00162 /* 00163 * @param str string to be sent 00164 * @param len string length 00165 */ 00166 int send(int socket, const char * str, int len); 00167 00168 int recv(int socket, char* buf, int len); 00169 00170 /* 00171 * Return true if the module is using dhcp 00172 * 00173 * @returns true if the module is using dhcp 00174 */ 00175 bool isDHCP() { 00176 return dhcp; 00177 } 00178 00179 bool gethostbyname(const char* host, uint32_t* ip); 00180 00181 static WIZnet_Chip * getInstance() { 00182 return inst; 00183 }; 00184 00185 int new_socket(); 00186 uint16_t new_port(); 00187 void scmd(int socket, Command cmd); 00188 00189 template<typename T> 00190 void sreg(int socket, uint16_t addr, T data) { 00191 reg_wr<T>(addr+0x100*socket, data); 00192 } 00193 00194 template<typename T> 00195 T sreg(int socket, uint16_t addr) { 00196 return reg_rd<T>(addr+0x100*socket); 00197 } 00198 00199 template<typename T> 00200 void reg_wr(uint16_t addr, T data) { 00201 uint8_t buf[sizeof(T)]; 00202 *reinterpret_cast<T*>(buf) = data; 00203 for(int i = 0; i < sizeof(buf)/2; i++) { // Little Endian to Big Endian 00204 uint8_t t = buf[i]; 00205 buf[i] = buf[sizeof(buf)-1-i]; 00206 buf[sizeof(buf)-1-i] = t; 00207 } 00208 spi_write(addr, buf, sizeof(buf)); 00209 } 00210 00211 template<typename T> 00212 T reg_rd(uint16_t addr) { 00213 uint8_t buf[sizeof(T)]; 00214 spi_read(addr, buf, sizeof(buf)); 00215 for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian 00216 uint8_t t = buf[i]; 00217 buf[i] = buf[sizeof(buf)-1-i]; 00218 buf[sizeof(buf)-1-i] = t; 00219 } 00220 return *reinterpret_cast<T*>(buf); 00221 } 00222 00223 void reg_rd_mac(uint16_t addr, uint8_t* data) { 00224 spi_read(addr, data, 6); 00225 } 00226 00227 void reg_wr_ip(uint16_t addr, const char* ip) { 00228 uint8_t buf[4]; 00229 char* p = (char*)ip; 00230 for(int i = 0; i < 4; i++) { 00231 buf[i] = atoi(p); 00232 p = strchr(p, '.'); 00233 if (p == NULL) { 00234 break; 00235 } 00236 p++; 00237 } 00238 spi_write(addr, buf, sizeof(buf)); 00239 } 00240 00241 void sreg_ip(int socket, uint16_t addr, const char* ip) { 00242 reg_wr_ip(addr+0x100*socket, ip); 00243 } 00244 00245 protected: 00246 uint8_t mac[6]; 00247 uint32_t ip; 00248 uint32_t netmask; 00249 uint32_t gateway; 00250 uint32_t dnsaddr; 00251 bool dhcp; 00252 00253 static WIZnet_Chip* inst; 00254 00255 void reg_wr_mac(uint16_t addr, uint8_t* data) { 00256 spi_write(addr, data, 6); 00257 } 00258 00259 void spi_write(uint16_t addr, const uint8_t *buf, uint16_t len); 00260 void spi_read(uint16_t addr, uint8_t *buf, uint16_t len); 00261 SPI* spi; 00262 DigitalOut cs; 00263 DigitalOut reset_pin; 00264 }; 00265 00266 extern uint32_t str_to_ip(const char* str); 00267 extern void printfBytes(char* str, uint8_t* buf, int len); 00268 extern void printHex(uint8_t* buf, int len); 00269 extern void debug_hex(uint8_t* buf, int len);
Generated on Wed Jul 13 2022 02:51:31 by 1.7.2