RX65N TCPノンブロッキングサンプルプログラムを動かすために必要なこと

いつもお世話になっております。ななと申します。

 

RX65Nマイコンを搭載した自作基板(RTOSなし)で、M3S-T4-Tinyを用いた1対1の有線LAN通信を実現させることを目的としています。

基板のIPアドレスを"192.168.0.3"、通信相手のPCのIPアドレスを"192.168.0.10"としました。

PC側でファイアウォールの受信規則にICMPv4を許可する規則を追加しました。

使用しているサンプルプログラムは、「RXファミリ 組み込み用 TCP/IP M3S-T4-Tiny 導入ガイド Firmware Integration Technology アプリケーションノート」にある「r20an0051xx0209-rx-t4-fit」の中の「rskrx65n_2mb_tcp_nonblocking」です。

基板とPCをケーブルで接続しても、PC側でイーサの接続を検知できていない状況です。

プログラムは、main.cの140行目にあるecho_srv()関数内のループから抜け出せない状況です。

 

とても初歩的なことで躓いていると思いますが、ご教示いただけると幸いです。

  • ななさん

    こんにちは、シェルティです。

    私はルネサス社員で「RXファミリ 組み込み用 TCP/IP M3S-T4-Tiny 」(通称:T4ライブラリ)を設計した者です。
    最近は、Amazon FreeRTOS 関連のS/W開発を担当しております。
    RXマイコンのガイドとしてマイコン初期評価に使うネットワークスタックはT4ライブラリからAmazon FreeRTOS に変更しつつあります。量産に向けてはパートナー製のTCP/IPも合わせて検討されると良いかと思います。

    Amazon FreeRTOS は本家リポジトリにもRX65N用のコードを登録してあるので、もし余裕があればこちらも勉強してみてください。
    github.com/.../amazon-freertos

    RX65NでT4ライブラリを題材にしたネットワーク技術のセミナ資料を展開します。
    新規プロジェクト作成から解説しているので何かの役に立つかもしれません。
    スマートコンフィグレータを使ってTCP/IP込のプロジェクトを組み立てていく方法も学べると思います。

    資料の手順を追って、ななさんが実施されている内容と比較し、違いを見出していけば通信できると思います。
    別スレッドでPHYのアクセスはできたようなので、もう一息ですね。

    以下のURLからダウンロードしてください:
    <upload.hdedrive.com/.../SB1578444110-d7f99bf8-0f0c-4c67-957b-bf0b253d3b5e>
    * ダウンロードには、ダウンロードパスワードのほかに受け取り認証が必要です。
    なお、過去に認証済みのブラウザで行う場合は、最大 30 日間認証を省略することができます。
    ダウンロードパスワード: nPSDr9rt^724
    URLの有効期限: 2020年1月22日 午前9時41分

    以上です
  • シェルティさん

    リプライありがとうございます。
    セミナ資料拝見させて頂いております。

    PCのコマンドプロンプトで基板に設定したIPアドレス宛にpingを入力し、応答が来ることを目標としています。
    r_t4_rx_config.hにて設定した基板側のIPアドレスが、実際に反映できていないと考えています。

    r_t4_rx_config.h : T4_CFG_FIXED_IP_ADDRESS_CH0 ← 設定したIPアドレス
    config_tcpudp.c : MY_IP_ADDR0 ← T4_CFG_FIXED_IP_ADDRESS_CH0
              tcpudp_env[] ← { {MY_IP_ADDR0}, ... }

    IPアドレスは配列tcpudp_env[]に代入されますが、この配列を使用する必要はあるのでしょうか。
    セミナ資料では"R_BSP_POR_FUNCTION"で初期化が終了した後、main関数の先頭に来た時点でpingの応答が可能になっています。
    必要なモジュールのインストール、IPアドレスの設定、ビルド、main関数の先頭に来るまでの初期化だけでは足りないでしょうか。
  • ななさん

    こんにちは、シェルティです。

    まずご質問に回答します。

    >>IPアドレスは配列tcpudp_env[]に代入されますが、この配列を使用する必要はあるのでしょうか。
    はい。T4ライブラリは、tcpudp_open()実行時にtcpudp_env[]に入っているIPアドレスをT4ライブラリ内部にコピーして使い始めます。

    >>必要なモジュールのインストール、IPアドレスの設定、ビルド、main関数の先頭に来るまでの初期化だけでは足りないでしょうか。
    マイコン側は上記で足りているかと思います。

    改めて以下2スレッドを読み直してみました。

    ■ななさんが投稿されたスレッド
     スレッド1: PHYのソフトウェアリセットでphy_read時にMDIの値が常に1
     スレッド2: RX65N TCPノンブロッキングサンプルプログラムを動かすために必要なこと(本スレッド)

    以下1~5についてご確認いただけますか?

    ■確認事項
     1: セミナ資料 p106で赤枠のないところ、「The link status is detected」の設定項目はUsedでしょうか?Unusedでしょうか?
     2: ななさんの自作ボードはRX65NのET_LINKSTA端子はPHYチップのリンク出力信号に繋がってますか?
     3: 繋がってないなら(繋がっていたとしても)「The link status is detected」をUnusedにしてコード生成してpingを試してもらえますか?
     4: 「The link status is detected」をUnusedにした状態で、正しくリンク状態を検出するかどうかを確認するために、ether_callback.c の以下2関数にブレークを貼ってブレークするかどうか確認していただけますか?
     リンクON時(LANケーブル挿す):github.com/.../ether_callback.c
     リンクOFF時(LANケーブル抜く):github.com/.../ether_callback.c

    もし4でリンク状態を正しく検出できていないのであれば、TCP/IP層やソフトウェアの動作確認の前に、ボード上の配線(RX65N-PHYチップ間)が正しいかどうかのハードウェアの確認が先決です。
    配線が正しいとしても、RX65NのEther関連のMPCの設定がななさんのボードの配線と一致しているかどうかの確認も必要です。MPCの設定についてはセミナ資料のp108を参照してください。セミナ資料はRX65N RSKを使ったときの例を書いてあるので、ななさんのボードとRX65N RSKの配線が異なればMPCの設定値もななさんのボードに合わせて変更必要です。

    もし4でリンク状態を正しく検出できていれば以下に進んでください。

      5: ping実行時にARPのブロードキャストパケットがRX65N側で受信するはずで、その際RX65NでEtherの受信割り込みが発生し、受信処理が正常完了していますか?
       t4_driver.c の以下コードにブレークすれば直前の条件判断にあるdriver_ret が正になっており何かデータを受信したということが確定です。
       github.com/.../t4_driver.c

    もし5で受信完了できていなければ、Etherの受信データの転送先つまりEtherドライバの受信バッファがEtherC/EDMACの制限を守れていない可能性があります。セミナ資料のp173のようにEtherC/EDMACのデータ転送先・元は32バイトアライメントが必要であり、データ転送をコントロールするためのディスクリプタも16バイトアライメントが必要です。このため特殊なセクション設定を施す必要があります。p173のように正しくセクション設定できているかご確認ください。

    ここまで確認ができればpingが通ると思います。

    これでもping通らない場合は、PC側でファイアウォールでパケットが遮断されているとか、LANケーブルが壊れているとか、途中にあるHUBが壊れているとか、RX65NやPC要因以外を確認していくと良いかと思います。
    また、PC側にwiresharkを導入し、ping要求に対し意図したパケット送出が検出できるか、それに応じてRX65Nマイコンが正しく応答パケットを送出しPC側wiresharkでそれを検出できるか、といったところも合わせて確認してみてください。

    以上です
  • シェルティさん

    ななです。
    ご丁寧に説明いただきありがとうございます。

    確認事項について回答させていただきます。

    >>1: The link status is detected」の設定項目はUsedでしょうか?Unusedでしょうか?
    Unusedです。

    >>2: ななさんの自作ボードはRX65NのET_LINKSTA端子はPHYチップのリンク出力信号に繋がってますか?
    繋がっていません。

    >>3: 「The link status is detected」をUnusedにしてコード生成してpingを試してもらえますか?
    宛先ホストに到達できません。となります。
    上記確認事項1と2は以前から変更していない状態です。

    >>4: ether_callback.c の以下2関数にブレークを貼ってブレークするかどうか確認していただけますか?
    2つともブレークしませんでした。
    ボードの配線についてはこれから確認致します。MPCについて、基板作成時のポート表をもとにスマートコンフィグレータで端子設定しました。
    マイコンデータシートも見ながらMPCとPMRの設定コードが正しいことを確認しています。
    RMIIとして使用し、端子はLINKSTA、EXOUT、WOLの3つ以外全て使用します。
    INTRP端子について、スマートコンフィグレータの入力ポートPC6とICUのIRQ13を使用する設定にしています。

    リンクが確認できていないので5番以降の確認はまだですが、PC側のファイアウォールでICMPv4の受信許可はしており、マイコンと通信するPC(192.168.0.10)と別のPC(192.168.0.3)との間でpingが正常に通ることを確認しています。

    以上、ご確認よろしくお願い致します。
  • ななさん

    こんにちは、シェルティです。

    なるほど、状況がかなりクリアになってきました。ありがとうございます。
    4でブレークしないということから、何かしらハードウェアに近しいところに要因がありそうですね。
    マイコン側のMPCの設定はおそらく大丈夫そうなので、PHYアドレスとして設定した30がやっぱり間違っていた、とか、
    PHYチップにリセット信号が入りぱなしになっている、とか、PHYチップのクロック源がおかしい(RMIIだと50MHzが必要)とかがぱっと思いつく要因です。

    RX65N側でEtherを正しく初期化できるケースだと、最初にPHYチップに対してオートネゴシエーションの結果が正しかったかどうかを確認するフェーズがあるのですが、
    そこでオートネゴシエーションが正しく終わったかどうか_phy_read()関数から戻ってくると記憶しておりまして
    その戻り値が正しいかどうか確認するのもよいかと思います。
    ⇒ここでオートネゴシエーションが正しく完了してなければ、マイコンボードの先にあるHUBやルータが正しくオートネゴシエーション出来てない、が要因となり、機材交換で直る可能性があります。
    ⇒ここでオートネゴシエーションが正しく完了していれば、ハードウェア要因である可能性がだいぶ減り、RX65Nマイコン内部のソフトウェアの設定、PC側のファイアウォール設定など、ソフトウェア要因の可能性にフォーカスしていきます。

    少し上記記憶上の話で曖昧なので、どの辺のコードをブレークしてどの戻り値を確認すればよいか、
    先の返信のようにURL指定で後ほど再度書き込みます。

    以上です
  • ななさん

    こんにちは、シェルティです。

    あとすみません、使っているPHYチップの型名を教えてもらえますか?
    データシート読んでみます。

    以上です
  • シェルティさん

    ななです。
    何度もありがとうございます。
    返信が遅くなり申し訳ありません。

    >>PHYアドレスについて
    現在"1"を設定しています。PHYデータシートより、デフォルトのアドレスは"0001"とあったためです。

    >>PHYチップのクロック源について
    (回路図通りであれば)50MHzです。

    >>オートネゴシエーションが正しく終わるか
    phy.cのphy_start_autonegotiate関数は正常に終了します。
    PHYアドレスを"1"にすることでphy_read関数から戻ってくることを確認しています。
    サンプルプログラムでいえば、lan_open関数の戻り値が"E_OK"であること、phy_start_autonegotiate関数呼び出しのあるR_ETHER_Open_ZC2関数の戻り値が"ETHER_SUCCESS"であることを確認しています。

    >>PHYチップの型名について
    KSZ8041TL (Microchip)です。
    私もデータシートを読み返します。

    以上になります。
    ご確認よろしくお願い致します。
  • 結局解決できませんでした。
    別の手段で勉強しつつ、RX65Nで動かすことを検討してみます。
  • 横やりですみません。
    こちらで展開された、セミナー資料というのに興味があります。>シェルティさん
    問い合わせたところT4のセミナーは今後の開催予定がないということで、
    是非お目にかかりたいです。。。
    また、このスレッドについて、その後の進捗いかがでしょうか>ななさん
    SH2Aですが、RX向けのT4_FTPサーバーモジュールを移植して開発しています。
    スタートが似ている感じなので、お力になれることがあるかもしれません。
  • みゅうさん

    こんにちは、シェルティです。

    ただいま自分で作ったT4やT4用のFTPサーバ等を一旦横に置いておいてAmazon FreeRTOSや他のネットワーク対応のリアルタイムOSに絶賛浮気中ですが、将来リアルタイムOSすらも載せない超小型センサデバイスでも動作するようなTCP/IP、TLS、MQTT、UDP、DTLSをT4ベースで作りたいとも考えていたりします。
    T4は20年位かけて改築を繰り返していて中身がカオスなので、一旦作り直したいと考えていてその時はT5とかになるのかもしれません。

    FTPサーバなどのT4用のモジュールはメンテナンス費用が足りず一旦正規リリース(ルネサスウェブサイトからの公式配布)から降ろしGitHubで細々と続けてます。SNTPモジュールとかも作りました。
    github.com/.../rx-driver-package

    そんなこんなのT4ですが、セミナー資料に興味を持っていただき、ありがとうございます。再展開します。
    何かの役に立ちましたら幸いです。
    SH2AでもRXでもRAでも共通のマイコン内蔵Etherコントローラのメカニズム解説とかも書いてあります。

    以下のURLからダウンロードしてください:
    <upload.hdedrive.com/.../SB1584090293-798e8676-51ea-434b-a2af-bc1376f49d45>
    * ダウンロードには、ダウンロードパスワードのほかに受け取り認証が必要です。
    なお、過去に認証済みのブラウザで行う場合は、最大 30 日間認証を省略することができます。
    ダウンロードパスワード: sjVire4AQ+uG
    URLの有効期限: 2020年3月27日 午後6時4分


    以上です