RX62Nでネットワークにアクセスできた
RX62NのETHERCやEDMACといったイーサネットコントローラを使う方法がわかってきました。
そして、受信したパケットをダンプするプログラムを作ってみました。
まずは、次の画面をご覧下さい。
こんな感じで、パケットダンプができました。
さて、ご存知のとおり、ルネサスからはRX62N用のWebサーバのサンプルプログラムがリリースされています。しかし、ルネサスのサンプルは巨大なJPEGデータを含んでいるので、デフォルトで128kBytesを超えてしまっています。そのため、試用期間の切れたHEWではビルドできません。
また、Webサーバが提供するファイルを差し替えることが難しいという問題もありました。
そこで、RX-ELF-GCCを使ってコンパイルできるものを作ろうとしています。イーサのサンプルプログラムをGCCでコンパイルするには少々テクニックが必要ですが、128kByteの制限がないので巨大なプログラムでも作れます。
そういうわけで、今日は内蔵イーサネットコントローラの使い方を調べていました。
ルネサスのWebサーバサンプルで遊んでいていくつか気になったのは、LinkUP/LinkDownを検出できないので、DHCPクライアントが起動時に1回しか動作しないという問題がありました。
そこで、自分で作るプログラムでは、割り込みかをつかってLinkUP/Downを検出できるようにしようと思いました。
せっかくP54/LINK_STAという信号がCPUにあるのですから、これを使うことにしました。LINK_STAは普通の回路設計では、PHYにつながっています。LINK_STAを使って割り込みを有効にするために設定すべきレジスタは、
ETHERC.ECSIPR.LONG = 0x00000004; // LINK信号変化割り込みを許可
EDMAC.EESIPR.LONG |= (1 << 22);
ICU.IER[4].BYTE |= (1 << 0); // EINT Enable
ICU.IPR[8].BYTE = 1; // EINT Interrupt Level is 1
の4つです。
ETHERCの割り込みを使う場合には、EDMACの中のレジスタをいじらなければならないのがミソです。
これで、LINK_STA端子の遷移で割り込みがかかるようになりました。
しかし!!
この方法には大きな問題があったのです。LINK_STA端子は、通常、PHYの橙色LEDにつながっています。橙色LEDはリンクアップを示すLEDですが、通信が入ったときに点滅するのです!
すると、何かを受信するたびにLEDが点滅して、そのたびに割り込みがかかる・・・これに気が付くまで相当の時間がかかってしまいました。
「あれー、なんでLinkUPとDownを繰り返すんだろう・・」と、半日悩みました。
まぁ、PHYのレジスタをMDCでアクセスして点滅を止めてしまえばいいのですが、それでは通信が入ったときに点滅できないので、結局のところ「LinkUP/Downを割り込みで通知してもらうのは賢いやり方でない」といえます。
わかったことは、内蔵イーサコントローラとイーサDMAコントローラは、メインメモリを介して、イーサネットのフレームをそのまま送受信する機能を持つということです。
ですから、TCP/IPを使うにはミドルウェア(イーサネットのフレームを解読したり組み立てたりするもの)が必要です。TCP/IPプロトコルスタックと内蔵ペリフェラルは、ブロックリードとブロックライトの関数だけでやりとりします。
ルネサスのWebサーバサンプルでは、TCP/IPプロトコルスタックにμIPを使っています。
次はμIPの解析をしていこうと思いますが、μIPといっても結構複雑(マクロを使ってぎっちぎちにコーディングされている)ので、これを使うのが良いのかどうか、ちょっと悩んでいます。
最近のコメント