マイコンのEthernet対応システム設計【STM32Nucleo】

マイコンをネット接続するための基礎知識

ネットワークに接続して使用するIoT化は組み込み機器でも浸透してきました。テレビ等を始めとする家電やスマホなどの身近な民生品ではWiFiによるネットワーク接続が一般的になっていますが、動作安定性やセキュリティが求められる産業機器向け製品には有線通信の一つであるイーサネットが使用されます。

今回は、これまで慣れ親しんできた汎用マイコン(Nucleo-F103RB)に外付けのイーサネット対応LANコントローラW5500を適用してイーサネットIoTに対応する方法を解説します。対象はSTM32マイコンですが、マイコンとLANコントローラ間のインターフェース(SPI通信)をカスタマイズすればどの機種にも対応できる手軽な手段です。

ここでは、IPアドレス等ネットワーク関連の解説は割愛します。

ネットワーク階層

めかのとろ

ネットワークには様々な規格の装置・機器が接続されているのですが、ネットワークの規格は以下のOSC参照モデルで共通化されていますのでどのような装置・機器でも共通規格であれば通信できるようになります。

めかのとろ

イーサネットは有線LANの一つで最も普及している規格でありIEEE802.3で定義されたものです。

めかのとろ

規格に従って、物理層のLANケーブルから例えばウェブブラウザを使用したHTTPアプリケーション層までの通信システムを構築することになります。データリンク層までは大抵ハードウェアで構成され、それ以降はソフトウェアで構成されます。

OSI参照モデル

イーサネット対応のためのLANコントローラの選択

めかのとろ

イーサネット通信に関してマイコンを大別すると3種類あり、下記のように分類できます。

  1. 汎用マイコン(イーサネットコントローラ非搭載)
  2. MACデバイスを内蔵したマイコン
  3. MAC/PHYデバイスを内蔵したマイコン
めかのとろ

1番めの汎用マイコンはイーサネットコントローラが非搭載ですのでMAC/PHYデバイスコントローラを外付けして汎用バスであるSPI、I2Cなどをインターフェースとして通信を行います。今回扱うNucleo-F103RBのマイコンはこれに当たります。

めかのとろ

2番めのマイコンはイーサネットMACデバイスを内蔵したもので例えばSTM32F407がこれに当たります。PHYデバイスコントローラを外付けしてマイコン内蔵のMACデバイスMII/RMIIとよばれる方式で通信を行います。

めかのとろ

3番めのマイコンはイーサネットに必要なデバイスMACおよびPHYを内蔵したもので、追加部品はパルストランス内蔵のRJ-45のみです。

めかのとろ

マイコンと組み合わせてイーサネット対応にするコントローラで一般的に使用されていて取得性のよいものを紹介します。

XPORT

めかのとろ

イーサネットの知識がなくてもWiFiのときに使用したESP32のように汎用シリアル通信をインターフェースとしたコントローラシリアル通信感覚で使用できます

めかのとろ

最も簡易的なIoT対応コントローラとして選択できます。シリアル通信のみ対応の既存の機器に外付けするだけなのはメリットですが、メーカー提供のドライバに従うため汎用性が高いとはいえないのがデメリットです。

ENC28J60コントローラ

めかのとろ

ENC28J60コントローラはイーサネットコントローラ非搭載のマイコンでもSPI通信を持っていればイーサネット対応にできます。

めかのとろ

TCP/IPプロトコルスタックを自分で組み込まなければなりませんのでSTM32F1シリーズでは実施例の資料が少なく大変そうです。移植するには選択したTCP/IPプロトコルスタックの中身を理解する必要がありますが、そこに時間をかけたくない場合は次のW5500がおすすめです。

W5500コントローラ

めかのとろ

ENC28J60コントローラの場合と同じくイーサネットコントローラ非搭載のマイコンでSPI通信を持っている場合に適用できます。両者の大きな違いはW5500はTCP/IPプロトコルスタックをハードウェアに内蔵していることで搭載のわずらわしさがなくコネクションが安定しています。

めかのとろ

そのため、TCP/IPプロトコル・スタックについての知識がなくても使用できることに加え、ソフトウェア負荷が小さいのでメモリの小さなマイコンに搭載できることも大きな利点です。

めかのとろ

Nucleo-F103RBのSTM32マイコンに対して外付け部品も少なくてすみ、TCPプロトコルを利用したソケット通信やさらに上位のHTTPプロトコルを利用したブラウザからの通信にも発展できるバランスのとれたコントローラです。

LAN8720コントローラ

めかのとろ

STM32F407マイコンのようにイーサネット対応MACを内蔵したものにはPHYデバイスのみを持つLAN8720やDP83848等のコントローラがよりマイコンの機能を活かせます。

めかのとろ

上位機種であるCortex-M4コアを内蔵するSTM32F407新規に採用する場合はもはやライブラリはSPLにこだわるのではなくHALやLLドライバを使用したほうが手っ取り早いです。

めかのとろ

開発環境STM32CubeIDEを使用すれば開発プロジェクトを作成する段階で自動生成機能を利用するとTCP/IPプロトコル(LwIP)も簡単に組みこめ、トランスポート層のTCPやUDPプロトコルまで実装できてしまいます。

めかのとろ

はじめからネットワーク機器向け製品を設計する場合はネットワーク内蔵のマイコンを選択するのが良いのではないでしょうか。

コラム

Arduinoのイーサネットシールド(互換品も含む)としてW5500を搭載したモデルがNucleoボードにも使用できればよいと考え仕様を確認してみたのですが、肝心のインターフェース部分であるSPI通信端子がNucleoには対応していないので使用できません

TCP/IPプロトコル・スタック内蔵のコントローラW5500

めかのとろ

イーサネットコントローラ非搭載のマイコンSTM32F1シリーズでイーサネット対応にするには汎用性を考えるとW5500ENC28J60あたりになります。

めかのとろ

TCP/IPプロトコルスタックをハードウェアに内蔵しているW5500はとりわけネットワーク仕様としての性能は申し分なく気軽にマイコンをネットワーク化対応にできるためこちらを選択することにします。

めかのとろ

TCP/IPプロトコルスタックについては規格に準じたものなので内部詳細をあえて理解する必要性はあまり感じられず既成のモジュールとして割り切ってもよいのではないでしょうか。

NUCLEO-F103RBとW5500モジュール

めかのとろ

外付けでW5500でNucleo-F103RBをネットワークにつなげるにはここでは市販W5500ボードを利用します。ボードは安価で最低限の周辺部品が備わっていますがMACアドレスがないボードも多いです。

めかのとろ

製品開発をする場合にはMACアドレスを保持するためのEEPROM等メモリが必要になります。

めかのとろ

Nucleoとの接続は電源とSPI通信部のみです。今回はSPI2を使用するため下図のような接続になります。

ポイント

MACアドレスについて:
イーサネットを使用するにあたってMACアドレスが必要となるのですが、使用するLANコントローラにはMACアドレスは搭載していません。ネットで動作を確認するくらいであれば問題ないのですが、製品として世に出す場合は各製品固有のMACアドレス登録を事前に行う必要があります。

STM32マイコンとW5500ドライバ

めかのとろ

W5500はIC内部のレジスタをSPI通信で操作して通信を行います。レジスタの詳細はW5500データシートに詳細が記載していますが、プログラミングにおいてはメーカーが提供するドライバ類をライブラリ(ioLibrary_BSD)として登録しておき、必要に応じて関数類を呼び出して使用します。

W5500のドライバとは

めかのとろ

STM32マイコンとのSPI通信のインターフェースにあたる関数をまとめたファイルがwizchip_conf.c/wizchip_conf.hです。このファイルでは使用するコントローラICチップ(W5500)の指定や、レジスタアドレス等が登録されています。マイコンとのインターフェースカスタマイズで一部修正する必要はあります。

めかのとろ

w5500.c/w5500.hはコントローラW5500で使用するマイコンとの送受信関数を定義してまとめたものです。

めかのとろ

socket.c/socket.hTCPソケット通信で使用する関数群をまとめたものです。バークレーソケット(BSDソケット)に準じた関数となっています。

めかのとろ

これらを最低限ドライバとしてioLibrary_driverフォルダ内に登録しておき、他はDHCPに関するものなど必要に応じて追加するのが良いと思います。

プロジェクトにドライバライブラリを追加登録

W5500のSPI通信とドライバのカスタマイズ

めかのとろ

LANコントローラW5500には書き込み/読み込み等の操作、IPアドレス等パラメータ、プロトコル指定など仕様を設定するためのコモンレジスタブロック、およびソケット通信で使用するソケットレジスタブロックがあります。

めかのとろ

レジスタの詳細はW5500の取説に解説しており、かなりきめ細かな設定ができるようになっていますが、一般的な用途では使用するのは一部だけです。

めかのとろ

これらのレジスタブロックを操作するためにSPI通信をインターフェースとしてマイコンとやり取りしますのでこの部分を確立できればほぼできたようなものです。

めかのとろ

ドライバのインターフェースのファイル(wizchip_func.c)に手を加えてSTM32マイコン仕様にするのはほんの一部だけです。実際のプログラミングにおいてはドライバ内で定義した関数が使用できますので一度ポイントを理解してしまえば手間はほとんどかかりません 。

めかのとろ

実際にどのような仕組みでレジスタを操作しているかを一度は取説を見ながらドライバ内の関数を順に追ってみるのがよいと思います。

W5500のSPIフレームフォーマット

めかのとろ

W5500でのspi通信のフレームフォーマットでは1バイト(8ビット)ごとのブロックで下図に示す3フェイズで構成されます。上位・下位2バイト分のアドレスフェイズ、1バイトのコントロールフェイズ、そしてデータフェイズです。

W5500のSPIフレームフォーマット
ドライバ(W5500.c)におけるSPIフレーム 

ドライバのカスタマイズ

めかのとろ

STM32マイコンで定義するSPI関連の関数(チップセレクト、送受信)をW5500ドライバに紐付けるためのカスタマイズです。

めかのとろ

SPIインターフェース(wizchip_conf.c)で下記の赤色で囲った部分を追加登録します。チップセレクト関数SPI_CS1_Select()/ SPI_CS1_Deselect() はSTM32Nucleo用に自作したものです。

SPIチップセレクト(wizchip_conf.c)
めかのとろ

自作した送受信関数SPI_Send_Receive() も同様に追加登録します。

SPI送受信関数 (wizchip_conf.c)
めかのとろ

内容が異なる場合は上図で追加定義したSPI送受信関数を下図のようにドライバ定義の関数に紐付けします。

めかのとろ

実際、ドライバに追加したり、書き換える重要な部分はこれだけです。その他、ビルドの際にそのままではエラーとなりますがインクルードするファイルパスを修正すればよいだけです。

めかのとろ

自作したSPI関連関数を定義したファイルをSPIインターフェース(wizchip_conf.c)のヘッダファイルにインクルードさせてリンクできるようにするのを忘れないでください。

  • wizchip_conf.h内 #include “W5500/w5500.h”を “W5500.h” に修正
  • wizchip_conf.h内 #include “net_func.h”(自作関数ファイル)を追加
  • w5500.h内 #include “Ethernet/wizchip_h.h”を “wizchip_h.h” に修正
  • socket.h内 #include “Ethernet/wizchip_h.h”を “wizchip_h.h” に修正
ポイント

SPIインターフェース(wizchip_conf.c)内で定義している関数wizchip_init()で変数iが符号付きint8_t iで宣言されていて、このままだと色々warningがでるので符号なしuint8_t iに変更しておいてください。

W5500初期設定

めかのとろ

SPI通信でのインターフェースが準備できたら実際のプログラミングではドライバ内で定義している関数を利用して初期設定をします。.

初期設定フロー

初期設定のフローチャート
めかのとろ

初期化フローチャートはプログラム内では下記のようにW5500_ini()関数にまとめています。レジスタ操作するための関数はドライバのヘッダファイルW5500.hで定義しています。

プログラムにおける初期設定と自作関数

初期化の動作詳細

めかのとろ

W5500はマルチキャストなど高度な設定もできますがここでは簡単なシングルキャストの基本設定で初期化をします。

めかのとろ

レジスタのリセット(MR_RST)発行を行い、PHY初期化、送信元(サーバー側)のMACアドレス、IPアドレス、そしてKeepAlive,タイムアウト等を登録します。

 ① モードレジスタMRの初期化 

MRレジスタ内のRSTビットを立ててリセットを実行。
実行関数: setMR(MR_RST)  

 ② PHY初期設定 

PHY設定をデフォルト値にリセット 
実行関数:
v=getPHYCFGR() & PHYCFGR_RST;
 setPHYCFGR(v);
v=getPHYCFGR() | ~PHYCFGR_RST;
 setPHYCFGR(v);

PHYモードはレジスタで細かく設定できますがここはピン43,44,45の回路設定 (すべてHi)を優先させ、標準的な自動ネゴシエーションがデフォルトになっています。

 ③ MACアドレス、IPアドレス、GWアドレス、サブネットマスクの設定 

setSHAR(MAC_address);//マックアドレス設定
setSIPR(IP_address); //IPアドレス設定
setGAR(GW_address); //ゲートウェイ設定
setSUBR(SUBNET_mask);//サブネットマスク設定

IPアドレスなど配列データを扱うので書き込みにWIZCHIP_WRITE_BUF()関数を使っています。 製品化する場合、MACアドレス以外は書き換えられるようにしてEEPROM等のメモリに保存したものを使用します。

 ④ KeepAlive, タイムアウトの設定 

setSn_KPALVTR(SN, 6);//KeepAlive設定
setRTR(2000);//タイムアウト設定
setRCR(8);//タイムアウトリトライ回数設定
setSIMR(0b00000010) ;//ソケット1 割り込みマスク有効;
setSn_IMR(SN, Sn_IR_TIMEOUT);//タイムアウト割り込みマスク
setSn_IR(SN,0x1f);// 割り込みフラグリセット

これらは必須のものではないですが使用状況に合わせて標準的なものを設定しておけばよいものです。 設定詳細はW5500データシート(英文)に記載しています。

プログラム全容

めかのとろ

これまでの初期設定を完了させるとネットワーク層までの通信環境が整ったことになります。プログラム全容は下記のようになります。

めかのとろ

初期化関数W5500_ini()やネット関連の自作関数等は別途モジュールnet_func.cにまとめていてそのヘッダファイルをインクルードしています。

プログラム全体概要

実際の動作確認

接続準備が整ったところでいよいよLANに接続してネットワークに参加します。ネットワークアドレスは使用環境により異なりますので実際のものに合わせてください。

LANに接続したNucleo-F103RB+W5500

めかのとろ

プログラムを実行させると、設定したIPアドレスに属するネットワークアドレスをもったLANに接続することができます。

めかのとろ

ここではネットワークアドレスが192.168.3でIPアドレスを192.168.3.100に設定しています。

PINGコマンドによる接続確認

めかのとろ

PCのコマンドプロンプト画面から「ping」コマンドを実行してネットワーク内で認識されているかを確認します。 “ping 192.168.3.100″と入力した場合の応答を確認します。

めかのとろ

下記のような画面の場合は何らかの原因で不備がありpingが通っていない状態を示しています。

めかのとろ

このような場合は大抵、ケーブルに不備があったり設定したIPアドレスと異なったものを入力していたり何らかの原因があります。

めかのとろ

プログラミング直後の初接続時にping応答がこのような場合はプログラムに何らかの不備がある可能性があるため、バグの原因を突き止めることになります。特にspi通信関連の動作確認とドライバ関連ファイルのパスは大切です。一度機能すれば大丈夫です。

めかのとろ

プログラムが正常に機能すると下の画面が現れます。この状態ではpingが通っているため、無事ネットワークに参加することができたことを示しています。

めかのとろ

pingコマンドICMPプロトコルのものなのでOSI参照モデルのネットワーク層まで通信システムが確立したことになります。

めかのとろ

pingコマンドだけでは通信チェック以外には何の仕事もできないのですが、ここまでのネットワークを確立できると、あとは上位のTCPプロトコルによるソケット通信やさらにその上位のHTTPプロトコルを搭載してwebサーバーを作成してブラウザからアクセスできるようになります。

めかのとろ

今回はIPアドレスはメモリに保存した固定値”192.168.3.100″を使用しています。ここでは解説しませんが、DHCP機能を搭載するとDHCPサーバーから自動的に割り当てられたIPアドレスを使用できるようになります。

めかのとろ

次回は上位プロトコルであるTCPを実装してソケット通信を実現します。

コラム

初めてネット接続を試みるとハードウェアとのからみがあるためpingが通るまでが大変ですが、一度pingが通ればネット通信はほぼ完成みたいなものです。ここまでくればあとはソフトウェアによりソケット通信やwebサーバー等に発展させていくことができます。

Follow me!