こんにちは。TYと申します。
RX72NでETHERC1_RMIIを使用したEthernet通信を行おうとしております。動作環境は下記になります。
--動作環境-
この環境下で、r_t4_driver.c(164行目)R_ETHER_Open_ZC2(1,1, (const uint8_t *) & _myethaddr[1], false);を実行するとpyh.cのphy_mii_write1関数のfor文でループ状態となります。
Ethernetに関する設定はSmartConfigurator上で行っているのですが、The register bus of PHY1 for ETHER0/1( ETHER_CFG_CH1_PHY_ACCESS)をUse ETHER0(0)にするとループ状態ではなくなります。ETHERC1_RMIIを使う場合、上記部分はUse ETHER1(1)を使うのが正しいのではないかと考えているのですが、こちらの設定で正常なのでしょうか。
この後に記述したEthernet関連の処理が上手くいかないため、一要因の判別として確認できればと思います。
情報の不足等がありましたら追加いたします。何卒よろしくお願いいたします。
[追記]本件、リプライにてご指摘いただいた内容で解決いたしました。数々のご協力誠にありがとうございます。
PHY-LSI address setting for ETHER0/1 が共に0となっていますが、management data input/output 通信(MDCとMDIOを使った通信)をするにあたり同じアドレスでは通信できないです。実際の回路がそうなっているのですか?その場合ですが、マネジメント通信でREADは出来ないので初期化シーケンスで工夫が必要です(書き込みのみで行う)。おそらくphy_mii_write1はレジスタに書き込んで、変更したレジスタの値を読み込んでVerifyしていると思います。もしそうならVerifyをなしにするなどの変更で切り抜けられるのではないかと推測します。
Yamamotoさん
リプライありがとうございます。
接続している基板のEthernet ICは1つ(アドレス0)です。そのためご指摘いただいたようにPHY-LSI address setting for ETHER0 → 1,PHY-LSI address setting for ETHER1→0としてみましたが、pyh.cのphy_mii_write1関数のfor文でループ状態のままでした。
TYさん
シェルティです、こんにちは。ルネサスの中の人です。ご利用いただいているr_t4_rx (TCP/IPプロトコルスタック)の設計者です。
RX72Nマイコンをご検討いただきありがとうございます。
Yamamotoさんがご指摘いただいている点、クリアされているようですね。他にも端子設定、セクション設定あたりが怪しいです。
以下RX72N Envision Kitでスクラッチからスマートコンフィグレータを使ってTCP/IPシステムを組み立てる例を解説したサイトがあります。こちらが参考になるかもしれません。特に端子設定は1個でも間違えるとうまくEther通信が動かないので要注意ですね。
https://github.com/renesas/rx72n-envision-kit/wiki/1-Ether-TCP-IP
あと、チャネル0ではなく1を使っているのも落とし穴があったような気がします。ちょっと今の担当者に確認してきます。(シェルティは現場を離れて外野からうるさく言う人になりつつあります)
以上です
回路設計で2つPHYを使っていて実際の回路ではPHYアドレスを両方とも0にしているということでいいんですよね?PHYが1つじゃなくて。PHYが1つなら、多分、PHYの数を設定できると思います。できないなら使わない方のPHYの処理コードをコメントアウトすればマネジメント通信は正常終了できるようになると思います。2つ使っていて同じPHYアドレスにしているなら、ベリファイ読み込みをコメントアウトです。スマートコンフィギュレータの設定を変えても0を指定した書き込み、読み込みで2つのPHYが反応します。書き込みは大丈夫ですが、読み込みは二つのPHYがMDIOラインをドライブするのでおかしなことになります。あと、PHYによっては特定のアドレスがブロードキャストアドレス設定になっている場合(旧MicrelのPHYは0がブロードキャストアドレスです。最近の品番はコンフィギュレーションピンによってブロードキャストを無効にできるようになりました)があり、それを知らずに回路設計すると違うアドレスなのにブロードキャストアドレスとして2つのPHYが反応するのでReadが正しく終了できないということがあります。ぶっちゃけですが、phy.cはレジスタ書き換えのコード(だと思います。RX72MのEtherCATの生成コードでは同じようなファイルでPHYのレジスタ設定書き換えをしています)ですので、PHYの初期値で通信状態が作れるならphy.cを実際に実行させず、コメントアウトで無理やり先に進めてもいいかなと思います。PHYは品番によってパワーオンリセット時のコンフィグピンの状態で内部レジスタ値が変わったするのでそこで通信できそうな状態なら私の書いた方法でも良いように思います。おそらく、オートネゴシエーション有効・無効、LINK時のLED点灯パターン等の設定をしているだけだと思います。
シェル
ティさん
リプライありがとうございます。また、お返事が遅くなり申し訳ございません。
解説サイトのご案内ありがとうございます。まだ試せておらず申し訳ないのですが、こちらを参考に再設定いたします。チャネル1についての落とし穴ももし確認できましたらご教示いただけると幸いです。
お手数おかけしますがよろしくお願いいたします。
Ymamotoさん
回路設計で1つPHYを使用し、PHYアドレスは0に設定しております。情報が不足しており申し訳ないです。
PHYの数設定、難しい場合はコメントアウトを試してみます。すぐに試すことができず申し訳ないですが、進展ありましたらまたご報告いたします。
よろしくお願いいたします。
シェルティです、こんにちは。
チャネル1の落とし穴について聞いてきました。ルネサスTCP/IP(T4)を利用し、Ether 2ch製品(RX72N, RX64M等)において、チャネル番号が大きい方(ch1)のみを利用する場合、ch0の初期化コードを無効化する対応が必要です。
具体的には以下2点が必要です。①t4_driver.c②config_tcpudp.c
さらに具体的には以下行の改造が必要です。①t4_driver.chttps://github.com/renesas/rx-driver-package/blob/509220acae9e3cd5b3f62359a68731b3767b96c6/source/r_t4_driver_rx/r_t4_driver_rx_vx.xx/r_t4_driver_rx/src/t4_driver.c#L174
以下のようにチャネル0の初期化をしているコードをコメントアウトをお願いします。
param.channel = ETHER_CHANNEL_0; R_ETHER_Control(CONTROL_POWER_ON, param); : ret = R_ETHER_Open_ZC2(0, (const uint8_t *) & _myethaddr[0], false); if (ETHER_SUCCESS != ret) { return -1; }
他にも「ETHER_CHANNEL_0」で検索する等で、チャネル0の処理があればコメントアウトをお願いします。「ETHER_CHANNEL_MAX >= 2」は逆にチャネル1用の処理でして、こちらが有効になっていることもご確認ください。
②config_tcpudp.c/r_t4_config_reference.hスマートコンフィグレータをご利用の場合、「r_t4_config_reference.h」のT4_CFG_SYSTEM_CHANNEL_NUMBERが2になるように、スマートコンフィグレータ設定画面上(e2 studioのプロジェクトエクスプローラで*.scfgをダブルクリック)で調整してください。https://github.com/renesas/rx-driver-package/blob/509220acae9e3cd5b3f62359a68731b3767b96c6/source/r_t4_rx/r_t4_rx_vx.xx/r_t4_rx/ref/r_t4_rx_config_reference.h#L40
スマートコンフィグレータを使ってない場合は、config_tcpudp.cの「_t4_channel_num 」を2に変更してください。
https://github.com/renesas/rx-driver-package/blob/509220acae9e3cd5b3f62359a68731b3767b96c6/source/r_t4_rx/r_t4_rx_vx.xx/r_t4_rx/ref/config_tcpudp_reference.tpl#L92
シェルティさんお聞きしていただきありがとうございます。他の方から頂いたアドバイスを参考にコメントアウトを行っていたため非常に参考になりました。ただ、ご教示いただいた①と②を試しましたがまだ現象が改善しておらず難航しております。r_t4_driver.c(164行目)R_ETHER_Open_ZC2(1,1, (const uint8_t *) & _myethaddr[1], false);を実行するとやはりエラー(ret = ETHER_ERR_OTHER)となります。設定画面でThe register bus of PHY1 for ETHER0/1( ETHER_CFG_CH1_PHY_ACCESS)をUse ETHER0(0)にするとループ状態ではなくなるのも同様です。
そもそもデバッグ書き込み直後(実行開始前)の基板側を見るとLANコネクタが片側(緑色)しか点灯していないため、基板上で何か問題があるかもしれません・・・。
TYさんこんにちは。ふぐりんといいます。私事でもうしわけないですが、現在、転職&引っ越しの真っ最中でして、このあとリアルタイムに書込めないかもしれないですけど、今書かないと次は来月になりそうなので・・すいません。書いちゃいます。CH0であれば基本的にシェルティさんのご指摘のとおりでうまく行くと思います。以前私はRX6xx系でCH0で成功しました。CH1と違うのですが、そのとき思ってたことを書きます。r_t4_driver_rxは1chだけ使うときちょっと使いづらい(というかパラメータの意味が分かりずらい)ので、なんで?ってしらべてたんですが、どうも古い評価ボードで使ってたPHYチップ(uPD60620)が原因じゃないかと思いました。このチップは2ch(CH0/CH1)のLAN通信ができるんですが、SIM通信(MDC/MDIO)だけ1本(CH0用?)しかついてなくて、PHYの制御アドレス(でしたっけ?)を使うことで2chそれぞれの制御通信をしてるようです。たしかRX系のEthernetはSIM通信もchごとにあってchごとに完全に独立制御できたと思うんですが、r_t4_driver_rx ではこのチップに対応するため2chをごっちゃにあつかってきちんと分離できない仕様になってしまったんじゃないかと・・いえ、これは個人的な想像です。(コンフィグレーションの設定によってはCH0しか使ってないのにCH1に同じPHY制御アドレスがある体で2回制御コマンド送ったりしませんでしたっけ?)すいません長くなりました。何が言いたいかというとCH1だけ使っているつもりでも、SIM通信ではCH0用のSIM通信(MDC/MDIO)が動作していませんか?
ふぐりんさん
リプライありがとうございます。また、ご連絡が遅くなり申し訳ございません。
CH0の初期化コードをコメントアウトすれば良いと認識であってますでしょうか。ご指摘いただいたCH0用のSIM端子は設定を行っておらず、確認したところ動作もしていませんでした。
r_t4_driver_rxを追って分かったことや現状の進展を別リプライにて書き込みますので、もし気になった際に見ていただけると幸いです。お忙しいところありがとうございます。