WIZnet / W5500

Fork of W5500 by Raphael Kwon

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers w5500.c Source File

w5500.c

Go to the documentation of this file.
00001 //*****************************************************************************
00002 //
00003 //! \file w5500.c
00004 //! \brief W5500 HAL Interface.
00005 //! \version 1.0.0
00006 //! \date 2013/10/01
00007 //! \par  Revision history
00008 //!       <2013/10/01> 1st Release
00009 //! \author MidnightCow
00010 //! \copyright
00011 //!
00012 //! Copyright (c)  2013, WIZnet Co., LTD.
00013 //! All rights reserved.
00014 //! 
00015 //! Redistribution and use in source and binary forms, with or without 
00016 //! modification, are permitted provided that the following conditions 
00017 //! are met: 
00018 //! 
00019 //!     * Redistributions of source code must retain the above copyright 
00020 //! notice, this list of conditions and the following disclaimer. 
00021 //!     * Redistributions in binary form must reproduce the above copyright
00022 //! notice, this list of conditions and the following disclaimer in the
00023 //! documentation and/or other materials provided with the distribution. 
00024 //!     * Neither the name of the <ORGANIZATION> nor the names of its 
00025 //! contributors may be used to endorse or promote products derived 
00026 //! from this software without specific prior written permission. 
00027 //! 
00028 //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00029 //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
00030 //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00031 //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
00032 //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
00033 //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
00034 //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00035 //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
00036 //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
00037 //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
00038 //! THE POSSIBILITY OF SUCH DAMAGE.
00039 //
00040 //*****************************************************************************
00041 #include <stdio.h>
00042 #include "w5500.h"
00043 
00044 
00045 #define _W5500_SPI_VDM_OP_          0x00
00046 #define _W5500_SPI_FDM_OP_LEN1_     0x01
00047 #define _W5500_SPI_FDM_OP_LEN2_     0x02
00048 #define _W5500_SPI_FDM_OP_LEN4_     0x03
00049 
00050 ////////////////////////////////////////////////////
00051 
00052 uint8_t  WIZCHIP_READ(uint32_t AddrSel)
00053 {
00054    uint8_t ret;
00055 
00056    WIZCHIP_CRITICAL_ENTER();
00057    WIZCHIP.CS._select();
00058 
00059 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
00060 
00061    #if  ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
00062        AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
00063    #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
00064        AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_FDM_OP_LEN1_);
00065    #else
00066       #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
00067    #endif
00068 
00069    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00070    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00071    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00072    ret = WIZCHIP.IF.SPI._read_byte();
00073 
00074 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
00075 
00076    #if  (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
00077 
00078    #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
00079 
00080    #else
00081       #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
00082    #endif
00083 #else
00084    #error "Unknown _WIZCHIP_IO_MODE_ in W5000. !!!"   
00085 #endif
00086 
00087    WIZCHIP.CS._deselect();
00088    WIZCHIP_CRITICAL_EXIT();
00089    return ret;
00090 }
00091 
00092 void     WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
00093 {
00094     WIZCHIP_CRITICAL_ENTER();
00095    WIZCHIP.CS._select();
00096 
00097 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
00098 
00099    #if  ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
00100        AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
00101    #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
00102        AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_FDM_OP_LEN1_);
00103    #else
00104       #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
00105    #endif
00106 
00107    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00108    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00109    WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00110    WIZCHIP.IF.SPI._write_byte(wb);
00111 
00112 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
00113 
00114    #if  (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
00115 
00116    #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
00117 
00118    #else
00119       #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
00120    #endif
00121 #else
00122    #error "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!"
00123 #endif
00124 
00125    WIZCHIP.CS._deselect();
00126    WIZCHIP_CRITICAL_EXIT();
00127 }
00128          
00129 void     WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
00130 {
00131    uint16_t i = 0;
00132    uint16_t j = 0;
00133    WIZCHIP_CRITICAL_ENTER();
00134    WIZCHIP.CS._select();
00135 
00136 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
00137 
00138    #if  ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
00139       AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
00140       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00141       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00142       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00143       for(i = 0; i < len; i++)
00144         pBuf[i] = WIZCHIP.IF.SPI._read_byte();
00145    #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
00146       AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_FDM_OP_LEN4_);
00147       for(i = 0; i < len/4; i++)
00148       {
00149          WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00150          WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00151          WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00152          pBuf[i*4]   = WIZCHIP.IF.SPI._read_byte();
00153          pBuf[i*4+1] = WIZCHIP.IF.SPI._read_byte();
00154          pBuf[i*4+2] = WIZCHIP.IF.SPI._read_byte();            
00155          pBuf[i*4+3] = WIZCHIP.IF.SPI._read_byte();            
00156          //AddrSel += (4 << 8);    // offset address + 4
00157          AddrSel = WIZCHIP_OFFSET_INC(AddrSel,4);
00158       }
00159       len %= 4;      // for the rest data
00160       if(len)
00161       {
00162          AddrSel -= 1;  // change _W5500_SPI_FDM_OP_LEN4_ to _W5500_SPI_FDM_OP_LEN2_
00163          i *= 4;
00164          for(j = 0; j < len/2 ; j++)
00165          {
00166             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00167             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00168             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00169             pBuf[i]   = WIZCHIP.IF.SPI._read_byte();
00170             pBuf[i+1] = WIZCHIP.IF.SPI._read_byte();
00171             i += 2;
00172             //AddrSel += (2 << 8);    // offset address + 2
00173             AddrSel = WIZCHIP_OFFSET_INC(AddrSel,2);
00174          }
00175          len %= 2;
00176          if(len)
00177          {
00178             AddrSel -= 1;  // change _W5500_SPI_FDM_OP_LEN2_ to _W5500_SPI_FDM_OP_LEN1_
00179             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00180             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00181             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00182             pBuf[i]   = WIZCHIP.IF.SPI._read_byte();
00183          }      
00184       }
00185    #else
00186       #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
00187    #endif
00188 
00189 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
00190 
00191    #if  (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
00192 
00193    #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
00194 
00195    #else
00196       #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
00197    #endif
00198 #else
00199    #error "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"
00200 #endif
00201 
00202    WIZCHIP.CS._deselect();
00203    WIZCHIP_CRITICAL_EXIT();
00204 }
00205 
00206 void     WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
00207 {
00208    uint16_t i = 0;
00209    uint16_t j = 0;
00210    WIZCHIP_CRITICAL_ENTER();
00211    WIZCHIP.CS._select();
00212 
00213 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
00214 
00215    #if  ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
00216       AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
00217       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00218       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00219       WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00220       for(i = 0; i < len; i++)
00221          WIZCHIP.IF.SPI._write_byte(pBuf[i]);
00222    #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
00223       AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_FDM_OP_LEN4_);
00224       for(i = 0; i < len/4; i++)
00225       {
00226          WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00227          WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00228          WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00229          WIZCHIP.IF.SPI._write_byte(pBuf[i*4]  );
00230          WIZCHIP.IF.SPI._write_byte(pBuf[i*4+1]);
00231          WIZCHIP.IF.SPI._write_byte(pBuf[i*4+2]);            
00232          WIZCHIP.IF.SPI._write_byte(pBuf[i*4+3]);            
00233          //AddrSel += (4 << 8);    // offset address + 4
00234          AddrSel = WIZCHIP_OFFSET_INC(AddrSel,4);
00235       }
00236       len %= 4;      // for the rest data
00237       if(len)
00238       {
00239          AddrSel -= 1;  // change _W5500_SPI_FDM_OP_LEN4_ to _W5500_SPI_FDM_OP_LEN2_
00240          i *= 4;
00241          for(j = 0; j < len/2 ; j++)
00242          {
00243             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00244             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00245             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00246             WIZCHIP.IF.SPI._write_byte(pBuf[i]  );
00247             WIZCHIP.IF.SPI._write_byte(pBuf[i+1]);
00248             i += 2;
00249             //AddrSel += (2 << 8);    // offset address + 2
00250             AddrSel = WIZCHIP_OFFSET_INC(AddrSel, 2);
00251          }
00252          len %= 2;
00253          if(len)
00254          {
00255             AddrSel -= 1;  // change _W5500_SPI_FDM_OP_LEN2_ to _W5500_SPI_FDM_OP_LEN1_
00256             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
00257             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >>  8);
00258             WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >>  0);
00259             WIZCHIP.IF.SPI._write_byte(pBuf[i]);
00260          }      
00261       }
00262    #else
00263       #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
00264    #endif
00265 
00266 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
00267 
00268    #if  (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
00269 
00270    #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
00271 
00272    #else
00273       #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
00274    #endif
00275 #else
00276    #error "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"
00277 #endif
00278 
00279    WIZCHIP.CS._deselect();
00280    WIZCHIP_CRITICAL_EXIT();
00281 }
00282 
00283 
00284 uint16_t getSn_TX_FSR(uint8_t sn)
00285 {
00286    uint16_t val=0,val1=0;
00287    do
00288    {
00289       val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
00290       val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
00291       if (val1 != 0)
00292       {
00293         val = WIZCHIP_READ(Sn_TX_FSR(sn));
00294         val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
00295       }
00296    }while (val != val1);
00297    return val;
00298 }
00299 
00300 
00301 uint16_t getSn_RX_RSR(uint8_t sn)
00302 {
00303    uint16_t val=0,val1=0;
00304    do
00305    {
00306       val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
00307       val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
00308       if (val1 != 0)
00309       {
00310         val = WIZCHIP_READ(Sn_RX_RSR(sn));
00311         val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
00312       }
00313    }while (val != val1);
00314    return val;
00315 }
00316 
00317 void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
00318 {
00319    uint16_t ptr = 0;
00320    uint32_t addrsel = 0;
00321    if(len == 0)  return;
00322    ptr = getSn_TX_WR(sn);
00323    
00324    addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
00325    WIZCHIP_WRITE_BUF(addrsel,wizdata, len);
00326    
00327    ptr += len;
00328    setSn_TX_WR(sn,ptr);
00329 }
00330 
00331 void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
00332 {
00333    uint16_t ptr = 0;
00334    uint32_t addrsel = 0;
00335    
00336    if(len == 0) return;
00337    ptr = getSn_RX_RD(sn);
00338    addrsel = (ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
00339    
00340    WIZCHIP_READ_BUF(addrsel, wizdata, len);
00341    ptr += len;
00342    
00343    setSn_RX_RD(sn,ptr);
00344 }
00345 
00346 
00347 void wiz_recv_ignore(uint8_t sn, uint16_t len)
00348 {
00349    uint16_t ptr = 0;
00350    ptr = getSn_RX_RD(sn);
00351    ptr += len;
00352    setSn_RX_RD(sn,ptr);
00353 }