Socket APIs: Ethernet/W5100/w5100.c Source File

Wiznet Socket API

w5100.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
38 //
39 //*****************************************************************************
40 
41 #include "w5100.h"
42 
43 #if (_WIZCHIP_ == 5100)
44 
47 void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
48 {
50  WIZCHIP.CS._select();
51 
52 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
53  WIZCHIP.IF.SPI._write_byte(0xF0);
54  WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
55  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
56  WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
57 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
58  //M20150601 : Rename the function for integrating with ioLibrary
59  //WIZCHIP.IF.BUS._write_byte(AddrSel,wb);
60  WIZCHIP.IF.BUS._write_data(AddrSel,wb);
61 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
62 
63  //add indirect bus
64  //M20150601 : Rename the function for integrating with ioLibrary
65  //WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
66  //WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
67  //WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
68  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
69  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
70  WIZCHIP.IF.BUS._write_data(IDM_DR,wb);
71 #else
72  #error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
73 #endif
74 
77 }
81 uint8_t WIZCHIP_READ(uint32_t AddrSel)
82 {
83  uint8_t ret;
84 
86  WIZCHIP.CS._select();
87 
88 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
89  WIZCHIP.IF.SPI._write_byte(0x0F);
90  WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >> 8);
91  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >> 0);
92  ret = WIZCHIP.IF.SPI._read_byte();
93 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
94  //M20150601 : Rename the function for integrating with ioLibrary
95  //ret = WIZCHIP.IF.BUS._read_byte(AddrSel);
96  ret = WIZCHIP.IF.BUS._read_data(AddrSel);
97 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
98 
99  //add indirect bus
100  //M20150601 : Rename the function for integrating with ioLibrary
101  //WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
102  //WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
103  //ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
104  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
105  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
106  ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
107 
108 #else
109  #error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
110 #endif
111 
112  WIZCHIP.CS._deselect();
114  return ret;
115 }
116 
117 
121 void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
122 {
123  uint16_t i = 0;
124 
126  WIZCHIP.CS._select(); //M20150601 : Moved here.
127 
128 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
129  for(i = 0; i < len; i++)
130  {
131  //M20160715 : Depricated "M20150601 : Remove _select() to top-side"
132  // CS should be controlled every SPI frames
133  WIZCHIP.CS._select();
134  WIZCHIP.IF.SPI._write_byte(0xF0);
135  WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >> 8);
136  WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >> 0);
137  WIZCHIP.IF.SPI._write_byte(pBuf[i]); // Data write (write 1byte data)
138  //M20160715 : Depricated "M20150601 : Remove _select() to top-side"
139  WIZCHIP.CS._deselect();
140  }
141 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
142  for(i = 0; i < len; i++)
143  //M20150601 : Rename the function for integrating with ioLibrary
144  // WIZCHIP.IF.BUS._write_byte(AddrSel+i,pBuf[i]);
145  WIZCHIP.IF.BUS._write_data(AddrSel+i,pBuf[i]);
146 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
147  //M20150601 : Rename the function for integrating with ioLibrary
148  /*
149  WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
150  WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
151  WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
152  for(i = 0 ; i < len; i++)
153  WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
154  WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
155  */
156  setMR(getMR()|MR_AI);
157  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
158  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
159  for(i = 0 ; i < len; i++)
160  WIZCHIP.IF.BUS._write_data(IDM_DR,pBuf[i]);
161  setMR(getMR() & ~MR_AI);
162 
163 #else
164  #error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!!"
165 #endif
166 
167  WIZCHIP.CS._deselect(); //M20150601 : Moved here.
169 }
170 
175 void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
176 {
177  uint16_t i = 0;
179  WIZCHIP.CS._select(); //M20150601 : Moved here.
180 
181  #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
182  for(i = 0; i < len; i++)
183  {
184  //M20160715 : Depricated "M20150601 : Remove _select() to top-side"
185  // CS should be controlled every SPI frames
186  WIZCHIP.CS._select();
187  WIZCHIP.IF.SPI._write_byte(0x0F);
188  WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >> 8);
189  WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >> 0);
190  pBuf[i] = WIZCHIP.IF.SPI._read_byte();
191  //M20160715 : Depricated "M20150601 : Remove _select() to top-side"
192  WIZCHIP.CS._deselect();
193  }
194 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
195  for(i = 0 ; i < len; i++)
196  //M20150601 : Rename the function for integrating with ioLibrary
197  // pBuf[i] = WIZCHIP.IF.BUS._read_byte(AddrSel+i);
198  pBuf[i] = WIZCHIP.IF.BUS._read_data(AddrSel+i);
199 #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
200  //M20150601 : Rename the function for integrating with ioLibrary
201  /*
202  WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
203  WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >> 8);
204  WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
205  for(i = 0 ; i < len; i++)
206  pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
207  WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
208  */
209  setMR(getMR() | MR_AI);
210  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >> 8);
211  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
212  for(i = 0 ; i < len; i++)
213  pBuf[i] = WIZCHIP.IF.BUS._read_data(IDM_DR);
214  setMR(getMR() & ~MR_AI);
215 
216 #else
217  #error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!!"
218 #endif
219 
220  WIZCHIP.CS._deselect(); //M20150601 : Moved Here.
222 }
223 
225 // Socket N regsiter IO function //
227 
228 uint16_t getSn_TX_FSR(uint8_t sn)
229 {
230  uint16_t val=0,val1=0;
231  do
232  {
233  val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
234  val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
235  if (val1 != 0)
236  {
237  val = WIZCHIP_READ(Sn_TX_FSR(sn));
238  val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
239  }
240  }while (val != val1);
241  return val;
242 }
243 
244 
245 uint16_t getSn_RX_RSR(uint8_t sn)
246 {
247  uint16_t val=0,val1=0;
248  do
249  {
250  val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
251  val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
252  if (val1 != 0)
253  {
254  val = WIZCHIP_READ(Sn_RX_RSR(sn));
255  val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
256  }
257  }while (val != val1);
258  return val;
259 }
260 
262 // Sn_TXBUF & Sn_RXBUF IO function //
264 uint32_t getSn_RxBASE(uint8_t sn)
265 {
266  int8_t i;
267 #if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
268  uint32_t rxbase = _W5100_IO_BASE_ + _WIZCHIP_IO_RXBUF_;
269 #else
270  uint32_t rxbase = _WIZCHIP_IO_RXBUF_;
271 #endif
272  for(i = 0; i < sn; i++)
273  rxbase += getSn_RxMAX(i);
274 
275  return rxbase;
276 }
277 
278 uint32_t getSn_TxBASE(uint8_t sn)
279 {
280  int8_t i;
281 #if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
282  uint32_t txbase = _W5100_IO_BASE_ + _WIZCHIP_IO_TXBUF_;
283 #else
284  uint32_t txbase = _WIZCHIP_IO_TXBUF_;
285 #endif
286  for(i = 0; i < sn; i++)
287  txbase += getSn_TxMAX(i);
288  return txbase;
289 }
290 
302 void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
303 {
304  uint16_t ptr;
305  uint16_t size;
306  uint16_t dst_mask;
307  uint16_t dst_ptr;
308 
309  ptr = getSn_TX_WR(sn);
310 
311  dst_mask = ptr & getSn_TxMASK(sn);
312  dst_ptr = getSn_TxBASE(sn) + dst_mask;
313 
314  if (dst_mask + len > getSn_TxMAX(sn))
315  {
316  size = getSn_TxMAX(sn) - dst_mask;
317  WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
318  wizdata += size;
319  size = len - size;
320  dst_ptr = getSn_TxBASE(sn);
321  WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
322  }
323  else
324  {
325  WIZCHIP_WRITE_BUF(dst_ptr, wizdata, len);
326  }
327 
328  ptr += len;
329 
330  setSn_TX_WR(sn, ptr);
331 }
332 
333 
344 void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
345 {
346  uint16_t ptr;
347  uint16_t size;
348  uint16_t src_mask;
349  uint16_t src_ptr;
350 
351  ptr = getSn_RX_RD(sn);
352 
353  src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
354  src_ptr = (getSn_RxBASE(sn) + src_mask);
355 
356 
357  if( (src_mask + len) > getSn_RxMAX(sn) )
358  {
359  size = getSn_RxMAX(sn) - src_mask;
360  WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
361  wizdata += size;
362  size = len - size;
363  src_ptr = getSn_RxBASE(sn);
364  WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, size);
365  }
366  else
367  {
368  WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, len);
369  }
370 
371  ptr += len;
372 
373  setSn_RX_RD(sn, ptr);
374 }
375 
376 void wiz_recv_ignore(uint8_t sn, uint16_t len)
377 {
378  uint16_t ptr;
379 
380  ptr = getSn_RX_RD(sn);
381 
382  ptr += len;
383  setSn_RX_RD(sn,ptr);
384 }
385 
386 #endif
uint32_t getSn_TxBASE(uint8_t sn)
Get the base address of socket sn TX buffer.
uint8_t(* _read_byte)(void)
Definition: wizchip_conf.h:246
_WIZCHIP WIZCHIP
Definition: wizchip_conf.c:165
union __WIZCHIP::_IF IF
void wiz_recv_ignore(uint8_t sn, uint16_t len)
It discard the received data in RX memory.
void(* _write_data)(uint32_t AddrSel, iodata_t wb)
Definition: wizchip_conf.h:238
uint16_t getSn_RX_RSR(uint8_t sn)
Get Sn_RX_RSR register.
#define _W5100_IO_BASE_
Definition: w5100.h:62
void(* _select)(void)
_WIZCHIP_ selected
Definition: wizchip_conf.h:218
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t *pBuf, uint16_t len)
It reads sequence data from registers.
#define getSn_RxMASK(sn)
Get the mask of socket sn RX buffer.
Definition: w5100.h:1777
#define getSn_TxMAX(sn)
Get the max TX buffer size of socket sn.
Definition: w5100.h:1768
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
It copies data to your buffer from internal RX memory.
uint8_t WIZCHIP_READ(uint32_t AddrSel)
It reads 1 byte value from a register.
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
It copies data to internal TX memory.
uint16_t getSn_TX_FSR(uint8_t sn)
Get Sn_TX_FSR register.
uint32_t getSn_RxBASE(uint8_t sn)
Get the base address of socket sn RX buffer.
void(* _deselect)(void)
_WIZCHIP_ deselected
Definition: wizchip_conf.h:219
void(* _write_byte)(uint8_t wb)
Definition: wizchip_conf.h:247
#define MR_AI
Address Auto-Increment in Indirect Bus Interface.
Definition: w5100.h:603
#define WIZCHIP_CRITICAL_ENTER()
Enter a critical section.
Definition: w5100.h:1032
iodata_t(* _read_data)(uint32_t AddrSel)
Definition: wizchip_conf.h:237
#define WIZCHIP_OFFSET_INC(ADDR, N)
Increase offset address.
Definition: w5100.h:59
struct __WIZCHIP::_IF::@1 SPI
#define setMR(mr)
Set Mode Register.
Definition: w5100.h:1108
#define getSn_TX_WR(sn)
Get Sn_TX_WR register.
Definition: w5100.h:1675
#define getSn_RxMAX(sn)
Get the max RX buffer size of socket sn.
Definition: w5100.h:1758
#define Sn_TX_FSR(sn)
Transmit free memory size register(R)
Definition: w5100.h:510
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t *pBuf, uint16_t len)
It writes sequence data to registers.
#define getMR()
Get MR.
Definition: w5100.h:1120
#define _WIZCHIP_IO_RXBUF_
Definition: w5100.h:53
#define Sn_RX_RSR(sn)
Received data size register(R)
Definition: w5100.h:545
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb)
It writes 1 byte value to a register.
W5100 HAL Header File.
#define setSn_TX_WR(sn, txwr)
Set Sn_TX_WR register.
Definition: w5100.h:1663
#define WIZCHIP_CRITICAL_EXIT()
Exit a critical section.
Definition: w5100.h:1049
struct __WIZCHIP::_CS CS
#define getSn_TxMASK(sn)
Get the mask of socket sn TX buffer.
Definition: w5100.h:1786
struct __WIZCHIP::_IF::@0 BUS
#define _WIZCHIP_IO_TXBUF_
Definition: w5100.h:52
#define setSn_RX_RD(sn, rxrd)
Set Sn_RX_RD register.
Definition: w5100.h:1693
#define getSn_RX_RD(sn)
Get Sn_RX_RD register.
Definition: w5100.h:1705
Generated on Wed May 4 2016 16:43:58 for Socket APIs by   doxygen 1.8.9.1