Socket APIs: Ethernet/W5200/w5200.c Source File

Wiznet Socket API

w5200.c
Go to the documentation of this file.
1 //*****************************************************************************
2 //
38 //
39 //*****************************************************************************
40 
41 #include "w5200.h"
42 
43 #if (_WIZCHIP_ == 5200)
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((AddrSel & 0x0000FF00) >> 8);
54  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
55  WIZCHIP.IF.SPI._write_byte(_W5200_SPI_WRITE_); // Data write command and Write data length upper
56  WIZCHIP.IF.SPI._write_byte(0x01); // Write data length lower
57  WIZCHIP.IF.SPI._write_byte(wb); // Data write (write 1byte data)
58 
59 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
60 
61  //add indirect bus
62  //M20150601 : Rename the function for integrating with W5300
63  //WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
64  //WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
65  //WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
66  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
67  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
68  WIZCHIP.IF.BUS._write_data(IDM_DR,wb);
69 
70 #else
71  #error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!"
72 #endif
73 
76 }
80 uint8_t WIZCHIP_READ(uint32_t AddrSel)
81 {
82  uint8_t ret;
83 
85  WIZCHIP.CS._select();
86 
87 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
88  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
89  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
90  WIZCHIP.IF.SPI._write_byte(_W5200_SPI_READ_); // Read data length upper
91  WIZCHIP.IF.SPI._write_byte(0x01); // Data length lower
92  ret = WIZCHIP.IF.SPI._read_byte();
93 
94 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
95 
96  //add indirect bus
97  //M20150601 : Rename the function for integrating with W5300
98  //WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
99  //WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
100  //ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
101  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
102  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
103  ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
104 
105 #else
106  #error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!"
107 #endif
108 
109  WIZCHIP.CS._deselect();
111  return ret;
112 }
113 
114 
118 void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
119 {
120  uint16_t i = 0;
122  WIZCHIP.CS._select();
123 
124 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
125  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
126  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
127  WIZCHIP.IF.SPI._write_byte(_W5200_SPI_WRITE_ | ((len & 0x7F00) >> 8)); // Write data op code and length upper
128  WIZCHIP.IF.SPI._write_byte((len & 0x00FF) >> 0); // length lower
129  for(i = 0; i < len; i++)
130  WIZCHIP.IF.SPI._write_byte(pBuf[i]);
131 
132 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
133  //M20150601 : Rename the function for integrating with W5300
134  /*
135  WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
136  WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
137  WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
138  for(i = 0 ; i < len; i++)
139  WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
140  WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
141  */
142  setMR(getMR() | MR_AI);
143  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
144  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
145  for(i = 0 ; i < len; i++)
146  WIZCHIP.IF.BUS._write_data(IDM_DR,pBuf[i]);
148 #else
149  #error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!!"
150 #endif
151 
152  WIZCHIP.CS._deselect();
154 }
155 
159 void WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
160 {
161  uint16_t i = 0;
163  WIZCHIP.CS._select();
164 
165 #if( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SPI_))
166  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x0000FF00) >> 8);
167  WIZCHIP.IF.SPI._write_byte((AddrSel & 0x000000FF) >> 0);
168  WIZCHIP.IF.SPI._write_byte( _W5200_SPI_READ_ | ((len & 0x7F00) >> 8)); // Write data op code and length upper
169  WIZCHIP.IF.SPI._write_byte((len & 0x00FF) >> 0); // length lower
170  for(i = 0; i < len; i++)
171  pBuf[i] = WIZCHIP.IF.SPI._read_byte();
172 
173 #elif ( (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_) )
174  //M20150601 : Rename the function for integrating with W5300
175  /*
176  WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
177  WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
178  WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x000000FF));
179  for(i = 0 ; i < len; i++)
180  pBuf[i] = WIZCHIP.IF.BUS._read_byte(IDM_DR);
181  WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
182  */
183  setMR(getMR() | MR_AI);
184  WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0x0000FF00) >> 8);
185  WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x000000FF));
186  for(i = 0 ; i < len; i++)
187  pBuf[i] = WIZCHIP.IF.BUS._read_data(IDM_DR);
188  setMR(getMR() & ~MR_AI);
189 #else
190  #error "Unknown _WIZCHIP_IO_MODE_ in W5200. !!!!"
191 #endif
192 
193  WIZCHIP.CS._deselect();
195 }
196 
198 // Socket N regsiter IO function //
200 
201 uint16_t getSn_TX_FSR(uint8_t sn)
202 {
203  uint16_t val=0,val1=0;
204  do
205  {
206  val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
207  val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
208  if (val1 != 0)
209  {
210  val = WIZCHIP_READ(Sn_TX_FSR(sn));
211  val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
212  }
213  }while (val != val1);
214  return val;
215 }
216 
217 
218 uint16_t getSn_RX_RSR(uint8_t sn)
219 {
220  uint16_t val=0,val1=0;
221  do
222  {
223  val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
224  val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
225  if (val1 != 0)
226  {
227  val = WIZCHIP_READ(Sn_RX_RSR(sn));
228  val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
229  }
230  }while (val != val1);
231  return val;
232 }
233 
235 // Sn_TXBUF & Sn_RXBUF IO function //
237 
238 uint16_t getSn_RxBASE(uint8_t sn)
239 {
240  int8_t i;
241  uint16_t rxbase = _WIZCHIP_IO_RXBUF_;
242  for(i = 0; i < sn; i++)
243  rxbase += getSn_RxMAX(i);
244  return rxbase;
245 }
246 
247 uint16_t getSn_TxBASE(uint8_t sn)
248 {
249  int8_t i;
250  uint16_t txbase = _WIZCHIP_IO_TXBUF_;
251  for(i = 0; i < sn; i++)
252  txbase += getSn_TxMAX(i);
253  return txbase;
254 }
255 
268 void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
269 {
270 
271  uint16_t ptr;
272  uint16_t size;
273  uint16_t dst_mask;
274  uint8_t * dst_ptr;
275 
276  ptr = getSn_TX_WR(sn);
277 
278 
279  dst_mask = (uint32_t)ptr & getSn_TxMASK(sn);
280  dst_ptr = (uint8_t*)((uint32_t)getSn_TxBASE(sn) + dst_mask);
281 
282  if (dst_mask + len > getSn_TxMAX(sn))
283  {
284  size = getSn_TxMAX(sn) - dst_mask;
285  WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, size);
286  wizdata += size;
287  size = len - size;
288  dst_ptr = (uint8_t*)((uint32_t)getSn_TxBASE(sn));
289  WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, size);
290  }
291  else
292  {
293  WIZCHIP_WRITE_BUF((uint32_t)dst_ptr, wizdata, len);
294  }
295 
296  ptr += len;
297 
298  setSn_TX_WR(sn, ptr);
299 }
300 
301 
312 void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
313 {
314  uint16_t ptr;
315  uint16_t size;
316  uint16_t src_mask;
317  uint8_t * src_ptr;
318 
319  ptr = getSn_RX_RD(sn);
320 
321  src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
322  src_ptr = (uint8_t *)((uint32_t)getSn_RxBASE(sn) + src_mask);
323 
324  if( (src_mask + len) > getSn_RxMAX(sn) )
325  {
326  size = getSn_RxMAX(sn) - src_mask;
327  WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
328  wizdata += size;
329  size = len - size;
330  src_ptr = (uint8_t*)((uint32_t)getSn_RxBASE(sn));
331  WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
332  }
333  else
334  {
335  WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, len);
336  }
337 
338  ptr += len;
339 
340  setSn_RX_RD(sn, ptr);
341 }
342 
343 void wiz_recv_ignore(uint8_t sn, uint16_t len)
344 {
345  uint16_t ptr;
346 
347  ptr = getSn_RX_RD(sn);
348 
349  ptr += len;
350  setSn_RX_RD(sn,ptr);
351 }
352 
353 #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.
void(* _select)(void)
_WIZCHIP_ selected
Definition: wizchip_conf.h:218
W5200 HAL Header File.
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t *pBuf, uint16_t len)
It reads sequence data from registers.
#define MR
Mode Register address(R/W) MR is used for S/W reset, ping block mode, PPPoE mode and etc...
Definition: w5100.h:202
#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 _W5200_SPI_READ_
SPI interface Read operation in Control Phase.
Definition: w5200.h:55
#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 _W5200_SPI_WRITE_
SPI interface Write operation in Control Phase.
Definition: w5200.h:56
#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.
#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