配線が終わったという事なので、とりあえずのテストをしてみましょう。
と、その前に・・・
周辺チップにつきものの、リセットなのですが、W5300はハードリセットとソフトリセットの2種があります。
そのうち、ハードリセットの方法なのですが、
メンドウでしたら、ハードリセット信号線はシステムのリセット信号線*1につないでください。
何かの理由で固まった場合(あるのか無いのか?)、リセットボタンを押したくない、ファームウェア側で復帰を試みたいなどの場合は、ポートにつないでください。
この基板は、そのままAKI-SH7144Fを載せた場合や赤MCUボードを載せた場合、ハードリセット信号線はポートにつながります。
リセットは、ポートをH→L(2uS以上)→Hにする事により行います*2。
/***********************************************************************/ /* W5300 をハードリセットする */ /* リセット信号は、PE.B4に繋がっている (AKI-SH7144Fの場合) */ /***********************************************************************/ void w5300_hard_reset(void) { long ii; /* PE4に "0" を出力 */ PE.DRL.BIT.B4 = 0; /* 2uS以上、Lを保たなければいけない */ for(ii = 0 ; ii < 0x10000L ; ++ii) ; /* PE4をセットする(リセット解除) */ PE.DRL.BIT.B4 = 1; }
リセット処理終了後10mSは、W5300に対して何もしないようにしましょう。
ボードが正常で、LANケーブルが繋がっていれば、約1秒程度で、Link LED(Speed、FDXも)が点灯するはずです。
PINGができるようにするには、リセット後、MACアドレス、自IPアドレス、ネットマスク、デフォルトゲートウェイを設定します。
注)以下のリストは、16ビットアクセス/ビッグエンディアンのものです。
typedef unsigned char ubyte; typedef unsigned short ushort; typedef unsigned long ulong; /* W5300 のI/O アドレス */ #define W5300_BASE ((uchar *)0x800000L) #define CMN_MAC_ADDRESS (W5300_BASE + 0x008) #define CMN_GW_ADDRESS (W5300_BASE + 0x010) #define CMN_SUBNET_ADDRESS (W5300_BASE + 0x014) #define CMN_IP_ADDRESS (W5300_BASE + 0x018) /* 16ビットバス幅でW5300へ書き込む */ #define write_data16(p, d) *((volatile ushort *)(p)) = d /***********************************************************************/ /* W5300に最低限必要な設定を行ってみる */ /***********************************************************************/ int main(void) { uchar mac_adr[6] = {0x??, 0x??, 0x??, 0x??, 0x??, 0x?? }; ulong ip_adr = 0xc0a80007; /* 192.168.0.7 */ ulong gw_adr = 0xc0a80001; /* 192.168.0.1 */ ulong net_mask = 0xffffff00; /* 255.255.255.0 */ /* MAC アドレスの設定 */ write_data16((CMN_MAC_ADDRESS + 0), *((ushort *)mac_adr + 0)); write_data16((CMN_MAC_ADDRESS + 2), *((ushort *)mac_adr + 1)); write_data16((CMN_MAC_ADDRESS + 4), *((ushort *)mac_adr + 2)); /* IP アドレスの設定 */ write_data16(((ubyte *)CMN_IP_ADDRESS + 0), (ip_adr >> 16)); write_data16(((ubyte *)CMN_IP_ADDRESS + 2), (ip_adr & 0xffff)); /* ネットマスクの設定 */ write_data16(((ubyte *)CMN_SUBNET_ADDRESS + 0), (net_mask >> 16)); write_data16(((ubyte *)CMN_SUBNET_ADDRESS + 2), (net_mask & 0xffff)); /* ゲートウェイの設定 */ write_data16(((ubyte *)CMN_GW_ADDRESS + 0), (gw_adr >> 16)); write_data16(((ubyte *)CMN_GW_ADDRESS + 2), (gw_adr & 0xffff)); while(1) ; }
※2010.10.19 ネットマスク・ゲートウェイの設定が間違っていたので修正。
MACアドレスは、必ず世界でひとつだけのユニークな値でなければいけないので、適当に設定してはいけません。
使っていないNICカードなどから一時的に値を借りてみてください*3。
PINGが通るようになりましたか?
試しに、Linuxサーバーから0.1秒間隔でPINGしてみましたが、動いていました。
どの位でヘタるのかは、うちのサーバーは遅いので分かりませんが、さすがにハード処理は早いなぁ…の世界です。
では、ファームウェアを作っていきましょう。
WIZNet W5300/3へ行く