■ENC28J60を使ったコントローラはバラックが組みあがった。ブレッドボード上で組むようにした、作った当人が言うのもなんだけど、だいぶ大雑把な感じで、本当にイーサネットにつないで大丈夫かしらんという不安がふつふつと湧き上がってくる。LANケーブルを挿した途端に火花が散るとかしたら嫌だな。
写真で見て解るとおり、ジャンパ線はびゅんびゅん飛んでるし、49.9Ω誤差1%という仕様を出すために20Ω1%と30Ω1%の抵抗器を強引にくっつけて50Ω抵抗を合成していたり、フェライトビーズでは扱えないのでインダクタンスを使ったりと、まあ、でたらめといったらでたらめ。
デバイスの初期化では最初全二重を期待していたのだけど、ENC28J60には全/半の自動認識機能がないのだった。無いとどうなるかというと、接続相手に自動認識機能がある場合は、接続相手は半二重に設定されてしまう。全/半の区別が付かない場合はとりあえず安全策で半にされると理解している。で、実験環境では入手しやすい安いスイッチハブがあって、ご丁寧に自動認識機能付きであったりする。ていうか、今時全/半固定のスイッチって探す方が大変だよ。
一応動作確認はしてみたかったので、MACアドレスはそこら辺に転がっていたNICから拝借。軽くpingを投げてそれを受信できるかどうかを確認したかったので、IPアドレスをどうしようとかは悩まない。ENC28J60のデータシートやpicfunにある初期化手順を参考にして半二重、受信バッファ、動作フラグの初期設定をしてやってポーリング状態で待機させておく。
テストに使うPCでは、arpコマンドを使って、バラックのあるデバイスを強制的に認識できるようにする。arp -sでMACアドレスとIPアドレスのマッピング情報をセットしてやれば、IPアドレスはでたらめでもPCからENC28J60デバイスへpingを投げられるようになる。
知っている人は知っている世界ですけど、同一LAN内であれば、MACアドレスさえ解れば通信できます。IPアドレスなんて飾りです(嘘です)。
で、えいやとpingを投げたら受信できました。本当か? と半信半疑で受信バッファをダンプ。したのはいいけど見方がよく解らん。
読み下していくと、え、ほんとにこんなん受信したのかあ? と悲しくなるような内容だったんですが、それは実はAVR-GCCのバグなんだか仕様なんだかよくわかんない言語実装が原因で、たんなるforループが延々周り続けていたのが原因でした。ループカウンタが破壊されているっぽい。
どうも、変数スタックの扱われ方が非組み込み系のGCCと違っているようで、なまじそちらを知っていると思わぬところで予期せぬ動きをされたりする。
それはそれとして、プログラムを手直しして受信バッファをきちんと読み出せるようにしたらMACフレームを確認することができました。IPヘッダとICMPヘッダも乗っている模様。まだ送信は確認していませんが、受信ができているからたぶん、大丈夫かなあ。