MCU

コンテンツ

WIZNet W5300 その弐


配線が終わったという事なので、とりあえずのテストをしてみましょう。
と、その前に・・・

リセットについて


周辺チップにつきものの、リセットなのですが、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


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へ行く

*1 ハードリセットは負論理です
*2 ファームウェアでリセットしない限り、W5300は、どういう状態なのかは不明です
*3 弊社のボードにはユニークなMACアドレスがついています
最終更新のRSS
Last-modified: 2010-10-19 (火) 20:48:00 2975日前
HTML convert time: 0.037 sec.