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