W5200(WIZ820io) network interface

Revision:
1:803123933c5a
Parent:
0:61831b843b44
--- a/w5100.cpp	Sat Apr 14 17:21:11 2012 +0000
+++ b/w5100.cpp	Tue Apr 17 12:13:15 2012 +0000
@@ -9,6 +9,7 @@
 
 #include <stdio.h>
 #include <string.h>
+#include "mbed.h"
 #include "w5100.h"
 #ifndef MBED
 #include <avr/interrupt.h>
@@ -30,25 +31,25 @@
 #endif
 
 #ifdef MBED
-SPI spi(p11, p12, p13); // mosi, miso, sclk
-DigitalOut _cs(p14);
-DigitalOut _reset(p15);
-inline void delay(int n) { wait_ms(n); }
-inline static void initSS(){ _cs = 1; }
-inline static void setSS() { _cs = 0; }
-inline static void resetSS() { _cs = 1; }
+
+SPI* pSPI = NULL;
+DigitalOut* pCS = NULL;
 
-void W5100Class::hardware_reset() {
-  _reset = 1;
-  _reset = 0;
-  wait_us(2);
-  _reset = 1;
-  wait_ms(150);
-}
+inline void delay(int n) { wait_ms(n); }
+inline static void initSS(){ pCS->write(1); }
+inline static void setSS() { pCS->write(0); }
+inline static void resetSS() { pCS->write(1); }
+
 #endif //MBED
 
 void W5100Class::init(void)
 {
+  if (!pSPI) {
+    pSPI = new SPI(p11, p12, p13); // mosi, miso, sclk
+  }
+  if (!pCS) {
+    pCS = new DigitalOut(p14);
+  }
   initSS();
   writeMR(1<<RST);
   
@@ -164,16 +165,16 @@
   setSS();  
   
 #ifdef W5200
-  spi.write(_addr >> 8);
-  spi.write(_addr & 0xFF);
-  spi.write(0x80);
-  spi.write(0x01);
+  pSPI->write(_addr >> 8);
+  pSPI->write(_addr & 0xFF);
+  pSPI->write(0x80);
+  pSPI->write(0x01);
 #else    
-  spi.write(0xF0);
-  spi.write(_addr >> 8);
-  spi.write(_addr & 0xFF);
+  pSPI->write(0xF0);
+  pSPI->write(_addr >> 8);
+  pSPI->write(_addr & 0xFF);
 #endif  
-  spi.write(_data);
+  pSPI->write(_data);
   resetSS();
   return 1;
 }
@@ -183,14 +184,14 @@
     
 #ifdef W5200
     setSS();
-    spi.write(_addr >> 8);
-    spi.write(_addr & 0xFF);
-    spi.write((0x80 | ((_len & 0x7F00) >> 8)));
-    spi.write(_len & 0x00FF);
+    pSPI->write(_addr >> 8);
+    pSPI->write(_addr & 0xFF);
+    pSPI->write((0x80 | ((_len & 0x7F00) >> 8)));
+    pSPI->write(_len & 0x00FF);
 
   for (uint16_t i=0; i<_len; i++)
   {
-    spi.write(_buf[i]);
+    pSPI->write(_buf[i]);
 
   }
     resetSS();
@@ -199,11 +200,11 @@
   for (uint16_t i=0; i<_len; i++)
   {
     setSS();    
-    spi.write(0xF0);
-    spi.write(_addr >> 8);
-    spi.write(_addr & 0xFF);
+    pSPI->write(0xF0);
+    pSPI->write(_addr >> 8);
+    pSPI->write(_addr & 0xFF);
     _addr++;
-    spi.write(_buf[i]);
+    pSPI->write(_buf[i]);
     resetSS();
   }
 #endif
@@ -215,17 +216,17 @@
 {
   setSS();  
 #ifdef W5200
-  spi.write(_addr >> 8);
-  spi.write(_addr & 0xFF);
-  spi.write(0x00);
-  spi.write(0x01);
+  pSPI->write(_addr >> 8);
+  pSPI->write(_addr & 0xFF);
+  pSPI->write(0x00);
+  pSPI->write(0x01);
 #else
-  spi.write(0x0F);
-  spi.write(_addr >> 8);
-  spi.write(_addr & 0xFF);
+  pSPI->write(0x0F);
+  pSPI->write(_addr >> 8);
+  pSPI->write(_addr & 0xFF);
 #endif
   
-  uint8_t _data = spi.write(0);
+  uint8_t _data = pSPI->write(0);
   resetSS();
   return _data;
 }
@@ -234,14 +235,14 @@
 {
 #ifdef W5200
     setSS();
-    spi.write(_addr >> 8);
-    spi.write(_addr & 0xFF);
-    spi.write((0x00 | ((_len & 0x7F00) >> 8)));
-    spi.write(_len & 0x00FF);
+    pSPI->write(_addr >> 8);
+    pSPI->write(_addr & 0xFF);
+    pSPI->write((0x00 | ((_len & 0x7F00) >> 8)));
+    pSPI->write(_len & 0x00FF);
 
   for (uint16_t i=0; i<_len; i++)
   {
-    _buf[i] = spi.write(0);
+    _buf[i] = pSPI->write(0);
 
   }
     resetSS();
@@ -251,11 +252,11 @@
   for (uint16_t i=0; i<_len; i++)
   {
     setSS();
-    spi.write(0x0F);
-    spi.write(_addr >> 8);
-    spi.write(_addr & 0xFF);
+    pSPI->write(0x0F);
+    pSPI->write(_addr >> 8);
+    pSPI->write(_addr & 0xFF);
     _addr++;
-    _buf[i] = spi.write(0);
+    _buf[i] = pSPI->write(0);
     resetSS();
   }
 #endif