Wiznet W5500 driver and TCP/UDP loopback

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers w5500.c Source File

w5500.c

00001 /* Wiznet W5500 Library
00002  * Copyright (c) 2013, WIZnet Co., LTD.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *     http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00017 #include <stdio.h>
00018 #include "w5500.h"
00019 
00020 
00021 ////////////////////////////////////////////////////
00022 
00023 uint8_t  WIZCHIP_READ(uint32_t AddrSel)
00024 {
00025    uint8_t ret;
00026 
00027    WIZCHIP_CRITICAL_ENTER();
00028    WIZCHIP.CS._select();
00029 
00030    AddrSel |= (_W5500_SPI_READ_);
00031 
00032    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00033    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00034    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00035    ret = WIZCHIP.IF.SPI._read_byte();
00036 
00037    WIZCHIP.CS._deselect();
00038    WIZCHIP_CRITICAL_EXIT();
00039    return ret;
00040 }
00041 
00042 void     WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
00043 {
00044     WIZCHIP_CRITICAL_ENTER();
00045    WIZCHIP.CS._select();
00046 
00047    AddrSel |= (_W5500_SPI_WRITE_);
00048 
00049    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00050    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00051    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00052    WIZCHIP.IF.SPI._write_byte(wb);
00053 
00054    WIZCHIP.CS._deselect();
00055    WIZCHIP_CRITICAL_EXIT();
00056 }
00057          
00058 void     WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
00059 {
00060    uint16_t i = 0;
00061    
00062    WIZCHIP_CRITICAL_ENTER();
00063    WIZCHIP.CS._select();
00064 
00065     AddrSel |= (_W5500_SPI_READ_);
00066     WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00067     WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00068     WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00069 
00070     for(i = 0; i < len; i++)
00071             pBuf[i] = WIZCHIP.IF.SPI._read_byte();
00072   
00073    WIZCHIP.CS._deselect();
00074    WIZCHIP_CRITICAL_EXIT();
00075 }
00076 
00077 void     WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
00078 {
00079    uint16_t i = 0;
00080    
00081    WIZCHIP_CRITICAL_ENTER();
00082    WIZCHIP.CS._select();
00083 
00084       AddrSel |= (_W5500_SPI_WRITE_ );
00085       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00086       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00087       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00088 
00089       for(i = 0; i < len; i++)
00090              WIZCHIP.IF.SPI._write_byte(pBuf[i]);
00091 
00092    WIZCHIP.CS._deselect();
00093    WIZCHIP_CRITICAL_EXIT();
00094 }
00095 
00096 
00097 uint16_t getSn_TX_FSR(uint8_t sn)
00098 {
00099    uint16_t val=0,val1=0;
00100    
00101    do
00102    {
00103       val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
00104       val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
00105       if (val1 != 0)
00106       {
00107         val = WIZCHIP_READ(Sn_TX_FSR(sn));
00108         val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
00109       }
00110    }while (val != val1);
00111    return val;
00112 }
00113 
00114 
00115 uint16_t getSn_RX_RSR(uint8_t sn)
00116 {
00117    uint16_t val=0,val1=0;
00118    
00119    do
00120    {
00121       val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
00122       val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
00123       if (val1 != 0)
00124       {
00125         val = WIZCHIP_READ(Sn_RX_RSR(sn));
00126         val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
00127       }
00128    }while (val != val1);
00129    return val;
00130 }
00131 
00132 void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
00133 {
00134    uint16_t ptr = 0;
00135    uint32_t addrsel = 0;
00136    
00137    if(len == 0)  return;
00138    ptr = getSn_TX_WR(sn);
00139    
00140    addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
00141    WIZCHIP_WRITE_BUF(addrsel,wizdata, len);
00142    
00143    ptr += len;
00144    setSn_TX_WR(sn,ptr);
00145 }
00146 
00147 void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
00148 {
00149    uint16_t ptr = 0;
00150    uint32_t addrsel = 0;
00151    
00152    if(len == 0) return;
00153    ptr = getSn_RX_RD(sn);
00154    addrsel = (ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
00155    
00156    WIZCHIP_READ_BUF(addrsel, wizdata, len);
00157    ptr += len;
00158    
00159    setSn_RX_RD(sn,ptr);
00160 }
00161 
00162 
00163 void wiz_recv_ignore(uint8_t sn, uint16_t len)
00164 {
00165    uint16_t ptr = 0;
00166    
00167    ptr = getSn_RX_RD(sn);
00168    ptr += len;
00169    setSn_RX_RD(sn,ptr);
00170 }