<<執筆中>>
せっかく,ボード上にRJ45コネクタが載っているので,イーサネットを使ってみます.10M/100Mで通信できます.
実機で試す
公式サンプル1: UDP
PY32Studio(ローカルアプリ)からサンプルアプリケーション(Udp_Echo_RMII)を取得します.
PY32Studioで開いて,EIDE用のプロジェクトを Generate します.
上記プロジェクトをVS Codeで開きます.
Ethernet PHYのリセット周りなどがバグっているので直します.
デバッグ用のUART設定
このプロジェクトには,UART出力が組み込まれているので,解析用として使えるようにすると便利です.
ボードのPC10とPC11をPYLINKのTXとRXに接続します.
PY-LINKのUSB Type-Cコネクタから接続したPC上で,Tera Termを使って仮想COMポートを開きます.サンプルのReadmeには9600と書いてありますが,正しくは115200です.
動作確認&デバッグ
実機に書き込んで動かします.書き込んだら,一度電源を抜いてリセットし,電源投入後にボード上のNRSTスイッチを押す,そして,USERスイッチを押すと動作します.
(エージェントによる修正と同時進行で進めたので,詳しくは見ていないが,筆者が試した時は上記の動作になっていた).
公式サンプル2: TCP
PY32Studio (ローカルアプリ)からサンプルアプリケーション(Tcp_Echo_RMII)を取得します.
PY32Studioで開いて,EIDE用のプロジェクトを Generate します.
上記プロジェクトをVS Codeで開きます.
Ethernet PHYのリセット周りなどがバグっているので直します.
UART設定
このプロジェクトには,UART出力が組み込まれているので,解析用として使えるようにすると便利です.
ボードのPC10とPC11をPYLINKのTXとRXに接続します.
PY-LINKのUSB Type-Cコネクタから接続したPC上で,Tera Termを使って仮想COMポートを開きます.サンプルのReadmeには9600と書いてありますが,正しくは115200です.
UDPの動作確認にはUDPテスト用のアプリを使うと楽です.
バグの修正はコーディング・エージェントを使うよいでしょう(筆者はCopilotでやった).IP通信についても,Wiresharkでの解析を指示されるので,エージェントの言う通りに操作すれば解決します.
あると便利なツール
・UDPのテストツール(Windowsアプリ)
・Wireshark
データシートから情報を抜粋
イーサネット
PY32E407Vマイコンは,Media Independent Interface(MII)とReduced Media Independent Interface(RMII)をサポートします.
- IEEE 802.3-2002規格準拠のイーサネットMAC
- IEEE 1588-2002規格に基づく高精度なネットワーククロック同期
- AHBマスタ/スレーブポート向けAMBA 2.0
イーサネット機能
PY32E407Vマイコン(PUYA)が持つ,イーサネット・ペリフェラルの特徴を次に挙げます.
- IEEE 802.3互換のMIIが全二重イーサネットPHYインターフェース
- 半二重PHYインターフェース
- 10/100Mbit/sのデータ転送率
- CSMA/CDプロトコルの半二重動作に対応
- IEEE 802.3xプロトコルの全二重動作に対応
- 全二重動作モードでは,受信したPAUSE制御フレームをユーザアプリケーションプログラムに選択的に送信可能
- バックプレッシャフロー制御に対応した半二重動作
- 全二重モードで入力フロー制御信号が失敗した場合,PAUSEフレームが自動的に送信される
- 送信パケットにはプリアンブルおよびスタートフレームデータ(SFD)が挿入され,受信パケットではこれらのフィールドが削除されます
- フレーム単位でCRCを自動的に計算し,制御可能なパディングビットを生成
- フレーム受信時のパディングビット/CRCの自動削除はオプション
- フレーム長をプログラム可能で,最大16Kバイトの標準フレームに対応
- フレームギャップは設定可能(40~96ビット,8ビット単位で変更可能)
- 複数の柔軟なアドレスフィルタリングモードに対応
- 最大4つの48ビット(DA)アドレスフィルタ(各バイトごとにマスクを設定可能)
- 3つ以上の48ビットSAアドレス比較検出が可能(各バイトにマスクを設定可能)
- マルチキャストおよびユニキャスト(DA)アドレス用の64ビットハッシュフィルタ
- オプションで,全てのマルチキャストアドレスフレームを通過させることも可能
- プロミスキュアスモード:ネットワーク監視中にフィルタリングを行わず,全てのフレームを直接通過させる
- 送受信パケットに関する独立した32ビットのステータス情報を提供
- 受信フレームの検出をサポートするIEEE 802.1Q VLANタグ
- アプリケーションプログラム用の独立した送信,受信,制御インターフェース
- RMON/MIB カウンタ(RFC2819/RFC2665)を使用した必須のネットワーク統計をサポート
- MDIOインターフェースを使用してPHYを設定・管理
- LANのウェイクアップフレームおよびAMD社製Magic PacketTMフレームの検出
- 受信機能:イーサネットフレームフレームワークにおけるIPv4およびTCPの受信パケットのチェックサムとロードシェディング(負荷軽減)
- 高度な受信機能:IPv4およびIPv6データグラムにおける、IPv4ヘッダチェックサムならびにTCP,UDP,ICMPのチェックサム検証
- IEEE 1588-2002で規定されているイーサネットフレームのタイムスタンプをサポート.各フレームの送信または受信のステートに対して64ビットのタイムスタンプを使用
- 2つのFIFO:プログラム可能な深さを持つ2KBの送信FIFOと,プログラム可能な深さを持つ2KBの受信FIFO
- EOF(ファイル終端)送信後の受信状態が,受信時に受信FIFOへ挿入される.これにより,これらフレームの受信状態を格納するための別のFIFOを必要とせず,受信FIFO内でマルチフレームストレージが有効になる
- オプションとして,ストア&フォワードモードでの受信時にエラーフレームをフィルタリングし,アプリケーションへ転送しないようにすることが可能
- サイズが不足しているオプションのフォワード有効フレーム(Optional forward valid frames with insufficient size)
- 受信FIFO内で損失および破損した(オーバーフローによる)フレーム数をカウントするためのパルス生成をサポート
- 送信時のストア・アンド・フォワード方式をサポート
- FIFOの充填レベルに応じて,MACコントローラへのポーズフレーム制御やバックプレッシャ信号を自動生成(しきい値設定可能)
- 送信時に競合フレームの自動再送を処理
- 遅延衝突,過衝突,過遅延,過少負荷の条件でフレームを破棄
- ソフトウェアで空の送信FIFOを制御
- IPv4ヘッダのチェックサムやTCP,UDP,ICMPのチェックサムを計算して,ストアアンドフォワードモードでトランスポートフレームに挿入する
- デバッグ用に内部ループバックMIIインターフェースをサポート
Ethernet
MACは,次のシステムにおけるLANのCSMA/CDサブレイヤを実装しています.
- 10Mビット/sおよび100Mビット/sのベースバンド伝送システム
- 全二重(Full-Duplex)および半二重(Half-Duplex)動作モード
- 衝突検出(Collision Detection)(半二重モードのみ)
- MAC制御フレーム(MAC Control Frame)サブレイヤのサポート
MACサブレイヤは,データリンク制御手順に関連する次の機能を実装しています.
データのカプセル化(送信および受信)
- フレーム生成(フレーム境界の設定,フレーム同期)
- アドレス生成(送信元アドレスと宛先アドレスの処理)
- エラー検出
メディアアクセス管理
- メディア割り当て(衝突回避)
- 衝突解決(衝突発生時の処理)
MACサブレイヤには,2つの動作モードが用意されています.
半二重モード(Half-duplex mode)
各ノード(通信局)は,CSMA/CDアルゴリズムによって通信路の使用権を調停します.
全二重モード(Full-duplex mode)
データ送信時に競合解決を行う必要がなく,送信と受信を同時に実行できます.
全二重モードは,次の条件を満たす必要があります.
・送信と受信を同時にサポートできる物理媒体(Physical Media)
・LANに接続される端末(ノード)が2台のみ
・両方の端末が全二重モードに設定されている
IEEE 802.3で規定されるLANの国際標準では,アクセス方式としてCSMA/CDが採用されています.
Ethernetペリフェラルは,次の3つの主要な構成要素から成ります.
- MAC 802.3コントローラ
- Media Independent Interface
- DMAコントローラ
MACとPHYを接続する信号規格
マイコンに内蔵されるMACと,外部に置くPHYの接続用として,MII(メディア・インディペンデント・インターフェース)および,RMII(Reduced Media Independent Interface)がサポートされており,どちらを使うかは1ビットの制御ビットで指定します.
DMAコントローラはAHBマスタ・スレーブインターフェースを介してMACコントローラおよびメモリにアクセスします.
AHBマスタインターフェースはデータの転送を制御します.
AHBスレーブインターフェースはアクセス制御およびステータスレジスタ(CSR;Control and Status Register)領域に使用されます.
データは,MACコントローラによる送信前に,DMAを介して送信FIFO(TX FIFO)にキャッシュされます.
ラインから受信したイーサネットフレームは,DMAを介してシステムメモリに転送されるまで,受信FIFO(RX FIFO)格納されます.
イーサネット機能の説明:SMI
Ethernetペリフェラルには,外部のPHYチップと通信するためのSMIインターフェースも搭載されています.ユーザは一連のレジスタ設定を通じて,MACおよびDMAコントローラを設定し,希望する動作モードや特性を選択できます.
注:Ethernetを使用する場合,AHBクロック周波数は25MHz以上である必要があります.
状態管理インターフェース(SMI;State Management Interface)
SMIは,2本の信号線(クロック線とデータ線)を使用してPHYのレジスタにアクセスするインターフェースです.最大32個のPHYへのアクセスをサポートします.32個のPHYの中から任意の1つを選択し,さらにそのPHY内の32個のレジスタから任意の1つを選択して,制御データの送信や状態信号の読み出しを行うことができます.一度にアドレス指定できるレジスタは,1つのPHY内の1レジスタのみです.
MDC(Management Data Clock)信号とMDIO(Management Data Input/Output)信号は,マイコンのピンに割り当てられており,各ピンにおいてGPIO機能と排他的に利用できます.
MACはMDCを生成し,そのクロックに同期してMDIO経由でPHYレジスタの読み書きを行います.これによりリンク状態,通信速度(10/100 Mbps),全二重/半二重設定などを制御・監視できます.
用語補足
SMI (State Management Interface)
Ethernet MACとPHYの間で設定や状態監視を行うための管理インターフェースです.MDCとMDIOの2本の信号線を用いてMACとPHY間で管理用の通信を行います.
MDC (Management Data Clock)
SMI用の通信クロックです.
周波数は最高2.5MHzです.“H”レベル期間および“L”レベル期間はいずれも最小160ns,周期は最小400nsです.
アイドル状態では,SMI管理インターフェースはMDCクロックを“L”レベルに維持します.
MDC: MAC → PHYへ供給される管理用クロック
MDIO (Management Data Input/Output)
MACとPHYの間で管理データを送受信するための双方向データ信号です.
MDCクロック信号に同期して,PHYへ状態情報や制御情報を書き込んだり,PHYから状態情報を読み出したりします.
MDIO: MAC ⇔ PHY間の双方向データ線
PHY
Ethernetの物理層デバイスです.リンク状態の監視や送受信信号の物理的な変換を担当するICです.
SMIフレームフォーマット
管理フレーム(Management Frame)は,以下の8つの部分で構成されます.
1:Preamble(プリアンブル)
各送信(読み出しまたは書き込み)は、必ずプリアンブルから開始されます.プリアンブルは,MDIOライン上の32回連続した論理「1」信号と、それに対応するMDCライン上の32クロック信号で構成されます.
この信号部分は,PHYデバイスとの同期を確立するために使用されます.
2:Starter(スタートコード)
フレームのスタートコードは“01”と定義されています.MDIO信号が論理“1”から“0”に遷移し,その後再び“1”に戻ることで通信の開始を示します.
3:Operator(オペコード)
操作の種類を定義します.操作には読み出し(Read) と書き込み(Write)があります.
4:PADDR(PHYアドレス)
PHYのアドレスです.5ビットで構成され,最大32個のPHYを識別できます.
データの送受信は上位ビット(MSB)から先に行われます.
5:RADDR(レジスタアドレス)
レジスタのアドレスです.5ビットで構成され,32個の独立したレジスタを指定できます.
上位ビット(MSB)から先に送受信されます.
用語補足
SMI(MDIO/MDC)によるPHY管理フレームは,概ね次のような構成になっています.
+----------+-------+----------+--------+--------+-----+----------+------+
| Preamble | Start | Op Code | PADDR | RADDR | TA | Data | Idle |
+----------+-------+----------+--------+--------+-----+----------+------+
32bit 2bit 2bit 5bit 5bit 2bit 16bit
- Preamble:PHYとの同期確立
- Start:フレーム開始の通知
- Op Code:Read/Write指定
- PADDR:PHYアドレス
- RADDR:PHY内レジスタアドレス
- TA (Turn Around):バスの方向切り替え
- Data:読み書きする16ビットデータ
6:TA(Turn Around)
TAはRADDRとDATAの間に挿入される2ビットのターンアラウンド(方向切替)フィールドです.読み出し動作時の信号衝突を防ぐために使用されます.
読み出し操作時(Read)
TAの2ビット期間中,MACコントローラはMDIOラインをハイインピーダンス(Hi-Z)状態に保持します.
PHYデバイスは最初の1ビット期間をハイインピーダンス状態に保持し,2ビット目で論理“0”を出力します.
書き込み操作時(Write)
TAの2ビット期間中,MACコントローラはMDIO信号に“10”を出力します.
PHY側はハイインピーダンス状態を維持します.
7:DATA(データ)
16ビットのデータフィールドです。送受信は上位ビットから行われ,最初に送受信されるのは ETH_MIID レジスタの15ビット目(MSB)です.
8:Idle Bit(アイドル状態)
MDIOラインはハイインピーダンス状態を維持します.全ての3ステートドライバ(三態出力)は無効化され,PHYのプルアップ抵抗によってMDIO信号は論理“1”に保持されます.
管理フレーム全体の構成
これまでの内容をまとめるとSMI(MDIO/MDC)による管理フレームは次のような構成になります.
+-----------+-------+--------+-------+--------+------+----------+
| Preamble | Start | OpCode |PADDR | RADDR | TA | DATA |
+-----------+-------+--------+-------+--------+------+----------+
| 32 bits | 2bit | 2bit | 5bit | 5bit | 2bit | 16bit |
+-----------+-------+--------+-------+--------+------+----------+
各フィールドの役割
- Preamble:PHYとの同期確立(32ビットの
1) - Start:フレーム開始(01)
- OpCode:読み出し/書き込み指定
- PADDR:PHYアドレス(0~31)
- RADDR:レジスタアドレス(0~31)
- TA:MDIOの送信方向切り替え
- DATA:読み書きする16ビットデータ
TAフィールドは,読み出し時にMACからPHYへデータバスの制御権を安全に受け渡す仕組みです.これにより,MACとPHYが同時にMDIO信号を駆動してしまうバス競合(Bus Contention)を防ぎます.
SMI書き込み動作(SMI Write Operation)
アプリケーションプログラムが, ETH_MACMIIAR レジスタの MW ビットおよび MB ビットをセットすると,SMIは指定されたPHYアドレスを使用して, ETH_MACMIIDR レジスタ に格納されているデータを,PHYレジスタに書き込みます.
動作中は,MIIアドレスレジスタおよびデータレジスタの内容を変更できません.
仮にこれらのレジスタを書き換えたとしても,その変更は無視されます( MB ビットは常にセット状態のまま維持されます).送信完了後もエラーは報告されません.
書き込み動作が完了すると,SMIインターフェースは MB ビットをクリアし,処理終了を通知します.
補足
各ビットの役割は次の通りです.
MB(MII Busy)
- 1:SMI通信中(ビジー状態)
- 0:SMI通信完了(アイドル状態)
MW(MII Write)
- 1:書き込み操作
- 0:読み出し操作
書き込みシーケンスのイメージ
- PHYアドレス設定
- レジスタアドレス設定
- 書込データをETH_MACMIIDRに設定
-
MW=1,MB=1をセット
↓ - SMIがPHYへ書込み実行
↓ -
MB=1(Busy)
↓ - 書込み完了
↓ - ハードウェアがMBを0にクリア
通常,ソフトウェアは MB ビットが0になるまで待機(ポーリング) することで,PHYレジスタへの書き込み完了を確認します.
SMI読み出し動作
ETH_MACMIIAR レジスタの MW ビットを“0”に設定した状態で,ユーザが MB ビットをセットすると,SMIはPHYレジスタに対する読み出し動作を実行します.
動作中は,MIIアドレスレジスタおよびデータレジスタの内容を変更することはできません.仮に変更したとしても,その変更は無視されます(MB ビットは常にセット状態のままとなります).通信完了後にエラーは報告されません.
読み出し動作が完了すると, MB ビットはクリア(0)され,PHYから読み出したデータがMIIデータレジスタに格納されます.
補足
各ビットの意味は以下の通りです.
MW(MII Write)
- 0:読み出し(Read)
- 1:書き込み(Write)
MB(MII Busy)
- 1:SMI通信中
- 0:SMI通信完了
読み出しシーケンス
- PHYアドレスを設定
- レジスタアドレスを設定
- MW=0 (Read) を設定
- MB=1 をセット
↓ - SMIがPHYへ読出し要求
↓ - MB=1 (Busy状態)
↓ - PHYから16ビットデータ受信
↓ - データをETH_MACMIIDRへ格納
↓ - ハードウェアがMBを0にクリア
通常のソフトウェア処理では,
-
MB=1をセットして読出し開始 -
MBが0になるまで待機 -
ETH_MACMIIDRを読み出す
という流れでPHYレジスタの内容を取得します.例えば,PHYのリンク状態や通信速度,全二重/半二重設定などの確認に利用されます.
SMIクロックの選択
SMIインターフェースのクロックは,アプリケーションクロック(AHBクロック)を分周して生成されます.
分周係数の選択は,AHBクロック周波数の範囲に応じて決定されます.
具体的な分周係数の設定については, ETH_MACMIIAR レジスタのビット[5:2] を参照してください.
技術的な補足
SMI(MDC)のクロック周波数には上限があり,前述のように最高2.5MHzです.そのため,MCU内部のAHBクロックが例えば72MHz,120MHz,168MHzなど高速で動作している場合,そのままMDCとして出力できません.そこで, ETH_MACMIIAR レジスタの CR(Clock Range)フィールド[5:2] に分周値を設定し,次のように調整します.例えば,
AHB Clock
↓
Clock Divider (CR[5:2])
↓
MDC Clock (≤ 2.5 MHz)
AHB = 72 MHz → MDC ≒ 72/42 = 1.71 MHz
AHB = 120 MHz → MDC ≒ 120/62 = 1.94 MHz
のように,MDCが2.5MHz以下になる分周比を選択します.
SMI通信用クロック(MDC)はAHBクロックから生成されるので,AHB周波数に応じて ETH_MACMIIAR の CR ビットを適切に設定します.
RMII
PY32E407マイコンはRMIにも対応していますが,MACとの接続本数の少ないRMIIが便利です.
RMII(Reduced Media Independent Interface)は,Ethernet通信に必要となる信号ピン数を削減するためのインターフェース規格です.
IEEE 802.3規格では,MIIインターフェースはデータおよび制御信号用に16本の信号線を使う一方,RMII規格ではこれを7本まで削減しています.
RMIIの主な特徴は以下の通りです.
| 項目 | MII | RMII |
|---|---|---|
| データ幅 | 4ビット | 2ビット |
| クロック | TX/RX別々 | 共通50 MHz |
| 必要信号数 | 約16本 | 約8~10本 |
| 対応速度 | 10/100 Mbps | 10/100 Mbps |
| MCUピン数 | 多い | 少ない |
RMIIの主な信号
REF_CLK
50MHzの基準クロックです.MACとPHYが共有して使用します.
TXD[1:0]
MACからPHYへの送信データです.
TX_EN
送信データ有効信号です.
RXD[1:0]
PHYからMACへの受信データです.
CRS_DV
キャリア検出(CRS)と受信データ有効(RX_DV)を兼ねた信号です.
MDC / MDIO
PHY管理用のSMIインターフェース信号です.
| RMII信号 | PY32E407 ピン |
|---|---|
| TXD0 (ETH_RMII_TXD0) | PB12 |
| TXD1 (ETH_RMII_TXD1) | PB13 |
| TX_EN (ETH_RMII_TX_EN) | PB11 |
| RXD0 (ETH_RMII_RXD0) |
PC4, PD9
|
| RXD1 (ETH_RMII_RXD1) |
PC5, PD10
|
| CRS_DV (ETH_RMII_CRS_DV) |
PA7, PD8
|
| MDC (ETH_MDC) | PC1 |
| MDIO (ETH_MDIO) | PA2 |
| REF_CLK (ETH_RMII_REF_CLK) | PA1 |
RMII clock scheme
MACとEthernet PHYの REF_CLK ピンに同じクロック源を接続することで,2つのデバイスが同期されます.
このクロックは,以下のいずれかの方法で供給できます.
外部から供給される50MHzクロック信号
マイコンのMCO(Microcontroller Clock Output)ピン
MCOピンからクロックを供給する
MCOピンから出力されるクロックが50MHzになるよう,PLL(Phase-Locked Loop)を適切に設定します.
MACフレーム送信(MAC Frame Transmission)
DMAは送信経路における全ての転送処理を制御します.DMAはシステムメモリ内のEthernetフレームを取り出し,FIFOに格納します.
その後,これらのフレームはMACコントローラへ送られ,送信処理が行われます.
送信フレームの終端を示すEOF(End Of Frame)が送信されると,MACコントローラから送信ステータスが取得され,その情報がDMAへ返されます.
送信FIFO(TX FIFO)の深さ(容量)は2Kバイトです.
FIFOの充填レベル(格納データ量)はDMAに通知されます.DMAはその情報に基づいてAHBインターフェースを使用し,システムメモリから必要なバーストデータを読み出します.
MACフレーム送信
SOF(Start Of Frame;フレーム開始)が検出されると,MACはデータを受信し,それをMIIインターフェースへ送信します.
アプリケーション層がMIIインターフェースへのフレームデータ送信を開始するタイミングは一定ではなく,以下の要因によって変動します.
- IFG(Inter Frame Gap)による遅延
プリアンブルおよびスタートフレームデリミタ(境界コード)の送信時間
半二重モードにおけるバックオフ(衝突後の強制再送待ち時間)による遅延 - EOF(End Of Frame;フレーム終了)がMACコントローラへ送られると,コントローラは通常の送信処理を完了し,その後,送信ステータスをDMAへ通知します.
送信中に通常の衝突(半二重モード時)が発生した場合,MACコントローラは送信状態を有効として記録し,その後,次のSOFを受信するまで受信した余分なデータを破棄します.
MACから再送要求が発行された場合は,同じフレームをSOFから再送信する必要があります.
送信中にデータが連続して供給されなかった場合,MACはアンダーフロー(Underflow)状態を発行します.
通常のフレーム送信中に,前のフレームのEOFを受信する前にMACが新たなSOFを受信した場合,そのSOFは無視されます.このとき,新しいフレームは前のフレームの続きであると見なされます.
MACコントローラへデータを送信する方式には,以下の2つの動作モードがあります.
Threshold Mode(しきい値モード)
FIFO内のデータ量が設定されたしきい値を超えたとき(または,しきい値に達する前にEOFが書き込まれたとき),そのデータはMACコントローラへ転送可能な状態になります.
しきい値は, ETH_DMABMR レジスタの TTC ビットによって設定できます.
Store-and-Forward Mode(ストア・アンド・フォワードモード)
FIFO内に1フレーム全体が格納された後で初めて,そのフレームはMACコントローラへ転送されます.
ただし,送信フレームの長さがTX FIFOの容量を超える場合は,TX FIFOがほぼ満杯になった時点でフレームデータのMACコントローラへの転送が開始されます.