ラベル W5200 の投稿を表示しています。 すべての投稿を表示
ラベル W5200 の投稿を表示しています。 すべての投稿を表示

2013年3月24日日曜日

FRDM-KL25ZとWIZ820ioでインターネット接続


1年ほど前に作ったmbedのEthernetNetIf互換のWIZ820ioのライブラリがあったのでKL25ZでもSPI接続して動かしてみました。

KL25Z用に再コンパイルするだけで簡単かと思ったのですが、EthernetNetIfのNetServiesに依存していたために、
EthernetNetIfライブラリが存在しなくて、ソースコードファイルNetServiesSourceを探して取り込みました。

WIZ820ioは動作中は最大150mAくらい流れるのでKL25ZのP3V3からの供給では足りなくて、
SPI通信は出来るがLinkUpにならない。LANコネクタのLEDが点灯しません。mbedを3.3V電源だけに使いました。

WIZ820io(W8200)は同時に8個のソケット開けるので1つをDNS用にUDPソケットで使って、残り7個で同時接続が出来ます。HTTPクライアントとHTTPサーバーを同時に動かすことも出来ます。

WIZ820ioインターフェースライブラリ
http://mbed.org/users/va009039/code/WIZ820ioNetIf/

(2013/3/24)
WIZ820ioとFRDM-KL25Zの結線図
nRESET J2P5 --- PTD5 reset
nSS      J1P5 --- PTD0 cs
MOSI    J1P3 --- PTD2 mosi
MISO    J2P6 --- PTD3 miso
SCLK    J1P4 --- PTD1 sclk
GND     J2P1 --- GND
3V3D   J2P3 --- 外部電源3.3V
PWDN  J2P4 --- GND
(2013/3/26追加)

参考資料
NetServices Stack source
http://mbed.org/users/donatien/code/NetServicesSource/

(2013/3/27追加)
---

2012年4月19日木曜日

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

mbedのためにWIZ820ioのネットワークインターフェースをライブラリとして公開してみた。

W5200(WIZ820io) network interface

TCPSOCKET,UDPSOCKET,DNSREQUESTを使っているプログラムなら修正しなくても動きます。
たとえばHTTPClient,HTTPServerは動きます。

acceptを修正。
8個までソケットを同時に開けるようにした。
SPI,CS,リセットのピン端子を設定できるようにした。
DNSリクエストでリトライするようにした。
DNSサーバーはDHCPで取得したサーバーを使うようにした。
---

2012年4月15日日曜日

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

w5200用のネットワークインターフェースを作ってみた。

w5200NetIf  W5200(WIZ820io) network interface

TCP/UDPクライアントに使うのであれば、EthernetNetIfの代わりに動きます。

#include "WIZ820ioNetIf.h"
WIZ820ioNetIf eth;
eth.setup();

現在の制限
・TCPサーバーの為のacceptは実装していない。
・使えるソケットは1つだけ、同時に複数の接続は出来ない。

【追加】
時々ハングアップするのだが、調べてみると長さが0バイトつまりlen=0で送信すると、
SnTX_WRに同じ値を書いてSENDコマンドを発行すると、w5200の全てのレジスタがクリアされてしまう。

int /*if < 0 : NetTcpSocketErr*/ MyNetTcpSocket::send(const char* buf, int len) {
#ifdef DEBUG
    printf("buf:%p, len=%d\n", buf, len);
    printHex((u8*)buf, len);
#endif //DEBUG
    if (len > 0) {
        W5100.send_data_processing(_socket, (uint8_t*)buf, len);
        W5100.execCmdSn(_socket, Sock_SEND);
    }
    return len;
---

2012年4月8日日曜日

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

W5200のMACRAWモードのプログラムを修正してみた。
データシートのPACKET-INFOとCRCの説明とは違うようだが問題なく動いている。

// W5200_ethernet.cpp 2012/4/7
#include "mbed.h"
#include "w5100.h"
#include "Utils.h"

#define DEBUG 1

extern W5100Class W5100; // w5100.cpp

class MyEthernet {
    int _socket;
public:
    MyEthernet() {
        _socket = 0;
        W5100.writeSnMR( _socket, 0x40|SnMR::MACRAW); // S0_MR_MACRAW(0x04) and MAC filter
        W5100.execCmdSn( _socket, Sock_OPEN);
    }
    int receive() {
        int size = W5100.getRXReceivedSize(_socket);
        if (size <= 2) {
            return 0;
        }
        uint8_t info[2];
        W5100.recv_data_processing(_socket, info, 2, 1); //peek
        int size2 = (int)info[0]<<8|info[1];
        if (size >= size2) {
            return size2-2;
        }
        return 0;
    }

    int read(char* data, int size) {
        uint8_t info[2];
        W5100.recv_data_processing(_socket, info, 2);
        W5100.execCmdSn( _socket, Sock_RECV);
        int size3 = (int)info[0]<<8|info[1];
        size3 -= 2;
        W5100.recv_data_processing(_socket, (uint8_t*)data, size3);
        W5100.execCmdSn(_socket, Sock_RECV);
        return size3;
    }
}; 

int ethernet_test1() {
    MyEthernet eth;
    char buf[0x600];
    while(1) {
        int size = eth.receive();
        if(size > 0) {
            printf("WIZ820io ethernet packet size: %d\n", size);
            eth.read(buf, sizeof(buf));
            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]);
        }
        printHex((u8*)buf, size);
        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));
    }
}
--

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));
    }
}
---