MSPM0G3519 - イーサネット (W5500)
概要
MSPM0G3519は、Arm Cortex-M0+コアを搭載した32ビットマイコンで、Texas Instruments社のMSPM0ファミリーに属する。
USB機能を内蔵し、豊富なペリフェラルと高性能を持つ上位モデルであるが、イーサネット機能は内蔵していないため、TCP/IP通信を行うには外付けのイーサネットコントローラICが必要となる。
W5500は、WIZnet社が開発したハードウェアTCP/IPスタック内蔵型イーサネットコントローラで、TCP/IPプロトコルの処理を全てIC内部で実行する。
このため、マイコン側ではソフトウェアTCP/IPスタック (lwIPやuIP等) を用意する必要がなく、シンプルなSPI通信によるソケットAPI呼び出しだけでTCP/IP通信が実現できる。
主な構成は以下の通りである。
- MSPM0G3519 (マイコン - Arm Cortex-M0+ベース、80[MHz]、512[KB] フラッシュROM、128[KB] SRAM)
- W5500 (ハードウェアTCP/IPスタック内蔵イーサネットコントローラ)
- SPIインターフェース (最大32MHz)
この構成により、MSPM0G3519の非常に豊富なメモリリソース (512[KB] デュアルバンクフラッシュROM、128[KB] SRAM) を活かして、複雑なTCP/IPスタックを実装することなく、
Webサーバ、HTTPクライアント、TCPソケット通信、UDPアプリケーション等を容易に実装できる。
さらに、Arm Cortex-M0+の高性能なアーキテクチャにより、アプリケーション処理とネットワーク通信を効率的に両立させることができる。
MSPM0G3519の特徴
MSPM0G3519は、Texas Instruments社の最新世代32ビットマイコンで、Arm Cortex-M0+コアを搭載している。
低消費電力設計と高性能なアーキテクチャ、大容量メモリを採用したモデルである。
MSPM0G3519の特徴を以下に示す。
- Arm Cortex-M0+ 32ビットプロセッサコア
- 最大80MHz動作周波数
- 512KB デュアルバンク フラッシュメモリ (誤り訂正符号ECC付き)
- OTA (Over-The-Air) 更新のためのアドレス スワップ機能を備えたデュアル バンク構成
- 128KB SRAM
- SRAM バンク 0 (64KB) : ECC保護機能またはハードウェア パリティを備え、スタンバイ モードまで保持可能
- SRAM バンク 1 (64KB) : STOPモードまで保持可能
- USB 2.0フルスピード (12[Mbps]) 対応
- 3つのSPIモジュール (1つは最大32[Mbit/s]動作)
- 2つの12ビットADC (最大4[Msps])
- 同時サンプリング対応
- 最大27の外部チャネル
- 1つの12ビット DAC (1[Msps])
- 2つのCAN-FDインターフェース
- CAN 2.0 A/B、CAN-FD対応
- 7つのUARTインターフェース
- 3つのI2Cインターフェース (FM+ 1[Mbit/s]対応)
- DMAコントローラ (12チャネル)
- 演算アクセラレータ (MATHACL)
- DIV、SQRT、MAC、TRIG計算をハードウェアで高速実行
- AES-128/256暗号化アクセラレータ
- GCM/GMAC、CCM/CBC-MAC、CBC、CTRモード対応
- 真性乱数生成器 (TRNG)
- タイマモジュール (16ビット、32ビット)
- 低消費電力設計 (複数の低電力モード)
- RUN : 123µA/[MHz]
- STANDBY : 1.7[µA] (32[kHz] RTC動作時)
- SHUTDOWN : 92[nA]
- 内蔵LDO (電源管理機能)
- 64ピン、80ピン、100ピンパッケージ
- 広い動作電圧範囲 (1.62[V]~3.6[V])
- 動作温度範囲 : -40[℃]~125[℃]
W5500実装に必要なリソース要件は以下の通りである。
- フラッシュメモリ
- 約8~15[KB] (W5500ドライバ + 基本的なアプリケーション)
- ソフトウェアTCP/IPスタック (lwIP : 40~60[KB]、uIP : 15~25[KB]) と比較して大幅に削減
- 512[KB]の大容量フラッシュにより、複雑なアプリケーションロジックやデータテーブルを格納可能
- SRAM
- 約2~5[KB] (バッファ + 変数 + スタック)
- ソフトウェアTCP/IPスタック (lwIP : 20~40[KB]、uIP : 4~8[KB]) と比較して大幅に削減
- 128[KB]の大容量SRAMにより、複数の同時接続や大容量バッファの実装が容易
MSPM0G3519は、512[KB] フラッシュROMと128[KB] SRAMという非常に豊富なメモリリソースを持つため、
W5500を使用した場合でも、極めて複雑なアプリケーション処理、複数の同時接続、大容量バッファ、高度なデータ処理が可能となる。
また、Arm Cortex-M0+の効率的な命令セットと80[MHz]の高速動作により、ネットワーク処理とアプリケーション処理の両立がより容易になる。
MSPM0G3519の主要仕様
MSPM0G3519の主要な仕様を以下の表に示す。
| 項目 | 仕様 |
|---|---|
| アーキテクチャ | 32ビットRISC (Arm Cortex-M0+) |
| 最大動作周波数 | 80[MHz] |
| フラッシュメモリ | 512[KB] (デュアルバンク、ECC保護) |
| SRAM | 128KB (64[KB] × 2バンク、ECC/パリティ保護) |
| SPI | 3モジュール (最大32[MHz]) |
| UART | 7モジュール |
| I2C | 3モジュール (FM+ 1[Mbit/s]対応) |
| ADC | 2個の12ビット 4[Msps] (同時サンプリング対応、最大27チャネル) |
| DAC | 1個の12ビット 1[Msps] |
| CAN | 2個のCAN-FD (CAN 2.0 A/B、CAN-FD対応) |
| 暗号化 | AES-128/256アクセラレータ TRNG (真性乱数生成器) |
| 演算アクセラレータ | MATHACL (DIV、SQRT、MAC、TRIG) |
| DMA | 12チャネル |
| 動作電圧 | 1.62[V]~3.6[V] |
| 動作温度範囲 | -40[℃]~125[℃] |
| パッケージ | 32~100ピン (LQFP、VQFN、nFBGA) |
| 開発環境 | Code Composer Studio MSPM0 SDK SysConfig |
MSPM0G3519とW5500を組み合わせるメリットは以下の通りである。
- 非常に豊富なメモリリソース
- 512[KB]のフラッシュメモリにより、大規模なアプリケーションコード、ルックアップテーブル、ファームウェアのデュアルバンク構成が可能
- 128[KB]のSRAMにより、非常に大きなバッファや複雑なデータ構造、複数の同時接続に対応可能
- ソフトウェアTCP/IPスタックを使用する場合でも、十分なメモリリソースが確保できる
- 高速SPI通信
- 最大32[MHz]のSPI動作により、W5500との通信が非常に高速化
- ネットワークスループットの最大化
- 2つのCAN-FDインターフェース
- 産業用通信、車載通信に最適
- W5500によるEthernet通信とCAN-FD通信を同時に実現可能
- ハードウェア暗号化機能
- AES-128/256アクセラレータにより、セキュアな通信が可能
- IoTデバイスのセキュリティ要件に対応
- Arm Cortex-M0+のエコシステム
- 豊富なツール、ライブラリ、サンプルコードが利用可能
- CMSIS (Cortex Microcontroller Software Interface Standard) 対応
- 将来性
- Armアーキテクチャは業界標準であり、将来的な拡張性が高い
- デュアルバンク フラッシュにより、OTA (Over-The-Air) ファームウェア更新が容易
W5500イーサネットコントローラ
WIZnet社のW5500は、ハードウェアTCP/IPスタック内蔵型イーサネットコントローラで、組み込みシステムにおけるイーサネット実装を大幅に簡素化する。
MSPM0G3519との組み合わせでは、その豊富なメモリリソースと高性能を最大限に活用できる。
- IEEE 802.3準拠の10/100BASE-TX Ethernetコントローラ
- ハードウェアTCP/IPプロトコルスタック内蔵
- TCP、UDP、IPv4、ICMP、ARP、IGMP、PPPoE対応
- SPIインターフェース (最大80[MHz])
- MSPM0G3519のSPIは最大32[MHz]のため、実用的には20~30[MHz]で動作
- 内蔵32KBのバッファメモリ
- 各ソケットに独立したバッファを割り当て可能
- MSPM0G3519の128[KB] SRAMと合わせて、合計160[KB]のメモリ空間を活用可能
- 8つの独立したハードウェアソケット
- TCP、UDP、MACRAW、PPPoEモードに対応
- 同時に8つの接続を処理可能
- MACおよびPHY機能を統合
- パケットフィルタリング機能
- ブロードキャスト、マルチキャスト、ユニキャストフィルタ
- Wake-on-LAN機能
- 低消費電力設計
- パワーダウンモード、省電力モード対応
- MSPM0G3519の低消費電力モードと組み合わせることで、IoTデバイスに最適
- 3.3[V]単一電源動作
- MSPM0G3519と同じ電圧で動作するため、レベル変換不要
- 48ピンLQFP、QFNパッケージ
MSPM0G3519との組み合わせにおけるメリット
- ソフトウェアTCP/IPスタック不要
- マイコンのメモリ使用量を大幅に削減
- lwIP (40~60[KB]フラッシュ、20~40[KB] SRAM) やuIP (15~25[KB]フラッシュ、4~8[KB] SRAM) が不要
- 512[KB]フラッシュと128[KB] SRAMの大部分を、アプリケーション処理に使用可能
- SPIインターフェースのため、配線が簡単
- 4本の信号線 (MOSI、MISO、SCLK、CS)
- MSPM0G3519の高速SPIモジュールを活用
- 100[Mbps]対応で高速通信が可能
- 豊富なサンプルコードとライブラリ
- WIZnet公式ライブラリ (ioLibrary_Driver) が利用可能
- Arm Cortex-M向けのサンプルコードも豊富
- MSPM0G3519の高速SPIで容易に接続可能
- 20~30[MHz]のSPI動作により、高いスループットを実現
- 複数のソケットを同時使用可能
- 1つのICで複数のTCP/UDP接続を処理
- Webサーバ、HTTPクライアント、MQTTクライアントを同時に動作させることも可能
- 豊富なメモリリソースの活用
- 128[KB] SRAMにより、各ソケットに大容量バッファを割り当て可能
- 複雑なデータ処理やプロトコル処理をマイコン側で実行可能
W5500は、その使いやすさと高機能性から、産業機器、IoTデバイス、ホームオートメーション、ビルディングオートメーション等、幅広い分野で採用されている。
特に、MSPM0G3519のような高性能かつ大容量メモリを持つマイコンとの組み合わせでは、W5500のハードウェアTCP/IPスタックが大きなアドバンテージとなる。
W5500とソフトウェアTCP/IPスタックの比較
下表に、W5500を使用する場合と、ソフトウェアTCP/IPスタック (lwIP、uIP) を使用する場合の比較を示す。
| 項目 | W5500 | lwIP | uIP |
|---|---|---|---|
| フラッシュメモリ使用量 | 8~15[KB] | 40~60[KB] | 15~25[KB] |
| SRAM使用量 | 2~5[KB] | 20~40[KB] | 4~8[KB] |
| CPU負荷 | 非常に低 | 高 | 中 |
| 実装難易度 | 低 | 高 | 中 |
| 通信速度 | 100[Mbps] | EthernetMAC依存 | EthernetMAC依存 |
| 同時接続数 | 8 (固定) | 設定可能 (2~50程度) |
設定可能 (1~10程度) |
| 部品コスト | 中~高 | 低 (MAC/PHYのみ) |
低 (MAC/PHYのみ) |
| カスタマイズ性 | 低 | 高 | 中 |
| デバッグ難易度 | 低 | 高 | 中 |
| 開発期間 | 短 | 長 | 中 |
MSPM0G3519でW5500を使用する主なメリットは以下の通りである。
- メモリ使用量の大幅な削減
- ソフトウェアTCP/IPスタックが不要なため、アプリケーション処理に多くのメモリを使用できる。
- 512[KB]フラッシュの大部分を、アプリケーションロジック、データテーブル、ファームウェア更新領域等に充てることができる。
- 128[KB] SRAMの大部分を、アプリケーション処理、大容量バッファ、複雑なアルゴリズム等に使用できる。
- 開発期間の短縮
- ソケットAPIを使用するだけで済むため、TCP/IPスタックの実装やデバッグが不要。
- WIZnet公式ライブラリを使用することで、さらに開発を加速できる。
- CPU負荷の大幅な軽減
- プロトコル処理がハードウェアで実行されるため、マイコンはアプリケーション処理に集中できる。
- 80[MHz]の高性能コアを、GUI処理、センサーデータ処理、制御アルゴリズム、暗号化処理等に活用できる。
- 安定性の向上
- ハードウェアTCP/IPスタックは、長年の実績があり、バグが少ない。
- プロトコルレベルのトラブルシューティングが不要。
- 予測可能な性能
- ハードウェア実装のため、性能が一定しており、リアルタイム性が求められるアプリケーションに適している。
一方、MSPM0G3519の豊富なメモリリソース (512[KB]フラッシュ、128[KB] SRAM) を活かして、ソフトウェアTCP/IPスタック (lwIP、uIP) を使用する選択肢もある。
- 低コスト
- 部品コストが低く、大量生産に適している。
- ENC28J60等の低価格なEthernet MAC/PHYを使用可能。
- 高いカスタマイズ性
- プロトコルスタックを自由にカスタマイズできる。
- 独自プロトコルの実装や、特殊な通信要件に対応可能。
- IPv6、mDNS、SNMP等の追加プロトコルを実装可能。
- 柔軟な接続数設定
- アプリケーションの要件に応じて、同時接続数を調整できる。
- MSPM0G3519の128[KB] SRAMにより、lwIPを使用しても20~50接続程度の同時接続が可能。
用途に応じて、適切なソリューションを選択することが重要である。
一般的なIoTアプリケーション、産業用Ethernet通信、Webサーバ等では、W5500を使用することで開発効率と安定性を大幅に向上させることができる。
一方、特殊なプロトコル要件や非常に多数の同時接続が必要な場合は、MSPM0G3519の豊富なメモリリソースを活かして、ソフトウェアTCP/IPスタックを検討する価値がある。
ハードウェア接続
MSPM0G3519とW5500は、SPIインターフェースで接続する。
MSPM0G3519は3つのSPIモジュールを持つため、用途に応じて適切なモジュールを選択できる。
以下では、SPI0モジュール (最大32[MHz]対応) を使用する接続例を示す。
| MSPM0G3519 | W5500 | 機能 | 説明 |
|---|---|---|---|
| PA16 (SPI0_PICO) | MOSI | SPI | マスター出力/スレーブ入力 |
| PA17 (SPI0_POCI) | MISO | SPI | マスター入力/スレーブ出力 |
| PA14 (SPI0_SCLK) | SCLK | SPI | シリアルクロック |
| PA15 (GPIO) | SCSn | 制御信号 | チップセレクト (アクティブLow) |
| PB20 (GPIO) | RSTn | 制御信号 | リセット信号 (アクティブLow) |
| PB21 (GPIO) | INTn | 割り込み | 割り込み信号 (アクティブLow、オプション) |
| VDD | AVDD DVDD |
電源 | 3.3V |
| GND | AGND DGND |
GND | グランド |
※注意
- ピン配置
- 上記のピン配置は一例であり、MSPM0G3519のパッケージや基板レイアウトに応じて変更可能。
- 詳細なピン配置については、MSPM0G3519のデータシートおよびピン配置図を参照すること。
- 水晶振動子
- W5500には25[MHz]の水晶振動子が必要 (ピン1、2に接続)
- 負荷容量は18pFを推奨
- W5500モジュールを使用する場合は、水晶振動子が既に実装されている場合が多い
- デカップリングコンデンサ
- 各電源ピン (AVDD、DVDD) 近くに0.1μFを配置
- さらに、10μFの電解コンデンサまたはセラミックコンデンサを電源ライン全体に配置することを推奨
- MSPM0G3519側も、各電源ピン近くに適切なデカップリングコンデンサを配置
- RJ45コネクタ
- トランス内蔵型を使用 (Hanrun HR911105A、Pulse J0011D21BNL等)
- センタータップは、W5500のデータシートに従って適切に接続
- リンクLEDおよびアクティビティLEDを接続することを推奨
- LEDインジケータ
- W5500はリンクステータスLED、アクティビティLEDの制御ピンを持つ
- 必要に応じてLEDを接続 (推奨抵抗値 : 510Ω)
- リセット回路
- W5500のRSTnピンには外部プルアップ抵抗 (10kΩ) を接続
- 電源投入時の安定動作のため、RCリセット回路を追加することを推奨
- MSPM0G3519のGPIOピンから制御可能
- 電源電圧
- MSPM0G3519とW5500は共に3.3V動作のため、レベル変換回路は不要
- ただし、電源の安定性を確保するため、適切なレギュレータとデカップリングコンデンサを使用すること
SPIインターフェースは、MSPM0G3519のSPI0モジュールを使用する。
MSPM0G3519のSPI0モジュールは、最大32[MHz]の高速通信に対応しており、W5500との通信において十分な帯域幅を確保できる。
実用的には、信号品質と基板レイアウトを考慮して、20~30[MHz]程度のSPIクロックを使用することを推奨する。
制御信号 (SCSn、RSTn) および 割り込み信号 (INTn) は任意のGPIOピンに接続できる。
割り込み機能を使用する場合は、外部割り込み対応ピンを選択する必要があるが、ポーリング方式でも十分に動作する。
MSPM0G3519の80[MHz]高速動作により、ポーリング方式でもCPU負荷は非常に低く抑えられる。
ソフトウェア構成
MSPM0G3519でW5500を使用する場合、TI MSPM0 SDKとWIZnet公式ライブラリ (ioLibrary_Driver) を組み合わせて使用する。
ソフトウェアの階層構造を以下に示す。
- アプリケーション層
- ユーザアプリケーション (Webサーバ、HTTPクライアント、MQTTクライアント等)
- ソケットAPI層
- socket()、connect()、listen()、send()、recv()等のソケット関数
- Berkeley Socketに似たインターフェース
- WIZnet公式ライブラリ (socket.c / socket.h)
- W5500ドライバ層
- レジスタアクセス関数
- ソケットレジスタ、共通レジスタの読み書き
- WIZnet公式ライブラリ (w5500.c / w5500.h)
- SPI通信層 (ハードウェア抽象化層)
- SPIバイト送受信関数 (ハードウェア依存)
- MSPM0G3519のSPI0モジュールを使用
- 開発者が実装する部分
- MSPM0 SDK DriverLib
- TIが提供するペリフェラルドライバライブラリ
- SPI、GPIO、タイマ等の低レベルドライバ
主要なソースファイルを以下に示す。
- w5500.c / w5500.h
- W5500レジスタアクセス関数
- ソケット制御、ネットワーク設定
- WIZnet公式ライブラリから取得
- socket.c / socket.h
- ソケットAPI実装
- TCP/UDP通信用の高レベル関数
- WIZnet公式ライブラリから取得
- wizchip_conf.c / wizchip_conf.h
- W5500設定と初期化
- バッファサイズ設定、SPI関数登録
- WIZnet公式ライブラリから取得
- mspm0_spi_w5500.c / mspm0_spi_w5500.h (開発者が作成する部分)
- MSPM0G3519用SPI通信実装 (ハードウェア依存)
- W5500とのインターフェース関数
- main.c
- メイン処理
- システム初期化、アプリケーション処理
この階層構造により、W5500のコア機能とハードウェア依存部分が明確に分離されている。
MSPM0G3519で使用するには、主にSPI通信層 (mspm0_spi_w5500.c) を開発する必要がある。
これは、TI MSPM0 SDKのDriverLibを使用することで、比較的容易に実装できる。
W5500の公式ライブラリおよび開発ツールは以下から入手可能である。
- WIZnet ioLibrary_Driver
- W5500データシート
- TI MSPM0 SDK
- Code Composer Studio (CCS)
サンプルコード
以下の例では、MSPM0G3519とW5500を使用したTCPサーバ (Webサーバ) の構築している。
TI MSPM0 SDKのDriverLibを使用してSPI通信を実装、WIZnet公式ライブラリを使用してW5500を制御している。
ソフトウェアTCP/IPスタック (lwIPやuIP) は一切使用せず、W5500のハードウェアTCP/IPスタックとソケットAPIのみで実装している。
システムコンフィグレーション (ti_msp_dl_config.c / ti_msp_dl_config.h)
これは、MSPM0G3519のペリフェラル設定を行う基盤となる部分である。
TI SysConfigツールを使用して、MSPM0G3519のペリフェラル設定を自動生成する。
SPI設定では、W5500のSPIモード (CPOL = 0、CPHA = 0) に合わせて、DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0を指定している。
SPIクロック速度は、MSPM0G3519の80[MHz]システムクロックを4分周して20[MHz]に設定しているが、基板レイアウトや配線品質に応じて最大32[MHz]まで高速化可能である。
高速SPI通信により、W5500の100[Mbps]イーサネット通信を効率的に処理することができる。
GPIO設定では、チップセレクト (CS) と リセット (RST) ピンを出力として設定し、初期値をHighに設定している。
これにより、W5500が非選択状態かつ動作状態で起動する。
割り込みピン (INT) はオプションであり、ポーリング方式でも十分に動作するが、割り込み方式を使用する場合は外部割り込み機能を有効にできる。
// ti_msp_dl_config.h の一部 (参考例)
// 実際にはSysConfigツールで自動生成される
#ifndef TI_MSP_DL_CONFIG_H_
#define TI_MSP_DL_CONFIG_H_
#include <ti/driverlib/driverlib.h>
#include <ti/driverlib/m0p/dl_core.h>
// SPI0の設定
#define SPI_W5500_INST SPI0
#define SPI_W5500_INST_IRQHandler SPI0_IRQHandler
#define SPI_W5500_INST_INT_IRQN SPI0_INT_IRQn
#define GPIO_SPI_W5500_PICO_PORT GPIOA
#define GPIO_SPI_W5500_PICO_PIN DL_GPIO_PIN_16
#define GPIO_SPI_W5500_POCI_PORT GPIOA
#define GPIO_SPI_W5500_POCI_PIN DL_GPIO_PIN_17
#define GPIO_SPI_W5500_SCLK_PORT GPIOA
#define GPIO_SPI_W5500_SCLK_PIN DL_GPIO_PIN_14
// GPIOピン設定 (チップセレクト、リセット)
#define GPIO_W5500_CS_PORT GPIOA
#define GPIO_W5500_CS_PIN DL_GPIO_PIN_15
#define GPIO_W5500_RST_PORT GPIOB
#define GPIO_W5500_RST_PIN DL_GPIO_PIN_20
#define GPIO_W5500_INT_PORT GPIOB
#define GPIO_W5500_INT_PIN DL_GPIO_PIN_21
// 関数プロトタイプ
void SYSCFG_DL_init(void);
void SYSCFG_DL_initPower(void);
void SYSCFG_DL_SPI_W5500_init(void);
void SYSCFG_DL_GPIO_init(void);
#endif /* TI_MSP_DL_CONFIG_H_ */
// ti_msp_dl_config.c の一部 (参考例)
// 実際にはSysConfigツールで自動生成される
#include "ti_msp_dl_config.h"
// SPI0の初期化 (20[MHz]動作を想定)
void SYSCFG_DL_SPI_W5500_init(void)
{
// SPI0のクロック有効化
DL_SPI_reset(SPI_W5500_INST);
DL_SPI_enablePower(SPI_W5500_INST);
delay_cycles(POWER_STARTUP_DELAY);
// SPI設定 (コントローラモード、20[MHz]、CPOL=0、CPHA=0)
// 80[MHz] / 4 = 20[MHz]
DL_SPI_setClockConfig(SPI_W5500_INST, (DL_SPI_CLOCK_DIVIDE_RATIO_4 | DL_SPI_CLOCK_SOURCE_MFCLK));
DL_SPI_Config spiConfig = {
.mode = DL_SPI_MODE_CONTROLLER,
.frameFormat = DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0,
.parity = DL_SPI_PARITY_NONE,
.dataSize = DL_SPI_DATA_SIZE_8,
.bitOrder = DL_SPI_BIT_ORDER_MSB_FIRST,
.chipSelectPin = DL_SPI_CHIP_SELECT_NONE, // ソフトウェア制御
};
DL_SPI_init(SPI_W5500_INST, &spiConfig);
DL_SPI_enable(SPI_W5500_INST);
}
// GPIO初期化
void SYSCFG_DL_GPIO_init(void)
{
// GPIOクロック有効化
DL_GPIO_reset(GPIOA);
DL_GPIO_reset(GPIOB);
DL_GPIO_enablePower(GPIOA);
DL_GPIO_enablePower(GPIOB);
delay_cycles(POWER_STARTUP_DELAY);
// SPI0ピン設定
DL_GPIO_initPeripheralOutputFunction(GPIO_SPI_W5500_SCLK_IOMUX, GPIO_SPI_W5500_SCLK_IOMUX_FUNC);
DL_GPIO_initPeripheralOutputFunction(GPIO_SPI_W5500_PICO_IOMUX, GPIO_SPI_W5500_PICO_IOMUX_FUNC);
DL_GPIO_initPeripheralInputFunction(GPIO_SPI_W5500_POCI_IOMUX, GPIO_SPI_W5500_POCI_IOMUX_FUNC);
// チップセレクトピン (出力、初期値High)
DL_GPIO_initDigitalOutput(GPIO_W5500_CS_IOMUX);
DL_GPIO_setPins(GPIO_W5500_CS_PORT, GPIO_W5500_CS_PIN);
DL_GPIO_enableOutput(GPIO_W5500_CS_PORT, GPIO_W5500_CS_PIN);
// リセットピン (出力、初期値High)
DL_GPIO_initDigitalOutput(GPIO_W5500_RST_IOMUX);
DL_GPIO_setPins(GPIO_W5500_RST_PORT, GPIO_W5500_RST_PIN);
DL_GPIO_enableOutput(GPIO_W5500_RST_PORT, GPIO_W5500_RST_PIN);
// 割り込みピン (入力、プルアップ、オプション)
DL_GPIO_initDigitalInputFeatures(GPIO_W5500_INT_IOMUX, DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP, DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);
}
// 電源管理初期化
void SYSCFG_DL_initPower(void)
{
DL_GPIO_reset(GPIOA);
DL_GPIO_reset(GPIOB);
DL_GPIO_enablePower(GPIOA);
DL_GPIO_enablePower(GPIOB);
DL_SPI_reset(SPI_W5500_INST);
DL_SPI_enablePower(SPI_W5500_INST);
delay_cycles(POWER_STARTUP_DELAY);
}
// システム全体の初期化
void SYSCFG_DL_init(void)
{
SYSCFG_DL_initPower();
SYSCFG_DL_GPIO_init();
SYSCFG_DL_SPI_W5500_init();
}
SPI通信層 (mspm0_spi_w5500.c / mspm0_spi_w5500.h)
以下の例では、WIZnet公式ライブラリとMSPM0G3519のハードウェアを橋渡しするインターフェースを定義している。
SPI通信層は、MSPM0G3519とW5500におけるハードウェア依存部分である。
WIZnet公式ライブラリは、ハードウェアに依存しないポータブルなコードとして設計されており、このSPI通信層を通じて特定のマイコンのハードウェアにアクセスする。
開発者は、このSPI通信層を開発すれば、残りのW5500ドライバとソケットAPIは公式ライブラリをそのまま使用することができる。
- spi_transfer_byte関数
- 送信データをTXバッファに書き込み、送信完了を待機してから受信データを読み出すブロッキング方式を採用している。
- MSPM0G3519の80[MHz]クロックとSPI0モジュールの最大32[MHz]対応により、ブロッキング方式でも十分な性能が得られる。
- 以下の例では、20[MHz]で動作させているが、基板レイアウトや配線品質に応じて最大32[MHz]まで高速化可能であり、これにより100[Mbps]のイーサネット通信を効率的に処理できる。
- W5500_HardwareReset関数
- W5500のリセットシーケンスである。
- W5500のデータシートでは、リセット信号を最低1[ms]間Lowに保持する必要があるが、安全のため10[ms]に設定している。
- また、リセット解除後は、W5500が完全に起動するまで約100~200[ms]の待機時間が必要であるため、200[ms]の待機時間を設けている。
- この起動時間を守らないと、W5500のレジスタアクセスが失敗する原因となるため、注意が必要である。
- wizchip_select関数 / wizchip_deselect関数
- W5500とのSPI通信の開始と終了を制御する。
- W5500は、チップセレクト信号がLowの間だけSPI通信を受け付けるため、これらの関数を呼び出すことにより、W5500との通信を確実に行うことができる。
- wizchip_read_burst関数 / wizchip_write_burst関数
- 連続したデータの読み書きを効率的に行うための関数である。
- W5500のバッファメモリへのアクセスでは、複数バイトのデータを連続して読み書きすることが多いため、これらのバースト転送関数により通信のオーバーヘッドを最小限に抑えることができる。
// mspm0_spi_w5500.h
#ifndef MSPM0_SPI_W5500_H_
#define MSPM0_SPI_W5500_H_
#include <stdint.h>
#include "ti_msp_dl_config.h"
// W5500ハードウェア制御関数
void W5500_HardwareInit(void);
void W5500_HardwareReset(void);
// W5500 SPI通信関数 (WIZnet ioLibraryから呼び出される)
void wizchip_select(void);
void wizchip_deselect(void);
uint8_t wizchip_read(void);
void wizchip_write(uint8_t wb);
void wizchip_read_burst(uint8_t* pBuf, uint16_t len);
void wizchip_write_burst(uint8_t* pBuf, uint16_t len);
// ユーティリティ関数
void delay_ms(uint32_t ms);
#endif /* MSPM0_SPI_W5500_H_ */
// mspm0_spi_w5500.c
#include "mspm0_spi_w5500.h"
#include "ti_msp_dl_config.h"
// チップセレクト制御マクロ
#define W5500_CS_LOW() DL_GPIO_clearPins(GPIO_W5500_CS_PORT, GPIO_W5500_CS_PIN)
#define W5500_CS_HIGH() DL_GPIO_setPins(GPIO_W5500_CS_PORT, GPIO_W5500_CS_PIN)
// リセット制御マクロ
#define W5500_RST_LOW() DL_GPIO_clearPins(GPIO_W5500_RST_PORT, GPIO_W5500_RST_PIN)
#define W5500_RST_HIGH() DL_GPIO_setPins(GPIO_W5500_RST_PORT, GPIO_W5500_RST_PIN)
// SPIバイト送受信 (ブロッキング方式)
static uint8_t spi_transfer_byte(uint8_t data)
{
// 送信データをTXバッファに書き込み
DL_SPI_transmitData8(SPI_W5500_INST, data);
// 送信完了待機
while (DL_SPI_isBusy(SPI_W5500_INST));
// 受信データを読み出し
return DL_SPI_receiveData8(SPI_W5500_INST);
}
// ミリ秒単位の遅延関数 (80[MHz]動作を想定)
void delay_ms(uint32_t ms)
{
// 1ms = 80,000クロックサイクル (80[MHz]時)
// 簡易的な実装 (より正確な実装にはタイマを使用)
while (ms--) {
delay_cycles(80000);
}
}
// W5500ハードウェア初期化
void W5500_HardwareInit(void)
{
// チップセレクトを非アクティブ (High) に設定
W5500_CS_HIGH();
// リセットピンをHighに設定 (動作状態)
W5500_RST_HIGH();
delay_ms(1);
}
// W5500ハードウェアリセット
void W5500_HardwareReset(void)
{
// リセット信号をLowにして、W5500をリセット
W5500_RST_LOW();
delay_ms(10); // リセット期間 (最低1ms、余裕を持って10ms)
// リセット解除
W5500_RST_HIGH();
delay_ms(200); // W5500起動待機 (データシート推奨値)
}
// W5500チップセレクト開始 (SPI通信開始)
void wizchip_select(void)
{
W5500_CS_LOW();
}
// W5500チップセレクト終了 (SPI通信終了)
void wizchip_deselect(void)
{
W5500_CS_HIGH();
}
// W5500から1バイト読み出し
uint8_t wizchip_read(void)
{
return spi_transfer_byte(0x00); // ダミーデータ送信、受信データを返す
}
// W5500へ1バイト書き込み
void wizchip_write(uint8_t wb)
{
spi_transfer_byte(wb);
}
// W5500からバースト読み出し (連続データ受信)
void wizchip_read_burst(uint8_t* pBuf, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i++) {
pBuf[i] = spi_transfer_byte(0x00);
}
}
// W5500へバースト書き込み (連続データ送信)
void wizchip_write_burst(uint8_t* pBuf, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i++) {
spi_transfer_byte(pBuf[i]);
}
}
W5500初期化とネットワーク設定 (w5500_app.c / w5500_app.h)
W5500の初期化とネットワーク設定を行う高レベル関数のヘッダファイルである。
- W5500_Init関数
- WIZnet公式ライブラリにSPI通信関数を登録する。
- (reg_wizchip_cs_cbfunc関数、reg_wizchip_spi_cbfunc関数、reg_wizchip_spiburst_cbfunc関数により、上記のSPI通信層で定義した関数をWIZnet公式ライブラリに登録している)
- これにより、WIZnet公式ライブラリは、マイコンに依存しない形でW5500を制御できるようになる。
- 開発者はハードウェア依存部分 (SPI通信層) のみを定義すれば、残りの部分は公式ライブラリをそのまま使用できる。
- W5500の内蔵32[KB]バッファメモリは、8つのソケット間で分配される。
- 以下の例では、各ソケットに送信バッファ2[KB]、受信バッファ2[KB]を割り当てており、合計で8ソケット×4[KB] = 32[KB]となる。
- この設定は、一般的なIoTアプリケーションに適しているが、特定のソケットに大きなバッファを割り当てる必要がある場合は、他のソケットのバッファを小さくすることで調整できる。
- 例えば、ソケット0に送信バッファ8KB、受信バッファ8KBを割り当て、他の7つのソケットには各1KBずつ割り当てることも可能である。
- ctlwizchip関数
- W5500チップ全体を初期化して、バッファサイズを設定する。
- 以下の例では、簡易的に無限ループを使用して停止しているが、実務ではエラー情報をログに記録、または、LEDで通知する等のエラー処理を記述することを推奨する。
- W5500_SetNetworkInfo関数 / W5500_GetNetworkInfo関数
- W5500のネットワーク設定を行う。
- これにより、MACアドレス、IPアドレス、サブネットマスク、ゲートウェイアドレスを一括して設定・取得できる。
- WIZnet公式ライブラリのctlnetwork関数を使用しており、内部ではW5500の各種レジスタに対して適切な値を書き込んでいる。
// w5500_app.h
#ifndef W5500_APP_H_
#define W5500_APP_H_
#include <stdint.h>
// ネットワーク設定構造体
typedef struct {
uint8_t mac[6]; // MACアドレス
uint8_t ip[4]; // IPアドレス
uint8_t subnet[4]; // サブネットマスク
uint8_t gateway[4]; // ゲートウェイアドレス
} wiz_NetInfo;
// W5500初期化関数
void W5500_Init(void);
void W5500_SetNetworkInfo(wiz_NetInfo* netinfo);
void W5500_GetNetworkInfo(wiz_NetInfo* netinfo);
#endif /* W5500_APP_H_ */
// w5500_app.c
#include "w5500_app.h"
#include "mspm0_spi_w5500.h"
#include "wizchip_conf.h" // WIZnet公式ライブラリ
#include "w5500.h" // WIZnet公式ライブラリ
#include <string.h>
// W5500の初期化
void W5500_Init(void)
{
uint8_t memsize[2][8] = {{2, 2, 2, 2, 2, 2, 2, 2}, // TX バッファ: 各ソケット2[KB]
{2, 2, 2, 2, 2, 2, 2, 2}}; // RX バッファ: 各ソケット2[KB]
// ハードウェア初期化
W5500_HardwareInit();
// ハードウェアリセット実行
W5500_HardwareReset();
// WIZnetライブラリにSPI関数を登録
reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
reg_wizchip_spi_cbfunc(wizchip_read, wizchip_write);
reg_wizchip_spiburst_cbfunc(wizchip_read_burst, wizchip_write_burst);
// W5500チップ初期化
if (ctlwizchip(CW_INIT_WIZCHIP, (void*)memsize) == -1) {
// 初期化エラー処理
while (1); // エラーで停止 (実際のアプリケーションでは適切なエラー処理を実装)
}
}
// ネットワーク情報設定
void W5500_SetNetworkInfo(wiz_NetInfo* netinfo)
{
ctlnetwork(CN_SET_NETINFO, (void*)netinfo);
}
// ネットワーク情報取得
void W5500_GetNetworkInfo(wiz_NetInfo* netinfo)
{
ctlnetwork(CN_GET_NETINFO, (void*)netinfo);
}
HTTPサーバアプリケーション (http_server / http_server.h)
WIZnet公式ライブラリのソケットAPIを使用して、TCP通信を実装している。
W5500がハードウェアでTCP/IP処理を実行するため、マイコン側では、socket関数、listen関数、send関数、recv関数等のソケットAPIを呼び出すだけでネットワーク通信が実現できる。
この方式により、以下に示す大きなメリットが得られる。
- メモリ使用量の削減
- W5500を使用する場合、8~15[KB]程度のフラッシュROM と 2~5[KB]程度のSRAMで済む。
- CPU負荷の軽減
- TCP/IPプロトコル処理がW5500のハードウェアで実行されるため、MSPM0G3519はアプリケーション処理に集中できる。
- 例えば、80[MHz]動作では、ネットワーク処理のCPU負荷は極めて低く、残りのCPUリソースをセンサデータ処理、制御アルゴリズム、暗号化処理、機械学習推論等に活用できる。
HTTP_Server_Process関数の動作フローにおいて、ソケットの状態遷移に応じて処理を行う。
この状態遷移処理により、TCPの複雑なプロトコル処理をW5500に任せつつ、アプリケーション側ではソケットAPI呼び出しのみで済む。
- SOCK_CLOSED状態
- 新たにソケットをオープンしてリッスンを開始する。
- SOCK_ESTABLISHED状態
- クライアントとの接続が確立しているため、データ受信を確認し、GETリクエストに対してHTMLレスポンスを送信する。
- SOCK_CLOSE_WAIT状態
- クライアント側から切断要求を受信しているため、残りのデータを受信してから切断処理を行う。
// http_server.h
#ifndef HTTP_SERVER_H_
#define HTTP_SERVER_H_
#include <stdint.h>
#define HTTP_SERVER_PORT 80
#define HTTP_SOCKET 0
// HTTPサーバ処理関数
void HTTP_Server_Init(void);
void HTTP_Server_Process(void);
#endif /* HTTP_SERVER_H_ */
// http_server.c
#include "http_server.h"
#include "socket.h" // WIZnet公式ライブラリ
#include <string.h>
#include <stdio.h>
// HTTPレスポンス用バッファ
// MSPM0G3519の豊富な128[KB] SRAMを活かして、大容量バッファを確保可能
static uint8_t rx_buffer[2048]; // 受信バッファ : 2[KB]
static uint8_t tx_buffer[4096]; // 送信バッファ : 4[KB]
// HTTPレスポンステンプレート
static const char http_response_template[] =
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n"
"Connection: close\r\n"
"\r\n"
"<!DOCTYPE html>"
"<html lang=\"ja\">"
"<head>"
"<meta charset=\"UTF-8\">"
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">"
"<title>MSPM0G3519 + W5500 Server</title>"
"<style>"
"body { font-family: Arial, sans-serif; margin: 40px; background-color: #f0f0f0; }"
"h1 { color: #cc0000; }"
".container { background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }"
".info { margin: 20px 0; padding: 10px; background-color: #e7f3ff; border-left: 4px solid #2196F3; }"
".memory { margin: 20px 0; padding: 10px; background-color: #e8f5e9; border-left: 4px solid #4CAF50; }"
"ul { line-height: 1.8; }"
"</style>"
"</head>"
"<body>"
"<div class=\"container\">"
"<h1>Welcome to MSPM0G3519 Web Server!</h1>"
"<div class=\"info\">"
"<p><strong>マイコン:</strong> TI MSPM0G3519 (Arm Cortex-M0+, 80[MHz])</p>"
"<p><strong>イーサネットコントローラ:</strong> WIZnet W5500</p>"
"<p><strong>TCP/IPスタック:</strong> ハードウェア実装 (W5500内蔵) </p>"
"</div>"
"<div class=\"memory\">"
"<h3>メモリリソース</h3>"
"<p><strong>フラッシュROM:</strong> 512[KB] デュアルバンク (ECC保護) </p>"
"<p><strong>SRAM:</strong> 128[KB] (64[KB]×2バンク、ECC/パリティ保護) </p>"
"<p><strong>W5500バッファ:</strong> 32[KB] (内蔵) </p>"
"</div>"
"<h2>システム特徴</h2>"
"<ul>"
"<li>ソフトウェアTCP/IPスタック不要 (lwIP/uIP不要) </li>"
"<li>SPI通信 (最大32[MHz]) によるシンプルな実装</li>"
"<li>低CPU負荷で高速ネットワーク通信</li>"
"<li>512[KB] フラッシュ + 128[KB] SRAMの大容量メモリ</li>"
"<li>8つの同時ソケット接続対応</li>"
"<li>2つのCAN-FDインターフェース搭載</li>"
"<li>AES-128/256暗号化アクセラレータ搭載</li>"
"<li>OTA (Over-The-Air) ファームウェア更新対応</li>"
"</ul>"
"<p style=\"margin-top: 30px; color: #666; font-size: 14px;\">"
"このページは、MSPM0G3519マイコン (512[KB] Flash, 128[KB] SRAM) とW5500イーサネットコントローラによって生成されています。"
"</p>"
"</div>"
"</body>"
"</html>";
// HTTPサーバ初期化
void HTTP_Server_Init(void)
{
// ソケット初期化 (特別な処理は不要)
// W5500の初期化時に全ソケットが自動的に初期化される
}
// HTTPサーバ処理 (メインループから定期的に呼び出される)
void HTTP_Server_Process(void)
{
int32_t ret;
uint8_t status;
// ソケットステータス取得
status = getSn_SR(HTTP_SOCKET);
switch (status) {
case SOCK_CLOSED:
// ソケットがクローズ状態の場合、新たにオープンしてリッスン開始
if (socket(HTTP_SOCKET, Sn_MR_TCP, HTTP_SERVER_PORT, 0) == HTTP_SOCKET) {
// ソケットオープン成功
listen(HTTP_SOCKET); // リッスン開始
}
break;
case SOCK_ESTABLISHED:
// クライアントとの接続が確立した状態
// データ受信確認
if (getSn_RX_RSR(HTTP_SOCKET) > 0) {
// データ受信 (大容量バッファを活用)
ret = recv(HTTP_SOCKET, rx_buffer, sizeof(rx_buffer));
if (ret > 0) {
// 受信データをNULL終端
if (ret < sizeof(rx_buffer)) {
rx_buffer[ret] = '\0';
}
// GETリクエストかどうかチェック
if (strncmp((char*)rx_buffer, "GET ", 4) == 0) {
// HTTPレスポンス送信 (大容量バッファを活用)
strcpy((char*)tx_buffer, http_response_template);
send(HTTP_SOCKET, tx_buffer, strlen((char*)tx_buffer));
// レスポンス送信後、切断処理
disconnect(HTTP_SOCKET);
}
}
}
break;
case SOCK_CLOSE_WAIT:
// クライアント側から切断要求を受信
if (getSn_RX_RSR(HTTP_SOCKET) > 0) {
// 残りのデータを受信
recv(HTTP_SOCKET, rx_buffer, sizeof(rx_buffer));
}
// 切断処理
disconnect(HTTP_SOCKET);
break;
default:
break;
}
}
メイン処理 (main.c)
メイン処理では、システムの初期化、W5500の初期化、ネットワーク設定を行った後、メインループでHTTPサーバ処理を実行する。
W5500を使用する場合、ソフトウェアTCP/IPスタックのタスク処理やタイマ処理は一切不要であり、シンプルな構成となっている。
W5500のハードウェアTCP/IPスタックによりネットワーク処理のCPU負荷が極めて低いため、メイン処理で複雑な処理を行うことができる。
センサデータ読み取り、制御処理、CAN-FD通信処理、データロギング、暗号化処理、ディスプレイ更新、モータ制御等の処理を同時に実行できる。
また、8つの独立したソケットにより、HTTPサーバ、MQTTクライアント、Modbus TCPサーバ等、複数のネットワークサービスを同時に提供することも可能である。
// main.c
#include "ti_msp_dl_config.h"
#include "mspm0_spi_w5500.h"
#include "w5500_app.h"
#include "http_server.h"
#include <stdint.h>
// ネットワーク設定 (環境に合わせて変更)
#define MAC_ADDR {0x00, 0x08, 0xDC, 0xAB, 0xCD, 0xEF}
#define IP_ADDR {192, 168, 1, 100}
#define SUBNET {255, 255, 255, 0}
#define GATEWAY {192, 168, 1, 1}
int main(void)
{
wiz_NetInfo netinfo;
// システム初期化 (クロック、GPIO、SPI等)
SYSCFG_DL_init();
// W5500ハードウェアおよびドライバ初期化
W5500_Init();
// ネットワーク設定
uint8_t mac[6] = MAC_ADDR;
uint8_t ip[4] = IP_ADDR;
uint8_t subnet[4] = SUBNET;
uint8_t gateway[4] = GATEWAY;
memcpy(netinfo.mac, mac, 6);
memcpy(netinfo.ip, ip, 4);
memcpy(netinfo.subnet, subnet, 4);
memcpy(netinfo.gateway, gateway, 4);
W5500_SetNetworkInfo(&netinfo);
// 設定確認 (オプション、デバッグ用)
wiz_NetInfo read_netinfo;
W5500_GetNetworkInfo(&read_netinfo);
// HTTPサーバ初期化
HTTP_Server_Init();
// メインループ
while (1) {
// HTTPサーバ処理
// W5500がハードウェアでTCP/IP処理を実行するため、この関数呼び出しによりWebサーバが動作する
HTTP_Server_Process();
// CPU負荷軽減のための短い遅延
// W5500がハードウェア処理を行うため、ポーリング間隔は長めでも問題ない
delay_cycles(10000); // 約0.125ms @ 80[MHz]
// MSPM0G3519の豊富なメモリリソース (512[KB] Flash, 128[KB] SRAM) を活かして、他のアプリケーション処理をここに追加可能
// 例 :
// - センサデータ読み取り (2つの12ビット 4[Msps] ADCを活用)
// - 制御処理 (演算アクセラレータMATHACLを活用)
// - CAN-FD通信処理 (2つのCAN-FDインターフェースを活用)
// - データロギング (512[KB]フラッシュを活用)
// - 暗号化処理 (AES-128/256アクセラレータを活用)
// - ディスプレイ更新
// - モータ制御
}
}
応用例
MSPM0G3519とW5500の組み合わせは、基本的なWebサーバだけでなく、様々な応用が可能である。
特に、MSPM0G3519の豊富なメモリリソース (512[KB] フラッシュ、128[KB] SRAM) を活かした高度なアプリケーションが実現できる。
産業用IoTゲートウェイ
MSPM0G3519の2つのCAN-FDインターフェース、7つのUART、3つのI2C、3つのSPIを使用して、多様なセンサやアクチュエータと通信し、W5500経由でクラウドサーバへデータを送信する産業用IoTゲートウェイを構築できる。
- 512[KB] フラッシュROMにより、複雑なプロトコル変換やデータ処理ロジックを実装できる。
- 128[KB] SRAMにより、大量のセンサデータをバッファリングし、効率的にクラウドへ送信できる。
- AES-128/256暗号化アクセラレータにより、セキュアな通信が実現できる。
Webサーバ
MSPM0G3519の豊富なメモリリソースを活かして、以下に示すようなWebサーバを構築することができる。
- 複数のHTMLページ、CSS、JavaScript、画像等の静的コンテンツを512[KB]フラッシュROMに格納
- 128[KB] SRAMを活用した大容量セッション管理
- AES暗号化によるHTTPS通信 (mbedTLSライブラリを使用)
- WebSocketによるリアルタイム双方向通信
- RESTful APIサーバ (JSON形式でのデータ送受信)
- Server-Sent Events (SSE) によるサーバープッシュ
データロガー with OTA更新
MSPM0G3519の2つの12ビット 4[Msps] ADCを使用してセンサデータを高速サンプリングし、512[KB]フラッシュROMにデータを記録するデータロガーを構築できる。
- W5500経由でネットワーク経由でデータを取得できるHTTPファイルサーバを実装。
- デュアルバンクフラッシュにより、動作中でもOTA (Over-The-Air) ファームウェア更新が可能。
- 128[KB] SRAMにより、大容量の循環バッファを実装し、高速サンプリングデータを一時保存可能。
CAN-FD to Ethernet ゲートウェイ
MSPM0G3519の2つのCAN-FDインターフェースとW5500のEthernetを組み合わせて、CAN-FD to Ethernetゲートウェイを構築できる。
- 車載ネットワークや産業用ネットワークのデータをEthernet経由でクラウドや管理システムに送信。
- 512[KB] フラッシュROMにより、複雑なプロトコル変換ロジックやルーティングテーブルを実装可能。
- 128[KB] SRAMにより、大量のCANメッセージをバッファリング可能。
エッジAI対応IoTデバイス
MSPM0G3519の演算アクセラレータ (MATHACL) と豊富なメモリリソースを活用して、エッジAIを実装したIoTデバイスを構築できる。
- 512[KB] フラッシュROMに機械学習モデル (ニューラルネットワークの重みパラメータ等) を格納
- 128[KB] SRAMを活用した推論処理 (画像認識、音声認識、異常検知等)
- W5500経由でクラウドから学習済みモデルをダウンロードし、OTA更新
- 推論結果をW5500経由でクラウドへ送信
複数ソケットの同時使用例
W5500は8つの独立したソケットを持ち、MSPM0G3519の128[KB] SRAMにより、各ソケットに大容量バッファを割り当て可能である。
例えば、以下に示すような複数サービスを同時に動作させることができる。
- ソケット0
- HTTPサーバ (ポート80) : Webインターフェース提供
- ソケット1
- HTTPSサーバ (ポート443) : セキュアなWeb通信
- ソケット2
- MQTTクライアント (クラウド接続) : IoTデータ送信
- ソケット3
- Modbus TCPサーバ (ポート502) : 産業用通信
- ソケット4
- Telnetサーバ (ポート23) : 保守用コマンドラインインターフェース
- ソケット5
- FTPサーバ (ポート21) : ファイル転送
- ソケット6
- UDPブロードキャスト : デバイス探索
- ソケット7
- 予備または追加サービス
トラブルシューティング
MSPM0G3519とW5500を使用する際の、よくあるトラブルとその対処法を以下に示す。
W5500が応答しない
- ハードウェアリセットのタイミング
- W5500は、リセット後約200msの起動時間が必要である。
- W5500_HardwareReset()関数で十分な待機時間を確保していることを確認する。
- SPI配線の確認
- MOSI、MISO、SCLK、CSの配線が正しいか確認する。
- 特に、MOSIとMISOを間違えやすいので注意する。
- 電源電圧の確認
- W5500とMSPM0G3519の両方に安定した3.3V電源が供給されているか確認する。
- デカップリングコンデンサが適切に配置されているか確認する。
- SPIクロック速度の調整
- 初期動作確認時は、SPIクロックを低速 (1~5[MHz]程度) に設定してみる。
- 動作確認後、徐々に速度を上げていく。
ネットワークに接続できない
- IPアドレス設定の確認
- IPアドレス、サブネットマスク、ゲートウェイの設定が正しいか確認する。
- ネットワーク内で重複するIPアドレスがないか確認する。
- MACアドレスの確認
- MACアドレスが他のデバイスと重複していないか確認する。
- MACアドレスは、ローカルで使用する場合、0x00-0x08-DC-XX-XX-XX等のローカルアドレスを使用する。
- PHYリンクステータスの確認
- W5500のPHYCFGRレジスタを読み出して、リンクが確立しているか確認する。
- リンクLEDが点灯しているか確認する。
- イーサネットケーブルの確認
- イーサネットケーブルが正しく接続されているか確認する。
- ケーブルが断線していないか、別のケーブルで試してみる。
データが送受信できない
- ソケットステータスの確認
- getSn_SR()関数でソケットのステータスを確認し、SOCK_ESTABLISHED状態であることを確認する。
- ソケットがCLOSED状態の場合、socket()およびlisten() (サーバの場合) または connect() (クライアントの場合) を実行する。
- バッファサイズの確認
- 送信バッファに十分な空きがあるか、getSn_TX_FSR()で確認する。
- 受信バッファにデータがあるか、getSn_RX_RSR()で確認する。
- MSPM0G3519の128[KB] SRAMを活用して、大容量バッファを確保していることを確認する。
- ファイアウォールの確認
- PC側のファイアウォールがポートをブロックしていないか確認する。
- ルータやスイッチの設定を確認する。
接続が頻繁に切断される
- TCPキープアライブの設定
- W5500はTCPキープアライブをサポートしているため、必要に応じて設定する。
- 長時間アイドル状態が続く接続では、キープアライブを有効にすることを推奨する。
- タイムアウト設定の確認
- ソケットのタイムアウト設定 (RTR、RCR) を確認し、必要に応じて調整する。
- 電源の安定性
- ノイズや電圧変動により、W5500やMSPM0G3519が誤動作していないか確認する。
- 適切なデカップリングコンデンサとグランドプレーンを使用する。
SPI通信エラー
- クロック極性と位相の確認
- W5500はSPIモード0 (CPOL=0、CPHA=0) で動作する。
- MSPM0G3519のSPI設定が正しいか確認する (DL_SPI_FRAME_FORMAT_MOTO4_POL0_PHA0) 。
- 配線長と信号品質
- SPI配線が長すぎると、信号品質が劣化する。
- 配線長を短くするか、SPIクロックを下げる。
- グランドプレーンを適切に配置し、ノイズを低減する。
- 高速SPI通信の注意点
- 20[MHz]以上のSPI通信を行う場合、基板レイアウトと配線品質が重要。
- 必要に応じて、ターミネーション抵抗やシリーズ抵抗を追加する。
デバッグ方法
- PHYCFGRレジスタの読み出し
- PHYのリンクステータスを確認するため、PHYCFGRレジスタ (アドレス0x002E) を読み出す。
- ビット0が1の場合、リンクが確立している。
- ソケットレジスタの監視
- デバッグ中、ソケットのステータスレジスタ (Sn_SR) を定期的に読み出し、状態遷移を確認する。
- Sn_IR (割り込みレジスタ) を確認することで、イベントの発生を検出できる。
- Wiresharkによるパケットキャプチャ
- ネットワーク通信の詳細を確認するため、Wiresharkを使用してパケットをキャプチャする。
- TCP/IPプロトコルレベルの問題を特定できる。
- MSPM0G3519のデバッグ機能
- SWD (Serial Wire Debug) インターフェースを使用して、リアルタイムデバッグが可能。
- 128[KB] SRAMの豊富なメモリにより、詳細なログ情報を保存可能。
性能とメモリ使用量
MSPM0G3519とW5500を組み合わせた場合の、実際の性能とメモリ使用量を以下に示す。
フラッシュメモリ使用量
- W5500ドライバ (WIZnet ioLibrary) : 約5~8[KB]
- SPI通信層 (MSPM0G3519用) : 約1~2[KB]
- HTTPサーバアプリケーション (基本的な実装) : 約2~5[KB]
- 合計 : 約8~15[KB]
MSPM0G3519の512[KB]フラッシュメモリのうち、W5500関連のコードは2~3%程度を占めるのみである。
残りの97~98% (約497~504[KB]) は、アプリケーションロジック、データテーブル、静的コンテンツ (HTML、CSS、JavaScript、画像等) 、OTA更新領域、その他の機能に使用できる。
これにより、非常に大きなアプリケーション領域を確保できる。
SRAM使用量
- W5500ドライバ用変数
- 約0.5~1[KB]
- SPI通信バッファ
- 約0.5~1[KB]
- HTTPサーバ用バッファ (受信2[KB]、送信4[KB])
- 約6[KB]
- スタック領域
- 約2~4[KB]
- 合計
- 約9~12[KB]
MSPM0G3519の128[KB] SRAMのうち、W5500関連のメモリは7~9%程度を占めるのみである。
残りの91~93% (約116~119[KB]) は、アプリケーション処理、大容量データバッファ、複雑なデータ構造、機械学習モデルの推論用メモリ、その他の用途に使用できる。
これは、ソフトウェアTCP/IPスタック (lwIP) を使用した場合の20~40[KB] SRAM使用量と比較して、大幅に少ない。
MSPM0G3519の128[KB] SRAMの大容量により、非常に複雑なアプリケーション処理が可能である。
CPU負荷
W5500を使用する場合、TCP/IPプロトコル処理は全てW5500のハードウェアで実行されるため、CPU負荷は極めて低い。
- アイドル時 : 1%未満
- ソケットステータスの定期的なポーリングのみ
- データ送受信時 : 5~10%程度
- SPI通信とバッファコピーの処理
- 20~30[MHz]の高速SPI通信により、オーバーヘッドが最小化
- HTTPリクエスト処理時 : 10~20%程度
- HTTPリクエストの解析、レスポンスの生成
80[MHz]動作のMSPM0G3519では、ネットワーク処理のCPU負荷は非常に低く、大部分のCPUリソースをアプリケーション処理に使用できる。
残りの80~90%のCPUリソースを、センサーデータ処理、制御アルゴリズム、暗号化処理、機械学習推論等に活用できる。
ネットワークスループット
W5500は100[Mbps]のイーサネット通信に対応しているが、実際のスループットはSPI通信速度に依存する。
- SPI 20[MHz]動作時 : 約15~20[Mbps] (実効スループット)
- TCP/IPのオーバーヘッドを含む
- SPI 30[MHz]動作時 : 約25~30[Mbps] (実効スループット)
- MSPM0G3519のSPI0モジュール (最大32[MHz]) を活用
一般的なIoTアプリケーションや産業用通信では、この程度のスループットで十分である。
さらに高速な通信が必要な場合は、W6100 (1Gbps対応) 等の上位モデルの検討も可能である。
その他の注意事項
MSPM0G3519とW5500を使用する際の、その他の注意事項を以下に示す。
ソケット管理
W5500は8つの独立したソケットを持つが、各ソケットのバッファサイズは合計32[KB]を超えないように設定する必要がある。
例えば、全てのソケットを使用する場合、各ソケットのバッファは2[KB] (TX) + 2[KB] (RX) = 4[KB]となり、合計32[KB]となる。
アプリケーションの要件に応じて、一部のソケットに大きなバッファを割り当て、他のソケットを小さくすることも可能である。
MSPM0G3519の128[KB] SRAMにより、マイコン側でも大容量バッファを確保できるため、W5500のバッファと組み合わせて効率的なデータ転送が可能である。
SPI通信速度の最適化
W5500のSPIは最大80[MHz]に対応しているが、MSPM0G3519のSPI0モジュールの制約により、実用的には最大32[MHz]程度となる。
基板レイアウト、配線長、ノイズ環境に応じて、SPIクロック速度を調整することを推奨する。
高速化のポイントは以下の通りである。
- 短い配線
- W5500とMSPM0G3519間のSPI配線を可能な限り短くする。
- 理想的には、5cm以下。
- グランドプレーン
- 適切なグランドプレーンを配置し、信号品質を向上させる。
- デカップリングコンデンサ
- 各電源ピン近くに、適切なデカップリングコンデンサを配置する。
- 高速SPI動作時の注意点
- 20[MHz]以上のSPI動作では、信号品質が重要。
- オシロスコープで波形を確認し、必要に応じてターミネーション抵抗を追加。
リセットタイミング
W5500は、電源投入後およびハードウェアリセット後、約100~200[ms]の起動時間が必要である。
この期間中はレジスタアクセスを行わないように注意する。
上記のサンプルコードでは、リセット後200[ms]の待機時間を設定している。
割り込み使用
W5500は、データ受信、接続確立、切断等のイベントに対して割り込み (INTn信号) を発生できる。
上記のサンプルコードではポーリング方式を使用しているが、CPU負荷をさらに削減したい場合は、割り込み方式の使用を検討する。
MSPM0G3519の外部割り込み機能を使用して、W5500の割り込み信号を検出できる。
ただし、MSPM0G3519の80[MHz]高速動作により、ポーリング方式でもCPU負荷は非常に低いため、多くのアプリケーションではポーリング方式で十分である。
低消費電力動作
MSPM0G3519とW5500は、両方とも低消費電力設計であり、バッテリ駆動のIoTデバイスに適している。
さらなる低消費電力化のため、以下の手法を検討できる。
- MSPM0G3519の低電力モード
- STANDBY
- 1.7[µA] (32[kHz] RTC動作時)
- SHUTDOWN
- 92[nA]
- 待機時にスリープモードに移行し、W5500の割り込みで起床する。
- W5500のパワーダウンモード
- ネットワーク通信が不要な期間、W5500をパワーダウンモードに移行する。
- Wake-on-LAN
- W5500のWake-on-LAN機能を使用して、ネットワークパケットで復帰する。
- デュアルバンクフラッシュの活用
- OTA更新中も、片方のバンクで動作継続可能。
- 低消費電力モードと組み合わせて、効率的なファームウェア更新が可能。
セキュリティ
W5500はTLS/SSL等の暗号化機能を持たないため、セキュアな通信が必要な場合は、アプリケーション層で暗号化を実装する必要がある。
<nt>
MSPM0G3519には、以下に示すセキュリティ機能が搭載されており、これらを活用することができる。
- AES-128/256暗号化アクセラレータ
- GCM/GMAC、CCM/CBC-MAC、CBC、CTRモード対応
- ハードウェアアクセラレーションにより、高速な暗号化処理が可能
- 真性乱数生成器 (TRNG)
- セキュアな乱数生成が可能
- 暗号化キーの生成、セッションキーの生成等に使用
- セキュアキーストレージ
- 最大4つのAESキーを格納可能
- 不揮発性メモリに安全に保存
- ファイアウォール機能
- コードおよびデータ保護用のフレキシブルなファイアウォール
- IP保護 (実行専用メモリ)
MSPM0G3519の512[KB]フラッシュと128[KB] SRAMにより、mbedTLS等の暗号化ライブラリを使用して、HTTPS通信やMQTT over TLS等のセキュアな通信を実装することも可能である。
参考資料
- MSPM0G3519データシート
- https://www.ti.com/product/ja-jp/MSPM0G3519
- 正式な仕様、電気的特性、パッケージ情報等
- MSPM0 SDK
- https://www.ti.com/tool/MSPM0-SDK
- DriverLib、サンプルコード、ドキュメントを含む
- MSPM0 G-Series 80[MHz] マイクロコントローラ テクニカル リファレンス マニュアル
- https://www.ti.com/lit/pdf/SLAU846
- ペリフェラルの詳細な仕様と使用方法
- Code Composer Studio (CCS)
- https://www.ti.com/tool/CCSTUDIO
- TI公式の統合開発環境
- LP-MSPM0G3519 LaunchPad開発キット
- https://www.ti.com/tool/LP-MSPM0G3519
- MSPM0G3519の評価ボード
- W5500データシート
- https://www.wiznet.io/product-item/w5500/
- W5500の詳細な仕様
- WIZnet ioLibrary_Driver
- https://github.com/Wiznet/ioLibrary_Driver
- W5500ドライバライブラリ (C言語、オープンソース)
- W5500 Application Note
- https://docs.wiznet.io/Product/iEthernet/W5500/Application
- W5500の応用例、実装ガイド
- Arm Cortex-M0+ Technical Reference Manual
- https://developer.arm.com/documentation/ddi0484/latest/
- Cortex-M0+のアーキテクチャ、命令セット
- RFC 793 - Transmission Control Protocol (TCP)
- RFC 768 - User Datagram Protocol (UDP)