Socket APIs
w5500.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
48 //
49 //*****************************************************************************
50 //#include <stdio.h>
51 #include "w5500.h"
52 
53 
54 #define _W5500_SPI_VDM_OP_ 0x00
55 #define _W5500_SPI_FDM_OP_LEN1_ 0x01
56 #define _W5500_SPI_FDM_OP_LEN2_ 0x02
57 #define _W5500_SPI_FDM_OP_LEN4_ 0x03
58 
60 
61 uint8_t WIZCHIP_READ(uint32_t AddrSel)
62 {
63  uint8_t ret;
64 
66  WIZCHIP.CS._select();
67 
68 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
69 
70  #if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
71  AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
72  #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
74  #else
75  #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
76  #endif
77 
78  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
79  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
80  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
81  ret = WIZCHIP.IF.SPI._read_byte();
82 
83 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
84 
85  #if (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
86 
87  #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
88 
89  #else
90  #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
91  #endif
92 #else
93  #error "Unknown _WIZCHIP_IO_MODE_ in W5000. !!!"
94 #endif
95 
98  return ret;
99 }
100 
101 void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
102 {
104  WIZCHIP.CS._select();
105 
106 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
107 
108  #if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
109  AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
110  #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
112  #else
113  #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
114  #endif
115 
116  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
117  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
118  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
120 
121 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
122 
123  #if (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
124 
125  #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
126 
127  #else
128  #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
129  #endif
130 #else
131  #error "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!"
132 #endif
133 
134  WIZCHIP.CS._deselect();
136 }
137 
138 void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
139 {
140  uint16_t i = 0;
141  uint16_t j = 0;
143  WIZCHIP.CS._select();
144 
145 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
146 
147  #if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
148  AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_VDM_OP_);
149  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
150  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
151  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
152  for(i = 0; i < len; i++,j)
153  pBuf[i] = WIZCHIP.IF.SPI._read_byte();
154  #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
156  for(i = 0; i < len/4; i++, j)
157  {
158  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
159  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
160  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
161  pBuf[i*4] = WIZCHIP.IF.SPI._read_byte();
162  pBuf[i*4+1] = WIZCHIP.IF.SPI._read_byte();
163  pBuf[i*4+2] = WIZCHIP.IF.SPI._read_byte();
164  pBuf[i*4+3] = WIZCHIP.IF.SPI._read_byte();
165  AddrSel = WIZCHIP_OFFSET_INC(AddrSel,4);
166  }
167  len %= 4; // for the rest data
168  // M20131220 : remove for loop
169  i *= 4;
170  if(len >= 2)
171  {
172  AddrSel -= 1; // change _W5500_SPI_FDM_OP_LEN4_ to _W5500_SPI_FDM_OP_LEN2_
173 
174  //for(j = 0; j < len/2 ; j++)
175  {
176  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
177  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
178  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
179  pBuf[i] = WIZCHIP.IF.SPI._read_byte();
180  pBuf[i+1] = WIZCHIP.IF.SPI._read_byte();
181  i += 2;
182  AddrSel = WIZCHIP_OFFSET_INC(AddrSel,2);
183  }
184  }
185  len %= 2;
186  if(len)
187  {
188  AddrSel -= 1; // change _W5500_SPI_FDM_OP_LEN2_ to _W5500_SPI_FDM_OP_LEN1_
189  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
190  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
191  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
192  pBuf[i] = WIZCHIP.IF.SPI._read_byte();
193  }
194  #else
195  #error "Unsupported _WIZCHIP_IO_MODE_SPI_ in W5500 !!!"
196  #endif
197 
198 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
199 
200  #if (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
201 
202  #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
203 
204  #else
205  #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
206  #endif
207 #else
208  #error "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"
209 #endif
210 
211  WIZCHIP.CS._deselect();
213 }
214 
215 void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
216 {
217  uint16_t i = 0;
218  uint16_t j = 0;
220  WIZCHIP.CS._select();
221 
222 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
223 
224  #if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_ )
225  AddrSel |= (_W5500_SPI_WRITE_ | _W5500_SPI_VDM_OP_);
226  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
227  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
228  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
229  for(i = 0; i < len; i++,j)
230  WIZCHIP.IF.SPI._write_byte(pBuf[i]);
231  #elif( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_ )
233  for(i = 0; i < len/4; i++, j)
234  {
235  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
236  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
237  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
238  WIZCHIP.IF.SPI._write_byte(pBuf[i*4] );
239  WIZCHIP.IF.SPI._write_byte(pBuf[i*4+1]);
240  WIZCHIP.IF.SPI._write_byte(pBuf[i*4+2]);
241  WIZCHIP.IF.SPI._write_byte(pBuf[i*4+3]);
242  AddrSel = WIZCHIP_OFFSET_INC(AddrSel,4);
243  }
244  len %= 4; // for the rest data
245  // M20131220 : Remove for loop
246  i *= 4;
247  if(len >= 2)
248  {
249  AddrSel -= 1; // change _W5500_SPI_FDM_OP_LEN4_ to _W5500_SPI_FDM_OP_LEN2_
250 
251  //for(j = 0; j < len/2 ; j++)
252  {
253  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
254  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
255  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
256  WIZCHIP.IF.SPI._write_byte(pBuf[i] );
257  WIZCHIP.IF.SPI._write_byte(pBuf[i+1]);
258  i += 2;
259  AddrSel = WIZCHIP_OFFSET_INC(AddrSel, 2);
260  }
261  len %= 2;
262  if(len)
263  {
264  AddrSel -= 1; // change _W5500_SPI_FDM_OP_LEN2_ to _W5500_SPI_FDM_OP_LEN1_
265  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF0000) >> 16);
266  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
267  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
268  WIZCHIP.IF.SPI._write_byte(pBuf[i]);
269  }
270  }
271  #else
272  #error "Unsupported _WIZCHIP_IO_SPI_ in W5500 !!!"
273  #endif
274 
275 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
276 
277  #if (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
278 
279  #elif(_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_)
280 
281  #else
282  #error "Unsupported _WIZCHIP_IO_MODE_BUS_ in W5500 !!!"
283  #endif
284 #else
285  #error "Unknown _WIZCHIP_IO_MODE_ in W5500. !!!!"
286 #endif
287 
288  WIZCHIP.CS._deselect();
290 }
291 
292 
293 uint16_t getSn_TX_FSR(uint8_t sn)
294 {
295  uint16_t val=0,val1=0;
296  do
297  {
298  val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
299  val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
300  if (val1 != 0)
301  {
302  val = WIZCHIP_READ(Sn_TX_FSR(sn));
303  val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
304  }
305  }while (val != val1);
306  return val;
307 }
308 
309 
310 uint16_t getSn_RX_RSR(uint8_t sn)
311 {
312  uint16_t val=0,val1=0;
313  do
314  {
315  val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
316  val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
317  if (val1 != 0)
318  {
319  val = WIZCHIP_READ(Sn_RX_RSR(sn));
320  val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
321  }
322  }while (val != val1);
323  return val;
324 }
325 
326 void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
327 {
328  uint16_t ptr = 0;
329  uint32_t addrsel = 0;
330  if(len == 0) return;
331  ptr = getSn_TX_WR(sn);
332  //M20140501 : implict type casting -> explict type casting
333  //addrsel = (ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
334  addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_TXBUF_BLOCK(sn) << 3);
335  //
336  WIZCHIP_WRITE_BUF(addrsel,wizdata, len);
337 
338  ptr += len;
339  setSn_TX_WR(sn,ptr);
340 }
341 
342 void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
343 {
344  uint16_t ptr = 0;
345  uint32_t addrsel = 0;
346 
347  if(len == 0) return;
348  ptr = getSn_RX_RD(sn);
349  //M20140501 : implict type casting -> explict type casting
350  //addrsel = ((ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
351  addrsel = ((uint32_t)ptr << 8) + (WIZCHIP_RXBUF_BLOCK(sn) << 3);
352  //
353  WIZCHIP_READ_BUF(addrsel, wizdata, len);
354  ptr += len;
355 
356  setSn_RX_RD(sn,ptr);
357 }
358 
359 
360 void wiz_recv_ignore(uint8_t sn, uint16_t len)
361 {
362  uint16_t ptr = 0;
363  ptr = getSn_RX_RD(sn);
364  ptr += len;
365  setSn_RX_RD(sn,ptr);
366 }
367