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