Jinbuhm Kim
/
W5500_Driver
Wiznet W5500 driver and TCP/UDP loopback
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Jul 12 2022 18:48:21 by 1.7.2