source: ctrl/firmware/Main/SES/Drivers/W5100S/Src/w5100s.c @ 76

Last change on this file since 76 was 76, checked in by Zed, 3 months ago

Fixing project before changing NSS control for SPI2 in CubeMX.

File size: 16.1 KB
Line 
1//*****************************************************************************
2//
3//! \file w5100S.c
4//! \brief W5100S HAL Interface.
5//! \version 1.0.0
6//! \date 2018/03/29
7//! \par  Revision history
8//!       <2018/03/29> 1st Release
9//! \author Peter
10//!
11//! Copyright (c)  2013, WIZnet Co., LTD.
12//! All rights reserved.
13//!
14//! Redistribution and use in source and binary forms, with or without
15//! modification, are permitted provided that the following conditions
16//! are met:
17//!
18//!     * Redistributions of source code must retain the above copyright
19//! notice, this list of conditions and the following disclaimer.
20//!     * Redistributions in binary form must reproduce the above copyright
21//! notice, this list of conditions and the following disclaimer in the
22//! documentation and/or other materials provided with the distribution.
23//!     * Neither the name of the <ORGANIZATION> nor the names of its
24//! contributors may be used to endorse or promote products derived
25//! from this software without specific prior written permission.
26//!
27//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28//! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29//! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30//! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31//! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33//! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34//! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35//! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36//! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
37//! THE POSSIBILITY OF SUCH DAMAGE.
38//
39//*****************************************************************************
40
41#include "w5100s.h"
42
43#if   (_WIZCHIP_ == W5100S)
44/**
45@brief  This function writes the data into W5100S registers.
46*/
47void     WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb )
48{
49   uint8_t spi_data[4];
50
51   WIZCHIP_CRITICAL_ENTER();
52   WIZCHIP.CS._select();
53
54#if( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_))
55   if(!WIZCHIP.IF.SPI._write_burst)     // byte operation
56   {
57      WIZCHIP.IF.SPI._write_byte(0xF0);
58      WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >>  8);
59      WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >>  0);
60      WIZCHIP.IF.SPI._write_byte(wb);    // Data write (write 1byte data)
61   }
62   else     // burst operation
63   {
64      spi_data[0] = 0xF0;
65                spi_data[1] = (AddrSel & 0xFF00) >>  8;
66                spi_data[2] = (AddrSel & 0x00FF) >>  0;
67                spi_data[3] = wb;
68                WIZCHIP.IF.SPI._write_burst(spi_data, 4);
69   }
70#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
71   if(!WIZCHIP.IF.SPI._write_burst)     // byte operation
72   {
73           WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >>  8);
74           WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >>  0);
75           WIZCHIP.IF.SPI._write_byte(0xF0);
76           WIZCHIP.IF.SPI._write_byte(wb);    // Data write (write 1byte data)
77   }
78   else     // burst operation
79   {
80      spi_data[0] = (AddrSel & 0xFF00) >>  8;
81                spi_data[1] = (AddrSel & 0x00FF) >>  0;
82                spi_data[2] = 0xF0;
83                spi_data[3] = wb;
84                WIZCHIP.IF.SPI._write_burst(spi_data, 4);
85
86   }
87#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
88
89   //add indirect bus
90   //M20150601 : Rename the function for integrating with ioLibrary
91   //WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >>  8);
92   //WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
93   //WIZCHIP.IF.BUS._write_byte(IDM_DR,wb);
94   WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >>  8);
95   WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
96   WIZCHIP.IF.BUS._write_data(IDM_DR,wb);
97#else
98   #error "Unknown _WIZCHIP_IO_MODE_ in W5100. !!!"
99#endif
100
101   WIZCHIP.CS._deselect();
102   WIZCHIP_CRITICAL_EXIT();
103}
104/**
105@brief  This function reads the value from W5100S registers.
106*/
107uint8_t  WIZCHIP_READ(uint32_t AddrSel)
108{
109   uint8_t ret;
110   uint8_t spi_data[3];
111   WIZCHIP_CRITICAL_ENTER();
112   WIZCHIP.CS._select();
113
114#if( (_WIZCHIP_IO_MODE_ ==  _WIZCHIP_IO_MODE_SPI_))
115   if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst)      // byte operation
116   {
117        WIZCHIP.IF.SPI._write_byte(0x0F);
118        WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >>  8);
119        WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >>  0);
120   }
121   else
122   {
123        spi_data[0] = 0x0F;
124        spi_data[1] = (AddrSel & 0xFF00) >>  8;
125        spi_data[2] = (AddrSel & 0x00FF) >>  0;
126        WIZCHIP.IF.SPI._write_burst(spi_data, 3);
127   }
128   ret = WIZCHIP.IF.SPI._read_byte();
129#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
130   if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst)      // burst operation
131        {
132        WIZCHIP.IF.SPI._write_byte((AddrSel & 0xFF00) >>  8);
133        WIZCHIP.IF.SPI._write_byte((AddrSel & 0x00FF) >>  0);
134        WIZCHIP.IF.SPI._write_byte(0x0F);
135   }
136   else
137   {
138                spi_data[0] = (AddrSel & 0xFF00) >>  8;
139                spi_data[1] = (AddrSel & 0x00FF) >>  0;
140                spi_data[2] = 0x0F
141                WIZCHIP.IF.SPI._write_burst(spi_data, 3);
142   }
143   ret = WIZCHIP.IF.SPI._read_byte();
144#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
145
146   //add indirect bus
147   //M20150601 : Rename the function for integrating with ioLibrary
148   //WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >>  8);
149   //WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
150   //ret = WIZCHIP.IF.BUS._read_byte(IDM_DR);
151   WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >>  8);
152   WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
153   ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
154
155#else
156   #error "Unknown _WIZCHIP_IO_MODE_ in W5100S. !!!"
157#endif
158
159   WIZCHIP.CS._deselect();
160   WIZCHIP_CRITICAL_EXIT();
161   return ret;
162}
163
164
165/**
166@brief  This function writes into W5100S memory(Buffer)
167*/
168void     WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
169{
170   uint8_t spi_data[3];
171   uint16_t i = 0;
172
173   WIZCHIP_CRITICAL_ENTER();
174   WIZCHIP.CS._select();   //M20150601 : Moved here.
175
176#if((_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_))
177
178   if(!WIZCHIP.IF.SPI._write_burst)     // byte operation
179   {
180      WIZCHIP.IF.SPI._write_byte(0xF0);
181      WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >>  8);
182      WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >>  0);
183
184      for(i = 0; i < len; i++)
185      {
186         WIZCHIP.IF.SPI._write_byte(pBuf[i]);    // Data write (write 1byte data)
187      }
188   }
189   else     // burst operation
190   {
191                spi_data[0] = 0xF0;
192                spi_data[1] = (((uint16_t)(AddrSel+i)) & 0xFF00) >>  8;
193                spi_data[2] = (((uint16_t)(AddrSel+i)) & 0x00FF) >>  0;
194                WIZCHIP.IF.SPI._write_burst(spi_data, 3);
195                WIZCHIP.IF.SPI._write_burst(pBuf, len);
196   }
197
198#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
199   if(!WIZCHIP.IF.SPI._write_burst)     // byte operation
200   {
201      WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0xFF00) >>  8);
202      WIZCHIP.IF.SPI._write_byte((((uint16_t)(AddrSel+i)) & 0x00FF) >>  0);
203      WIZCHIP.IF.SPI._write_byte(0xF0);
204
205      for(i = 0; i < len; i++)
206      {
207         WIZCHIP.IF.SPI._write_byte(pBuf[i]);    // Data write (write 1byte data)
208      }
209   }
210   else     // burst operation
211   {
212                spi_data[0] = (((uint16_t)(AddrSel+i)) & 0xFF00) >>  8;
213                spi_data[1] = (((uint16_t)(AddrSel+i)) & 0x00FF) >>  0;
214      spi_data[2] = 0xF0;
215                WIZCHIP.IF.SPI._write_burst(spi_data, 3);
216                WIZCHIP.IF.SPI._write_burst(pBuf, len);
217   }
218#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
219   //M20150601 : Rename the function for integrating with ioLibrary
220   /*
221   WIZCHIP_WRITE(MR,WIZCHIP_READ(MR) | MR_AI);
222   WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >>  8);
223   WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
224   for(i = 0 ; i < len; i++)
225      WIZCHIP.IF.BUS._write_byte(IDM_DR,pBuf[i]);
226   WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
227   */
228   setMR(getMR()|MR_AI);
229   WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >>  8);
230   WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
231   for(i = 0 ; i < len; i++)
232      WIZCHIP.IF.BUS._write_data(IDM_DR,pBuf[i]);
233   setMR(getMR() & ~MR_AI);
234
235#else
236   #error "Unknown _WIZCHIP_IO_MODE_ in W5100S. !!!!"
237#endif
238
239   WIZCHIP.CS._deselect();  //M20150601 : Moved here.
240   WIZCHIP_CRITICAL_EXIT();
241}
242
243/**
244@brief  This function reads into W5100S memory(Buffer)
245*/
246
247void     WIZCHIP_READ_BUF (uint32_t AddrSel, uint8_t* pBuf, uint16_t len)
248{
249   uint8_t spi_data[3];
250   uint16_t i = 0;
251   WIZCHIP_CRITICAL_ENTER();
252   WIZCHIP.CS._select();   //M20150601 : Moved here.
253
254#if( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_) )
255   if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst)      // byte operation
256   {
257      WIZCHIP.IF.SPI._write_byte(0x0F);
258      WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >>  8);
259      WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >>  0);
260
261      for(i = 0; i < len; i++)
262      {
263         pBuf[i] = WIZCHIP.IF.SPI._read_byte();
264      }
265   }
266   else                                                                                                                         // burst operation
267   {
268                spi_data[0] = 0x0F;
269                spi_data[1] = (uint16_t)((AddrSel+i) & 0xFF00) >>  8;
270                spi_data[2] = (uint16_t)((AddrSel+i) & 0x00FF) >>  0;
271                WIZCHIP.IF.SPI._write_burst(spi_data, 3);
272                WIZCHIP.IF.SPI._read_burst(pBuf, len);
273
274   }
275#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_5500_) )
276   if(!WIZCHIP.IF.SPI._read_burst || !WIZCHIP.IF.SPI._write_burst)      // byte operation
277   {
278      WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0xFF00) >>  8);
279      WIZCHIP.IF.SPI._write_byte((uint16_t)((AddrSel+i) & 0x00FF) >>  0);
280      WIZCHIP.IF.SPI._write_byte(0x0F);
281
282      for(i = 0; i < len; i++)
283      {
284         pBuf[i] = WIZCHIP.IF.SPI._read_byte();
285      }
286   }
287   else                                                                                                                         // burst operation
288   {
289                spi_data[0] = (uint16_t)((AddrSel+i) & 0xFF00) >>  8;
290                spi_data[1] = (uint16_t)((AddrSel+i) & 0x00FF) >>  0;
291      spi_data[2] = 0x0F;
292                WIZCHIP.IF.SPI._write_burst(spi_data, 3);
293                WIZCHIP.IF.SPI._read_burst(pBuf, len);
294   }
295
296
297#elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
298   //M20150601 : Rename the function for integrating with ioLibrary
299   /*
300   WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) | MR_AI);
301   WIZCHIP.IF.BUS._write_byte(IDM_AR0,(AddrSel & 0xFF00) >>  8);
302   WIZCHIP.IF.BUS._write_byte(IDM_AR1,(AddrSel & 0x00FF));
303   for(i = 0 ; i < len; i++)
304      pBuf[i]   = WIZCHIP.IF.BUS._read_byte(IDM_DR);
305   WIZCHIP_WRITE(MR, WIZCHIP_READ(MR) & ~MR_AI);
306   */
307   setMR(getMR() | MR_AI);
308   WIZCHIP.IF.BUS._write_data(IDM_AR0,(AddrSel & 0xFF00) >>  8);
309   WIZCHIP.IF.BUS._write_data(IDM_AR1,(AddrSel & 0x00FF));
310   for(i = 0 ; i < len; i++)
311      pBuf[i]   = WIZCHIP.IF.BUS._read_data(IDM_DR);
312   setMR(getMR() & ~MR_AI);
313
314#else
315   #error "Unknown _WIZCHIP_IO_MODE_ in W5100S. !!!!"
316#endif
317
318   WIZCHIP.CS._deselect();    //M20150601 : Moved Here.
319   WIZCHIP_CRITICAL_EXIT();
320}
321
322///////////////////////////////////
323// Socket N regsiter IO function //
324///////////////////////////////////
325
326uint16_t getSn_TX_FSR(uint8_t sn)
327{
328   uint16_t val=0,val1=0;
329   do
330   {
331      val1 = WIZCHIP_READ(Sn_TX_FSR(sn));
332      val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
333      if (val1 != 0)
334      {
335        val = WIZCHIP_READ(Sn_TX_FSR(sn));
336        val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),1));
337      }
338   }while (val != val1);
339   return val;
340}
341
342
343uint16_t getSn_RX_RSR(uint8_t sn)
344{
345   uint16_t val=0,val1=0;
346   do
347   {
348      val1 = WIZCHIP_READ(Sn_RX_RSR(sn));
349      val1 = (val1 << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
350      if (val1 != 0)
351      {
352        val = WIZCHIP_READ(Sn_RX_RSR(sn));
353        val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),1));
354      }
355   }while (val != val1);
356   return val;
357}
358
359/////////////////////////////////////
360// Sn_TXBUF & Sn_RXBUF IO function //
361/////////////////////////////////////
362uint32_t getSn_RxBASE(uint8_t sn)
363{
364   int8_t  i;
365#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
366   uint32_t rxbase = _W5100S_IO_BASE_ + _WIZCHIP_IO_RXBUF_;
367#else
368   uint32_t rxbase = _WIZCHIP_IO_RXBUF_;
369#endif
370   for(i = 0; i < sn; i++)
371      rxbase += getSn_RxMAX(i);
372
373   return rxbase;
374}
375
376uint32_t getSn_TxBASE(uint8_t sn)
377{
378   int8_t  i;
379#if ( _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_)
380   uint32_t txbase = _W5100S_IO_BASE_ + _WIZCHIP_IO_TXBUF_;
381#else
382   uint32_t txbase = _WIZCHIP_IO_TXBUF_;
383#endif
384   for(i = 0; i < sn; i++)
385      txbase += getSn_TxMAX(i);
386   return txbase;
387}
388
389/**
390@brief  This function is being called by send() and sendto() function also. for copy the data form application buffer to Transmite buffer of the chip.
391
392This function read the Tx write pointer register and after copy the data in buffer update the Tx write pointer
393register. User should read upper byte first and lower byte later to get proper value.
394And this function is being used for copy the data form application buffer to Transmite
395buffer of the chip. It calculate the actual physical address where one has to write
396the data in transmite buffer. Here also take care of the condition while it exceed
397the Tx memory uper-bound of socket.
398
399*/
400void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
401{
402  uint16_t ptr;
403  uint16_t size;
404  uint16_t dst_mask;
405  uint16_t dst_ptr;
406
407  ptr = getSn_TX_WR(sn);
408
409  dst_mask = ptr & getSn_TxMASK(sn);
410  dst_ptr = getSn_TxBASE(sn) + dst_mask;
411
412  if (dst_mask + len > getSn_TxMAX(sn))
413  {
414    size = getSn_TxMAX(sn) - dst_mask;
415    WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
416    wizdata += size;
417    size = len - size;
418    dst_ptr = getSn_TxBASE(sn);
419    WIZCHIP_WRITE_BUF(dst_ptr, wizdata, size);
420  }
421  else
422  {
423    WIZCHIP_WRITE_BUF(dst_ptr, wizdata, len);
424  }
425
426  ptr += len;
427
428  setSn_TX_WR(sn, ptr);
429}
430
431
432/**
433@brief  This function is being called by recv() also. This function is being used for copy the data form Receive buffer of the chip to application buffer.
434
435This function read the Rx read pointer register
436and after copy the data from receive buffer update the Rx write pointer register.
437User should read upper byte first and lower byte later to get proper value.
438It calculate the actual physical address where one has to read
439the data from Receive buffer. Here also take care of the condition while it exceed
440the Rx memory uper-bound of socket.
441*/
442void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len)
443{
444  uint16_t ptr;
445  uint16_t size;
446  uint16_t src_mask;
447  uint16_t src_ptr;
448
449  ptr = getSn_RX_RD(sn);
450
451  src_mask = (uint32_t)ptr & getSn_RxMASK(sn);
452  src_ptr = (getSn_RxBASE(sn) + src_mask);
453
454
455  if( (src_mask + len) > getSn_RxMAX(sn) )
456  {
457    size = getSn_RxMAX(sn) - src_mask;
458    WIZCHIP_READ_BUF((uint32_t)src_ptr, (uint8_t*)wizdata, size);
459    wizdata += size;
460    size = len - size;
461        src_ptr = getSn_RxBASE(sn);
462    WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, size);
463  }
464  else
465  {
466    WIZCHIP_READ_BUF(src_ptr, (uint8_t*)wizdata, len);
467  }
468
469  ptr += len;
470
471  setSn_RX_RD(sn, ptr);
472}
473
474void wiz_recv_ignore(uint8_t sn, uint16_t len)
475{
476  uint16_t ptr;
477
478  ptr = getSn_RX_RD(sn);
479
480  ptr += len;
481  setSn_RX_RD(sn,ptr);
482}
483
484void wiz_mdio_write(uint8_t PHYMDIO_regadr, uint16_t var)
485{
486    WIZCHIP_WRITE(PHYRAR,PHYMDIO_regadr);
487    WIZCHIP_WRITE(PHYDIR, (uint8_t)(var >> 8));
488    WIZCHIP_WRITE(PHYDIR+1, (uint8_t)(var));
489    WIZCHIP_WRITE(PHYACR, PHYACR_WRITE);
490    while(WIZCHIP_READ(PHYACR));  //wait for command complete
491}
492
493uint16_t wiz_mdio_read(uint8_t PHYMDIO_regadr)
494{
495    WIZCHIP_WRITE(PHYRAR,PHYMDIO_regadr);
496    WIZCHIP_WRITE(PHYACR, PHYACR_READ);
497    while(WIZCHIP_READ(PHYACR));  //wait for command complete
498    return ((uint16_t)WIZCHIP_READ(PHYDOR) << 8) | WIZCHIP_READ(PHYDOR+1);
499}
500
501void wiz_delay_ms(uint32_t milliseconds)
502{
503        uint32_t i;
504        for(i = 0 ; i < milliseconds ; i++)
505        {
506                //Write any values to clear the TCNTCLKR register
507                setTCNTCLKR(0xff);
508
509                // Wait until counter register value reaches 10.(10 = 1ms : TCNTR is 100us tick counter register)
510                while(getTCNTR() < 0x0a){}
511        }
512}
513
514#endif
Note: See TracBrowser for help on using the repository browser.