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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers W5100.h Source File

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);