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 W5500 by
w5500.c
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 }
Generated on Wed Jul 13 2022 12:17:35 by
1.7.2
