PIC18F67J60を使用しEtherNet対応機器を作る。その2

H/W

概要

XC8に対応したTCP/IP stackがMicrochipからリリースされた。XC16以上のバージョンでは以前より提供されていたが、XC8では暫く提供されていなかったものだ。過去にC18において提供されていたMicrochip MLA(Microchip Libraries for Applications)でTCP/IPアプリケーションの試作を行ったが、同じハードウェアを用いて、新しいライブラリで動作させてみたいと思う。

マイコンはPIC18F67J60を使用している。PIC18F97J60シリーズはEthernetモジュールを備えた、8bitのPICマイコンです。小型化のためにはこの製品は良いのですが、10MBpsなので、速度や計算能力が必要な場合には、EtherNetモジュールを外付けにする選択肢も用意されています。

アプリケーションは主題ではないので、シンプルなエコーサーバーに留めたいと思います。

PCB

PCB1 PCB1

回路図

ハードウェアの詳細については、過去の記事をご参照ください。

S/W

仕様

Microchip TCP/IP Lite Stack

まず、少し古いですが、AN1921を読みましょう。
文書と配布されているサンプルソースを読めば、ライブラリの概要や使い方は理解できると思います。ただし、このドキュメントはMicrochipの評価ボードを使うことを前提に書かれているので、特に、MAC/PHYが一体となっている、PIC18FxxJ6xを使う場合は不十分な点があるので、この点にフォーカスして説明したいと思います。逆に、ENC28J60などのMAC/PHYチップを外付けする場合については、この文書の手順に従えばおおむね問題ないと思われます。

インストール

libraryはこちらにあるので、ダウンロードしてpackageの追加を行う。
私が見た時は2.1.1が置いてあったが、これは必ずしも最新になっていない。(2020/7現在)
ライブラリが入っていれば、MCCのDevice ResourcesにTCP/IP Stackという項目が出てくるので、これを追加します。もし、より新しいバージョンがリリースされていれば、
Library version x.x.x [Available for download.]
といった形で表示されるので、クリックしてアップデートを行っておきます。(下の画像左下Versions tab。2.2.12のアップデートを行った例)

コンフィグレーション

TCPIP Lite resource

TCP/IP Lite, MACを追加します。timer1とMSSP1が自動的に追加されますが、これらは必ずしも必要無いので、使わない場合は後で削除してください。MCCの設定でで削除することはできないようです。サンプルプログラムでは、割り込み処理にTMR1を利用しています。

TCP/IP Liteの設定で使用するプロトコルを選択します。選択できるようになっていませんが、syslogとNTPで使うタイマー、SPI通信用の関数が自動的に追加されます。
例では、IPV4, TCP, ICMP, ARPを選択しています。アドレス等の設定もこちらで行えます。

MAC resource

MACリソースの設定では、使用するEtherNetモジュールを選択します。
EtherNetモジュールが実装されていないデバイスは、これらのデバイスとSPIで通信するのですが、PIC18F67J60は、ETHxxJ6xを指定しておきます。この際、SPIの設定は意味を持ちません。

system resource

25MHzの外部クロックが必須なので、外付けの25MHzのクロック源を選択します。PLLやプリスケーラーの設定は自由に選べますが、TMR1の設定範囲に影響が出てくるので、注意が必要です。今回は、TMR1でタイマー割り込みをかけているので、これが1秒程度に設定できればよかったので、x5 PLLを有効として処理速度を上げています。

一通り設定したら、MCCが出しているNotificationも確認しておきましょう。Warningはすべて消しておくのが望ましいということなのでしょうが、いくつか解消できないものがあります。
Add Network_Manage() in the main while loop - 書いてある通りmain関数に追加しても、ソースをチェックしていないので、Warningは消えないようです。セルフチェックしてOKなら無視します。
Configure TMR1... - 割り込み間隔、コールバック関数の呼び出し間隔ともに1秒になっている事を要求してきます。前述したように、タイマーを使っていない。ないしは、割り込み間隔が1秒でなくて差し支えないなら無視できます。通信自体のタイミングには影響はありません。

TCP/IP echo serverの実装

main App_Manage

TCPに関しては、Microchipのデモにサーバーの送受信の実装が含まれているので、ほとんどそのまま流用する事が出来る。
途中でクライアントとの通信が出来なくなった場合、ハングしてしまうので、10秒通信が無いとタイムアウトする機能を追加してある。(フローチャートには書いていない)
タイムアウト用のカウンタTOUTは、タイマー割り込みでカウントアップしている。
また、RA0に接続されたLEDを割り込みで点滅させるようにしてある。LEDが点滅していれば、初期化までは上手くいっている事が判る。

UDP/IP echo serverの実装

main udp7_handler App_Manage

UDPの場合は、セッションという概念が無いため、応答を返すためには受信したパケットの送信元IPやポートを調べて、送付先とする必要がある。 ライブラリではこれらの処理は行ってくれないので、自分で実装する必要がある。
UDPでListenする為には、udpv4_port_handler_table.cで、コールバック関数をセットしておく必要がある。該当ポートでUDPパケットを受信すると、コールパック関数がコールされる。
コールバック関数では、あまり重たい処理はしない方が良いので、txstatというグローバル変数を設け、UDPパケットを受信すると変数を1にセットしてリターンするだけの実装としている。複数のポートをListenする場合などは、ポートの識別が出来るようにする必要があるだろう。

RA0に接続されたLEDを割り込みで点滅させるようにしてある。LEDが点滅していれば、初期化までは上手くいっている事が判る。

#include "../../main.h"

const udp_handler_t UDP_CallBackTable[] = \
{    
    {PORT, &udp7_handler}
};

その他の設定

ETHxxJ6x_driver.cでLink/Act LEDの設定をしているところがあるので、正しく設定しておきます。
PHCON2, PHLCONがこれらの設定になります。詳細はデバイスのマニュアルを参照してください
また、RA0,RA1は出力に設定しておく必要があります。

テスト方法

まず、LEDのリンクランプが点くこと、LEDが点滅する事を確認します。10Mbpsでリンクしているかどうかも確認しておきます。
次にpingが通るかどうかを確認します。
TCP, UDPのテストに関しては、TCPのテストはMicrochipのデモ付属のプログラムで任意のポートへパケットを送る事が出来ます。UDPはアプリの搭載が前提となったデモプログラムになっている為、Windowsで動作するテストプログラムを作成しました。必要な方はこのページの下部からダウンロードしてください。

Trouble

syslog機能が自動的に追加されるので、udpを追加していない場合エラーが発生します。
log_syslog.c, log_syslog.hをプロジェクトからremove or exclude設定します。
同様に、SPIは使用しないので、spi_master.c, spi_master.hもプロジェクトからremove or exclude設定にします。

Source files

tcp_demo.X.7z
udp_demo.X.7z
udp_exe