Beckhoff社のET1100と違ってMIIインターフェースがPDI側からアクセスできるのでPhyのレジスタ監視や変更を行っています。
00Hレジスタのビット12を無効化して100Mbps Full-Duplex固定にしたい(Fast Hot Connect仕様に準拠したい)のですが、ビット12に0を書いても1になってしまいます。
レジスタ12Hスペシャルモードレジスタの書き換え(00E0H⇒0060H)は成功しているので書き換えのためのMIIインターフェース操作は正しいと思っていますが、レジスタ00Hの場合は、最終的に読んだ値が3100Hになってしまいます(希望値は2100H)。おそらく何かしらのステップが存在するのだと推測しています。
<私の試した手順>
・400E 0510H のビット15を監視しアイドル状態になるのを待つ
・400E 0510H の値が0007Hになるまで、400E 0517Hに01Hを書き込む(実装は400E 0516Hに対して0100Hの16ビット単位の書き込み)
・ 400E 0512H に 0000Hを書き込む(Phy0のレジスタ00Hを指定)
・400E 0514H に 2100Hを書き込む(オートネゴシエーションを無効化に設定)
・400E 0510H に0200Hを書き込む(書き込み実行)
・400E 0514H に A100Hを書き込む(ソフトウェアリセット)
⇒結果は3100Hになる
Yamamotoさん
ソフトリセットすればMODEピンではなく、以前のレジスタ設定値をそのまま引き継ぐのでソフトリセットするときにA100Hではなくて、8000Hでやったらどうなります? (ソフトリセット指定ビット以外は0に設定)
試してみました。
・400E 0514H に 8000Hを書き込む(ソフトウェアリセット)
⇒結果は3100H
通信相手がFast Hot Connect仕様のためにオートネゴシエーションが無効化された状態で、接続すると規格通りなのか100Mbps 半二重になってしまう。
そうですか、、、
ちなみに、MII_CONT_STAT(400E 0510H)のWRENビットは1ですかね? ・400E 0510H に0201Hを書き込む(書き込み実行)ではいかがでしょう。 (書きこみ後にCMDERRビットは0のまま?)
Kirinさん、色々とアドバイス助かります。
仮にエラーが起こったとしてもそれも踏まえて何か手順がある可能性しか考えられない状況ですので、技術サーポートに質問を投げることにしました。
※実際にエラーは起こっていないようでした。WRENビットは処理2番で確認した後です。
情報展開です。
技術サポートからの回答ですが、オートネゴシエーションOFFは実現できないということでした。
R-IN32M3-ECはEtherCATのハードIP(ESC)を本家のBeckhoffからライセンスを提供してもらってARMマイコンに組み込んだもので、1チップにARMマイコン
とESC、Phy2つを内蔵したICという構成になっています。PhyはESCの支配下に置かれていて、マイコンからESCを経由してPhyの設定レジスタを操作するようになっています。
ここまでは私も理解していました。
ルネサスの回答によるとESC自身が持っている機能としてPhyに更に自分の想定している設定情報を書くようにしてあって、オートネゴシエーションONになるようにPhyを操作しているとのことです。オートネゴシエーションONであるため、オートネゴシエーションOFFの100BASE FullDuplexとつなぐとオートネゴシエーションON側であるR-IN32M3-ECはEthernet仕様通りに動作するために100BASE HalfDuplexになってしまいます(これだとEtherCAT通信できない)。
つまり、このLSIでEtherCATスレーブを作る場合、(今のところ?)残念ながらFastHotConnect仕様は実現できないということでした。私の理想としては起動パラメータで2つあるポートのPhyのオートネゴシエーション有効・無効を切り替えられるようにしたかったですね。そうすればFastHotConnectスレーブにもそうでないスレーブにも接続して使用できるようになるんです。
フィードバックありがとうございます。こーゆー情報は貴重ですよね。