Wiznet W5500 driver and TCP/UDP loopback

Dependencies:   mbed

Committer:
jbkim
Date:
Fri Dec 13 07:35:58 2013 +0000
Revision:
0:2513c6696bdc
Wiznet W5500 library and TCP/UDP loopback program for mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jbkim 0:2513c6696bdc 1 /* Wiznet W5500 Library
jbkim 0:2513c6696bdc 2 * Copyright (c) 2013, WIZnet Co., LTD.
jbkim 0:2513c6696bdc 3 *
jbkim 0:2513c6696bdc 4 * Licensed under the Apache License, Version 2.0 (the "License");
jbkim 0:2513c6696bdc 5 * you may not use this file except in compliance with the License.
jbkim 0:2513c6696bdc 6 * You may obtain a copy of the License at
jbkim 0:2513c6696bdc 7 *
jbkim 0:2513c6696bdc 8 * http://www.apache.org/licenses/LICENSE-2.0
jbkim 0:2513c6696bdc 9 *
jbkim 0:2513c6696bdc 10 * Unless required by applicable law or agreed to in writing, software
jbkim 0:2513c6696bdc 11 * distributed under the License is distributed on an "AS IS" BASIS,
jbkim 0:2513c6696bdc 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jbkim 0:2513c6696bdc 13 * See the License for the specific language governing permissions and
jbkim 0:2513c6696bdc 14 * limitations under the License.
jbkim 0:2513c6696bdc 15 */
jbkim 0:2513c6696bdc 16
jbkim 0:2513c6696bdc 17 #include <stdio.h>
jbkim 0:2513c6696bdc 18 #include "w5500.h"
jbkim 0:2513c6696bdc 19
jbkim 0:2513c6696bdc 20
jbkim 0:2513c6696bdc 21 ////////////////////////////////////////////////////
jbkim 0:2513c6696bdc 22
jbkim 0:2513c6696bdc 23 uint8_t WIZCHIP_READ(uint32_t AddrSel)
jbkim 0:2513c6696bdc 24 {
jbkim 0:2513c6696bdc 25 uint8_t ret;
jbkim 0:2513c6696bdc 26
jbkim 0:2513c6696bdc 27 WIZCHIP_CRITICAL_ENTER();
jbkim 0:2513c6696bdc 28 WIZCHIP.CS._select();
jbkim 0:2513c6696bdc 29
jbkim 0:2513c6696bdc 30 AddrSel |= (_W5500_SPI_READ_);
jbkim 0:2513c6696bdc 31
jbkim 0:2513c6696bdc 32 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
jbkim 0:2513c6696bdc 33 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
jbkim 0:2513c6696bdc 34 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
jbkim 0:2513c6696bdc 35 ret = WIZCHIP.IF.SPI._read_byte();
jbkim 0:2513c6696bdc 36
jbkim 0:2513c6696bdc 37 WIZCHIP.CS._deselect();
jbkim 0:2513c6696bdc 38 WIZCHIP_CRITICAL_EXIT();
jbkim 0:2513c6696bdc 39 return ret;
jbkim 0:2513c6696bdc 40 }
jbkim 0:2513c6696bdc 41
jbkim 0:2513c6696bdc 42 void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
jbkim 0:2513c6696bdc 43 {
jbkim 0:2513c6696bdc 44 WIZCHIP_CRITICAL_ENTER();
jbkim 0:2513c6696bdc 45 WIZCHIP.CS._select();
jbkim 0:2513c6696bdc 46
jbkim 0:2513c6696bdc 47 AddrSel |= (_W5500_SPI_WRITE_);
jbkim 0:2513c6696bdc 48
jbkim 0:2513c6696bdc 49 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
jbkim 0:2513c6696bdc 50 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
jbkim 0:2513c6696bdc 51 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
jbkim 0:2513c6696bdc 52 WIZCHIP.IF.SPI._write_byte(wb);
jbkim 0:2513c6696bdc 53
jbkim 0:2513c6696bdc 54 WIZCHIP.CS._deselect();
jbkim 0:2513c6696bdc 55 WIZCHIP_CRITICAL_EXIT();
jbkim 0:2513c6696bdc 56 }
jbkim 0:2513c6696bdc 57
jbkim 0:2513c6696bdc 58 void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
jbkim 0:2513c6696bdc 59 {
jbkim 0:2513c6696bdc 60 uint16_t i = 0;
jbkim 0:2513c6696bdc 61
jbkim 0:2513c6696bdc 62 WIZCHIP_CRITICAL_ENTER();
jbkim 0:2513c6696bdc 63 WIZCHIP.CS._select();
jbkim 0:2513c6696bdc 64
jbkim 0:2513c6696bdc 65 AddrSel |= (_W5500_SPI_READ_);
jbkim 0:2513c6696bdc 66 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
jbkim 0:2513c6696bdc 67 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
jbkim 0:2513c6696bdc 68 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
jbkim 0:2513c6696bdc 69
jbkim 0:2513c6696bdc 70 for(i = 0; i < len; i++)
jbkim 0:2513c6696bdc 71 pBuf[i] = WIZCHIP.IF.SPI._read_byte();
jbkim 0:2513c6696bdc 72
jbkim 0:2513c6696bdc 73 WIZCHIP.CS._deselect();
jbkim 0:2513c6696bdc 74 WIZCHIP_CRITICAL_EXIT();
jbkim 0:2513c6696bdc 75 }
jbkim 0:2513c6696bdc 76
jbkim 0:2513c6696bdc 77 void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
jbkim 0:2513c6696bdc 78 {
jbkim 0:2513c6696bdc 79 uint16_t i = 0;
jbkim 0:2513c6696bdc 80
jbkim 0:2513c6696bdc 81 WIZCHIP_CRITICAL_ENTER();
jbkim 0:2513c6696bdc 82 WIZCHIP.CS._select();
jbkim 0:2513c6696bdc 83
jbkim 0:2513c6696bdc 84 AddrSel |= (_W5500_SPI_WRITE_ );
jbkim 0:2513c6696bdc 85 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
jbkim 0:2513c6696bdc 86 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
jbkim 0:2513c6696bdc 87 WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
jbkim 0:2513c6696bdc 88
jbkim 0:2513c6696bdc 89 for(i = 0; i < len; i++)
jbkim 0:2513c6696bdc 90 WIZCHIP.IF.SPI._write_byte(pBuf[i]);
jbkim 0:2513c6696bdc 91
jbkim 0:2513c6696bdc 92 WIZCHIP.CS._deselect();
jbkim 0:2513c6696bdc 93 WIZCHIP_CRITICAL_EXIT();
jbkim 0:2513c6696bdc 94 }
jbkim 0:2513c6696bdc 95
jbkim 0:2513c6696bdc 96
jbkim 0:2513c6696bdc 97 uint16_t getSn_TX_FSR(uint8_t sn)
jbkim 0:2513c6696bdc 98 {
jbkim 0:2513c6696bdc 99 uint16_t val=0,val1=0;
jbkim 0:2513c6696bdc 100
jbkim 0:2513c6696bdc 101 do
jbkim 0:2513c6696bdc 102 {
jbkim 0:2513c6696bdc 103 val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
jbkim 0:2513c6696bdc 104 val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
jbkim 0:2513c6696bdc 105 if (val1 != 0)
jbkim 0:2513c6696bdc 106 {
jbkim 0:2513c6696bdc 107 val = WIZCHIP_READ(Sn_TX_FSR(sn));
jbkim 0:2513c6696bdc 108 val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
jbkim 0:2513c6696bdc 109 }
jbkim 0:2513c6696bdc 110 }while (val != val1);
jbkim 0:2513c6696bdc 111 return val;
jbkim 0:2513c6696bdc 112 }
jbkim 0:2513c6696bdc 113
jbkim 0:2513c6696bdc 114
jbkim 0:2513c6696bdc 115 uint16_t getSn_RX_RSR(uint8_t sn)
jbkim 0:2513c6696bdc 116 {
jbkim 0:2513c6696bdc 117 uint16_t val=0,val1=0;
jbkim 0:2513c6696bdc 118
jbkim 0:2513c6696bdc 119 do
jbkim 0:2513c6696bdc 120 {
jbkim 0:2513c6696bdc 121 val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
jbkim 0:2513c6696bdc 122 val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
jbkim 0:2513c6696bdc 123 if (val1 != 0)
jbkim 0:2513c6696bdc 124 {
jbkim 0:2513c6696bdc 125 val = WIZCHIP_READ(Sn_RX_RSR(sn));
jbkim 0:2513c6696bdc 126 val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
jbkim 0:2513c6696bdc 127 }
jbkim 0:2513c6696bdc 128 }while (val != val1);
jbkim 0:2513c6696bdc 129 return val;
jbkim 0:2513c6696bdc 130 }
jbkim 0:2513c6696bdc 131
jbkim 0:2513c6696bdc 132 void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
jbkim 0:2513c6696bdc 133 {
jbkim 0:2513c6696bdc 134 uint16_t ptr = 0;
jbkim 0:2513c6696bdc 135 uint32_t addrsel = 0;
jbkim 0:2513c6696bdc 136
jbkim 0:2513c6696bdc 137 if(len == 0) return;
jbkim 0:2513c6696bdc 138 ptr = getSn_TX_WR(sn);
jbkim 0:2513c6696bdc 139
jbkim 0:2513c6696bdc 140 addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
jbkim 0:2513c6696bdc 141 WIZCHIP_WRITE_BUF(addrsel,wizdata, len);
jbkim 0:2513c6696bdc 142
jbkim 0:2513c6696bdc 143 ptr += len;
jbkim 0:2513c6696bdc 144 setSn_TX_WR(sn,ptr);
jbkim 0:2513c6696bdc 145 }
jbkim 0:2513c6696bdc 146
jbkim 0:2513c6696bdc 147 void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
jbkim 0:2513c6696bdc 148 {
jbkim 0:2513c6696bdc 149 uint16_t ptr = 0;
jbkim 0:2513c6696bdc 150 uint32_t addrsel = 0;
jbkim 0:2513c6696bdc 151
jbkim 0:2513c6696bdc 152 if(len == 0) return;
jbkim 0:2513c6696bdc 153 ptr = getSn_RX_RD(sn);
jbkim 0:2513c6696bdc 154 addrsel = (ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
jbkim 0:2513c6696bdc 155
jbkim 0:2513c6696bdc 156 WIZCHIP_READ_BUF(addrsel, wizdata, len);
jbkim 0:2513c6696bdc 157 ptr += len;
jbkim 0:2513c6696bdc 158
jbkim 0:2513c6696bdc 159 setSn_RX_RD(sn,ptr);
jbkim 0:2513c6696bdc 160 }
jbkim 0:2513c6696bdc 161
jbkim 0:2513c6696bdc 162
jbkim 0:2513c6696bdc 163 void wiz_recv_ignore(uint8_t sn, uint16_t len)
jbkim 0:2513c6696bdc 164 {
jbkim 0:2513c6696bdc 165 uint16_t ptr = 0;
jbkim 0:2513c6696bdc 166
jbkim 0:2513c6696bdc 167 ptr = getSn_RX_RD(sn);
jbkim 0:2513c6696bdc 168 ptr += len;
jbkim 0:2513c6696bdc 169 setSn_RX_RD(sn,ptr);
jbkim 0:2513c6696bdc 170 }