WIZnet社製W5100の評価
NET430ボードにWIZ812を接続してNetPlayer/VoIPインターフォン/HTTPサーバーで動作させて性能を評価してみました。下記には私見もあり間違っていることもあるかもしれませんので注意してください。
1.概要
長所:
- TCPの詳細な知識なしでネットワーク接続機器を作成できる
(CS8900使用時と比べるとRAMで185バイト、FlashROMで4Kバイトの削減されました。)
- 以外に安い
短所:
- マルチセッションのアプリには不向きです。
(複数のportでlistenするようなサーバー等には不向き)
- SPI接続は遅くて使えないかもしれない。
(SPI接続時にはAIの機能が使えなくて送受信メモリアクセス時に毎回アドレスを指定しなければいけないため遅くなる。ちなみにIndirectBusアクセスモードでAIを未使用で動作させた場合受信データをローカルRAM(CPU内蔵RAM)に転送するのに時間がかかり性能が出なかった)
2.W5100の詳細
- MCUとの接続、動作モード
MCUとW5100の接続方法には以下の3種類あります。
- ダイレクトアクセスモード
MCUのメモリマップドIOで接続される、高速なアクセスが可能
- Inダイレクトアクセスモード
アドレス0/1の2bitだけを使用する小配線接続モード
4回のアクセス(MR/AR0/AR1/DR)をでレジスタにアクセスする
- SPIアクセスモード
SPI-I/Fでクロック同期シリアル接続するモード、4線でされます。
- 制御に関して
- 内部は4つのソケットユニット(←私的な表現ですが)があり独立してTCP通信が可能です。
- ひとつのユニットで1つのセッションを割り当てて使用します。
つまり4つのソケットユニットに4つのPORT番号を設定してサーバー動作させることで4つのサーバーが動作可能です。
でも実動作ではICMPに2つとられる?のでTCPで使用可能なのは2つまで。
- 通信時のARP処理、ACKの応答、TCPの再送処理はW5100が行ってくれるのでユーザプログラムは簡単に作成可能です。
TCP通信における状態変移を理解していれば問題なくソフトを組めます。
- 送受信メモリ
- 送信/受信ともに8Kバイトの容量があり8Kバイトを各ソケットユニット毎に分割して使用されます。分割方法はRMSR/TMSRで指定します。
- 各ソケットユニットで使用できるメモリサイズはは1,2,4,8Kバイトに設定可能で
ソケットユニット#0-#3のトータルが8Kバイトを超えることができません。
- 受信メモリに書き込みできません(でした)。
- 送受信メモリに読み書きする場合には(送信時に送信メモリに書き込み又は受信時に受信メモリから読み出し)アドレス値算出が必要です。
(ここでポインタレジスタ"TX_RD/TX_WR/RX_RD"を毎回0クリアして使用するような単純な方法では上手くいきませんでした。素直にデータシート通りにポインタレジスタからアドレス算出したほうがスムーズでした)
例:ソケット#0、TMSR/RMSRを2Kバイトに設定した場合
- 送信メモリ:0x4000-0x4800
受信メモリ:0x6000-0x6800
に割り当てられます。
送受信メモリに読み書きする場合はポインタレジスタから読み書きを開始する先頭アドレスの算出が必要になります。
(注意:ポインタレジスタ値は0-0xFFFFの16ビットで示されます)
送信メモリに書き込み時の先頭アドレスは
(TX_RD & 0x7FF) + 0x4000
になります。
受信メモリの読み出し先頭アドレスは
(RX_RD & 0x7FF) + 0x6000
になります。
- その他気になる点
- SPIアクセスでは下図のようなパターンでないといけないようです。
(最初のクロックエッジは立ち上がりから始まる)
__ __
cs |________________________|
_ _ _ _
ck ___||_||_||_||_ 〜 ___
MSP430ではこのモードでのアクセスが上手くできませんでした。なぜか1ビットずれる。
- SPIアクセス時にはAIモード(アドレス・オート・インクリメント)が使用できない?
- ICMPのレスポンスのソケット番号(Sn)は受信したソケット以外のソケットを使用しないといけない?、受信したソケット(n)をそのままSENDしても送信されなかった。
メーカのサンプルコードも受信したソケット以外を使用していました。
- TCPモードでは受信したソケット(n)で返信しなければいけない(同じセッションでの送受信だからあたりまえか)
- TX_RD/TX_WRの初期値が不定?である。よってバウンダリポインタを送信毎に初期化するなんてできない?。リングバッファ管理(アドレス計算)が絶対必要。
- 消費電力が大きい?(測定したわけではありませんが触ると他のチップより発熱しているような感じがします。)
- メーカのサンプルコード解析
(W5100E01-AVR_v12.zip)
- 初期化
evb/evb.c/net_init()を参照
- ICMP関連
inet/ping.c
ICMPreplyはSendPingReply()を参照
- TCPサーバー
app/loopback.c/loopback_tcps()を参照
- TCPクライアント
app/loopback.c/loopback_tcpc()を参照
- TCPの送受信
iinchip/socket.c/recv(),send()を参照
- メモリアドレスの算出
iinchip/w5100.c/read_data(), write_data()を参照
- その他、テストアプリ評価時の設定
ソケット#0:ICMP受信用(送受信メモリ割り当て1Kバイト)
ソケット#1:ICMP送信用(送受信メモリ割り当て1Kバイト)
ソケット#2:未使用(送受信メモリ割り当て21Kバイト)
ソケット#3:TCP通信用(送受信メモリ割り当て4Kバイト)
4Kにしなければいけない理由として2Kバイトにするとサーバーからの受信データが1024バイトで分割されてしまうためでした(推論ですがTCPのWindowSizeが2048になりその半分の1024でデータを分割されてしまうようです)。テストアプリでは1300バイトのデータを1回のパケットで受信するように作成していましたので分割されると現状では組み立てられないためです。