2012年4月5日木曜日

mbedでWIZ820io(W5200)を使ってみる(1)

mbedに組み込み用イーサネットモジュールWIZ820io(W5200)を繋げてみた。
WIZ820io       mbed
J2P1 GND ----- p1 GND
J1P3 MOSI ---- p11 SPI(mosi)
J2P6 MISO ---- p12 SPI(miso)
J1P4 SCK ----- p13 SPI(sck)
J1P5 nSS ----- p14
J2P5 nRESET -- p15
J2P3 3V3D ---- p40 VOUT
J2P4 PWDN ---- GND
とりあえずmbedのハンドブックのようにイーサーネットのパケットを読み取れるまでは出来た。
しかし、なぜかmbedに比べてパケットサイズが極端に大きい。何か使い方を勘違いしてるのだろう。

#include "mbed.h"
#include "w5100.h"
Serial pc(USBTX, USBRX);

extern W5100Class W5100;

class MyEthernet {
    bool _init_flag;
    void _init() {
        W5100.init();
        W5100.writeSnMR(0, 0x40|SnMR::MACRAW); // S0_MR_MACRAW(0x04) and MAC filter
        W5100.execCmdSn(0, Sock_OPEN);
    }
public:
    MyEthernet() {
        _init_flag = false;
    }
    int receive() {
        if (!_init_flag) {
            _init_flag = true;
            _init();
        }
        return W5100.readSnRX_RSR(0);
    }

    int read(char* data, int size) {
        int size2 = W5100.getRXReceivedSize(0);
        unsigned char *p = new unsigned char[size2];
        W5100.recv_data_processing(0, p, size2);
        W5100.execCmdSn(0, Sock_RECV);
        int size3 = (int)(*p)<<8 | *(p+1);
        delete p;
        if (size3 > size) {
            size3 = size;
        }
        memcpy(data, p+2, size3);
        return size3;
    }
}; 

MyEthernet eth2;

int main() {
    pc.baud(460800);

    char buf[0x600];
    while(1) {
        int size = eth2.receive();
        if(size > 0) {
            printf("WIZ820io ethernet packet size: %d\n", size);
            eth2.read(buf, size);
            printf("Destination:  %02X:%02X:%02X:%02X:%02X:%02X\n",
                    buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
            printf("Source: %02X:%02X:%02X:%02X:%02X:%02X\n",
                    buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
        }
        wait(1);
        printf("S0_RX_RSR:%d, S0_RX_RD:%d, S0_RX_WR:%d\n",
            W5100.readSnRX_RSR(0), W5100.readSnRX_RD(0), W5100.readSnRX_WR(0));
    }
}
---

0 件のコメント: