マイコン風雲録

2012年01月31日

Wiz820io(W5200)のドライバ (バグ?対応)

Wiz820io(W5200)のドライバ (バグ?対応)
スイッチサイエンスでも2012/03からり出した様だ。
http://www.switch-science.com/products/detail.php?product_id=875
WIZ820ioお試しキャンペーン
http://trac.switch-science.com/wiki/2012-WIZ820io

Strawberry Linux でも売っている、
http://strawberry-linux.com/catalog/items?code=36018

超小型イーサーネットモジュール。
今後はこれがメジャーになって行くと思われる。(オントカヨ

*Wiz820io(W5200)のドライバ 
Arduino用のWiz820io(W5200)のドライバ。
「Download」タブにある。
「Arduino 002x用」と「Arduino 1.0用」のドライバがある。

W5100というのが、今までArduinoのEthernet Shieldとして使われてきたIC。
WizNetが提供するドライバソフトは、「w5100.h」,「w5100.cpp」という今までと同じ名前で
「W5100」,「W5200」の2つのICに対応する。
(デフォルトでW5200用になっている)

この2つのドライバの違いを見て驚いた。

以下の1バイト送信ではWiz820io(W5200)の方が「1バイト通信時間分」オーバヘッドが多い。
uint8_t W5100Class::write(uint16_t _addr, uint8_t _data)
{
  setSS();  
#ifdef W5200
  SPI.transfer(_addr >> 8);
  SPI.transfer(_addr & 0xFF);
  SPI.transfer(0x80);
  SPI.transfer(0x01);
#else	
  SPI.transfer(0xF0);
  SPI.transfer(_addr >> 8);
  SPI.transfer(_addr & 0xFF);
#endif  
  SPI.transfer(_data);
  resetSS();
  return 1;
}
ところが、連続書き込みでは、なんと、Wiz820io(W5200)の方が4倍高速。(この部分だけ見れば) (データ量が50バイト程度以上なら) 読出しも同じ。 て、ゆーか、 W5100て、こんな送り方なのかぁ〜? (TT) みたいな。 orz (パラレル転送を使う手もなくはない)
uint16_t W5100Class::write(uint16_t _addr, uint8_t *_buf, uint16_t _len)
{
#ifdef W5200
    setSS();
    SPI.transfer(_addr >> 8);
    SPI.transfer(_addr & 0xFF);
    SPI.transfer((0x80 | ((_len & 0x7F00) >> 8)));
    SPI.transfer(_len & 0x00FF);

	for (int i=0; i<_len; i++)
	{
		SPI.transfer(_buf[i]);
	}
    resetSS();
#else	
  for (int i=0; i<_len; i++)
  {
    setSS();    
    SPI.transfer(0xF0);
    SPI.transfer(_addr >> 8);
    SPI.transfer(_addr & 0xFF);
    _addr++;
    SPI.transfer(_buf[i]);
    resetSS();
  }
#endif  
  
  return _len;
}
*実際の動作状況? Wiz820ioをまだ買ってないものの、検索すると数名の方が果敢にトライして、今一つアレな様だ。(オイ どうなんでしょうか? *Wiz820io for Auduino ドライバの使い方 上のWiz820io対応ドライバは、「w5100.h」,「w5100.cpp」の2つのファイルをArduinoの libraries/Ethernet/utility フォルダに上書きします。 1,Wiz820io(w5200)を使うなら下記のバグ対応をしておきます。 2,今まで通りw5100を使ったイーサネットシールドを使いたい時は、 「w5100.h」の「#define W5200」を以下のように無効にします。
#ifndef	W5100_H_INCLUDED
#define	W5100_H_INCLUDED

#include <avr/pgmspace.h>
#include <SPI.h>

//#define W5200

#ifdef W5200
#define MAX_SOCK_NUM 8
#else
#define MAX_SOCK_NUM 4
#endif
stastaka's Blog さんのページも参考になります。 WIZ820IO https://stastaka.wordpress.com/2012/01/10/wiz820io/ *ライブラリのバグ対応 ?(1) Wiz820io(w5200)で使うときは、 「libraries/Ethernet/Ethernet.h」の最初の方を以下のように2カ所修正します。 (w5100で使うときも以下のままで大丈夫)
#ifndef ethernet_h
#define ethernet_h

#include <inttypes.h>
#include "utility/w5100.h"
#include "Client.h"
#include "Server.h"

//#define MAX_SOCK_NUM 4
この対応をしておかないと「MAX_SOCK_NUM」定義の整合性が取れない。 これで、何がどの程度どうなるかは未検証だけど、修正しておくのが無難と思われる。 少なくともw5200でソケット数が5以上になると確実におかしくなるはず。 *転送速度 高速通信したい場合、以下のページが参考になりそうです。 放課後の電子工作 掲示板 http://www.chiaki.cc/cgi-bin/yybbs/yybbs.cgi?list=pickup&num=1591 *マイコンとの接続 マイコンのMOSI(SPI out) とw5200/w5100の MOSI(SPI in)端子をつなぐ。 同様にMISO-MISOをつなぐ。 両方とも「同じ名称の端子同士」をつなぐ。 *w5100とw5200の違い SPIで使う限りWiz820io(w5200)の方が性能が良さそう。
w5100 w5200
Ethernet Shield /
WIZ812MJ
Wiz820io
SPI clock 14MHz 4MHz80MHz ?
最大Socket数 4 8
受信バッファ 8kbyte 16kbyte
送信バッファ 8kbyte 16kbyte
バースト転送 - あり
ケーブル接続
判別ビット
-あり
Power Down mode- あり
w5200は出て間もないので、データシートは常に最新版の確認が必要。 最新のデータシート SPIクロックについて: 4MHzの謎  w5100のデータシートでは約14MHz(70ns)まで動作するとあるが、  実は「4MHz」が上限らしい。ならば、そう書いてほしい(爆  以下のページでWizNetサポートが「4MHz」が上限と言い出す。 2011年9月26日のこと。   W5100 Data transfer rate  それを見てツッコミを入れた人への解答もやはり「4MHz」、   wiz811MJ connection  その根拠が「サンプルコードにそう書いてあるから」だって。 説得力が全然ないけど、ここまでの経緯としてはそういう事。orz 2008年〜2009年には以下のように「14MHz」と答えているのも事実。 [re]W5100 [re]What´s the max spi clock? 「4MHz」が記載してある文書を発見、 [PDF] Migration from W5100 to W5200 たぶん上の文書を元にサポートが答えていると思われる。 上の混迷具合を見るとw5200のSPIクロック上限80MHzについての真偽は、 もう謎というしかない。 サンプルコードを見てざっくり判断するしかないのかも。 *Arduino: UDP/Socketのバグ対応 インターネットラジオを作る http://npyo.web.fc2.com/pages/nradio/nradio.html 上のかたのページで、recvfrom関数にバグがあるという指摘があったので、 現在(2012/02)のAruduino 1.0/ 0023 のEthernetライブラリを調べてみた。 結果、  バッファを超えて書き込むバグがそのまま残っています。 orz  到着したUDPパケットサイズが、用意したバッファサイズを超えていても、  無視してバッファにコピーしてしまうので、  スタック破壊やSRAM破壊など深刻な動作不具合が発生します。 以下の対応で修正できます。 issue 669: Ethernet/UDP libraries loses packets if there are multiple packets in w5100 buffer http://code.google.com/p/arduino/issues/detail?id=669 2012/02現在、WizNetが提供するw5200/w5100用の各種ドライバライブラリを確認すると、 ことごとく上記のバグがあることが分りましたので注意が必要です。 追記:上のバグ修正コードを見ると、そのコードがさらにバグっているので    修正しておいた方が良いと思います。 orz *パケットモニタ Wireshark という、ソフトがあって調べてみると、以前は「EtherReal」だったものらしい。(経緯は略) http://www.wireshark.org/download.html このソフトは「Ethernet系」のソフトを作るときにあると便利。 使用上の注意点はググったほうが良い。 て、いうか、モノがモノなので気をつけた方がよいツール。(爆 ローカルホスト内のパケットをキャプチャする:  送信元と受信先が「localhost(127.0.0.1)」の場合、そのままではモニタできないので、 【ネットワーク】Wiresharkで自端末へのパケットをキャプチャする方法  http://blog.livedoor.jp/akf0/archives/51600075.html  を参考にさせていただきました。 *Use No Delayed ACK 問題 / TCPの無駄な待ち時間を削減する これも、上のかたの記述にあったもの。 TCPの通信速度が劇的に改善される可能性がある。(UDPの時は関係ない) セッションの開始時のオーバヘッドなので、1セッションが長ければ効果が 少ない可能性もある。 データシートの「Sn_MR」(Socket n Mode Register)のビット5、 「ND/MC」 Use No Delayed ACK。 このビットを「1」にするのが速度アップ必須条件。 デフォルトの「0」のままだと、TCPセッションごとに「200msec」の無駄な遅延が発生するのだ。 遅延時間は、タイムアウト時間と同じなのでタイムアウトレジスタに例えば「500msec」を設定すると、 さらに遅くなってしまうというもの。 現時点では、w5100/w5200/w5300系をコアに持つ物全てに共通する様だ。 w5300-jp-no-delayed-ack.png 上はもう入手できない「w5300 datasheet v1.1.1」の日本語版から抜粋したもの。 他の英語版データシートにはない「性能向上」や「勧奨する」という記述がある。 No Delayed ACK を有効にする: Arduino 0023の場合:   「libraries/Ethernet」下の「Server.c」と「Client.c」の中の「socket()関数」の   引数を変更します。(それぞれ1カ所しかない)  Sever.cでvoid Server::begin()内の「socket()」呼び出しを
socket(sock, SnMR::TCP, _port, SnMR::ND );
 Client.cでClient::Client(...)内の「socket()」呼び出しを 
socket(_sock, SnMR::TCP, _srcport, SnMR::ND);
の様に変更します。 Arduino 1.0の場合:  同様に「EthernetServer.c」「EthernetClien.c」内の「socket()」呼び出しを変更します。 *w5100のエラッタ ち、力が尽きた orz (オイ *w5100/w5200関連情報 WizNetの「Q&A」のページ ここで「w5100」や「w5200」で絞り込むと情報が得られる。 w5100/w5200は数が多くて大変 orz http://www.wiznet.co.kr/Sub_Modules/en/technical/q_a.asp この手のメーカーとしては、めずらしく「WizNet」の中の人がかなり「りちぎ」に 質問に答えている。 w5100の転送速度の表 [Question] What is the performance of W5100? [Question] What is Hybrid mode of W5100? SOCK_ARPステータスの補足説明 3Mbps〜4Mbps http://www.wiznet.co.kr/Sub_Modules/en/technical/Q_A_View.asp?boardcd=101&SF_AO=And&PK_NUM=24921&page=3&SF_Part=writer,%20subject,%20contents&SF_KeyWord=w5200&SF_AO=And Maximum speed with W5200 on W5200E01-M3 board PIC24EVB用のサンプルコード http://www.wiznet.co.kr/UpLoad_Files/ReferenceFiles/EVBs_v11.rar 参考: トラ技2009年3月号 部品箱の逸品 TCP/IPをハードウェアで内蔵するNIC W5100(改訂) http://toragi.cqpub.co.jp/Portals/0/download/2009/TR0903W.zip
ニックネーム Copyright (C) avrin All Rights Reserved. at 21:15 | Comment(0) | TrackBack(0) | Ethernet
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのTrackBack URL
http://blog.netlaputa.ne.jp/tb/2361305