STM32F407 + LAN8720A + lwIP + FreeRTOS =受信されたイーサネットフレームなし


9

STM32F407およびLAN8720AイーサネットPHYを使用するPCBを立ち上げようとしています。フレームの送信に問題はありませんが、イーサネットフレームを受信できません。

ハードウェアのセットアップ

イーサネットPHYの回路図 私はSTM32F4に25 MHz水晶を搭載しており、25 MHzクロック出力ピンをREF_CLK_OUTモードのLAN8720Aに駆動し、50 MHzクロックをRMIIインターフェイスの一部としてSTM32F4に駆動します。

ジャック/磁気は一般的な部品です。これがデータシートです: ここに画像の説明を入力してください

ソフトウェア

私は最新アップデートのSTM32CubeMXを使用して、FreeRTOS、lwIP、およびETH周辺機器ドライバーを含むSTM32プロジェクトのSystem Workbenchを生成しています。生成されたコードには実際には触れていません。そのため、lwIPスタックはFreeRTOSスタック内で初期化されます。

実験

ボードのlwIPが10.0.0.2静的IP用に構成され、コンピューターのUSB-to-Ethernetドングルが10.0.0.1静的IP用に構成されているので、2つのデバイスをイーサネットケーブルで直接接続し、ボードが接続しようとします。コンピューターのポート80でサービスに。Wiresharkを使用してボードとコンピューター間のやり取りをキャプチャします(コンピューターで実行され、USB-to-Ethernetコンバーターにバインドされています)。

フレームを受信できないという問題があるため、このARPの問題を Wiresharkのキャプチャ 回避することはできません。ご覧のように、Stmicroe(ボード)はARPパケットを送信できます—私のコンピューターで聞こえます—私のコンピューターからの応答は聞こえないようです。 、それはARPパケットを爆破し続けるので。

どちらのデバイスも255.255.255.0マスクで構成されており、両方とも10.0.0.1(コンピューター)のゲートウェイアドレスで構成されています。ARPテーブルがめちゃくちゃになり、コンピューターがARPパケットを無視することを聞いたことがありますが、ボードが最初に作成した要求に応じて、ボードが自分のコンピューターによってアドレス指定されたARPパケットを無視することは想像できません。

そこで、lwIPのethernetif.cファイルを調べてHAL_ETH_GetReceivedFrame_IT(&heth)、エラーが返されていることに気づきました。この関数は、(heth->RxDesc->Status & ETH_DMARXDESC_OWN)1ではなく== 0であるためエラーを返します。これは、DMAバッファーが現在MAC周辺機器用に準備されており、まだ何も受信していないことを意味すると解釈します。

さらに、HAL_ETH_IRQHandlerが呼び出されないことを確認しました。

PHYの問題?

この時点で、自分のPHY自体に問題があるのではないかと思いました。

さらに調査するため、Saleae Logic Pro 16を関連するすべての信号に接続しましたが、TX0 / TX1とRX0 / RX1の両方の回線に大量のトラフィックがあることに気付きました。次に、25 MHzの入力クロックを使用した一部のRXトラフィックのキャプチャを示します。

受信したパケットのキャプチャ

RX_ERRは、50 MHzのクロック出力(明らかにSaleaeのようなデバイスで明らかに困難なもの)をキャプチャしようとしない限り、常に低いです。 —ピンは機能しているように見えます)。

次のステップ

タスクでが呼び出されたHAL_NVIC_EnableIRQ(ETH_IRQn);後、ETH割り込みを手動で有効にしてみましたtcpip_init()MX_LWIP_Init()、問題が解決しないようです。イーサネット割り込みルーチンが呼び出されることすら想定されているかどうかは、完全にはわかりません。これは、まったく新しい設計を実現する上で困難なことです。システムの適切な動作を判断するのに苦労しているため、セットアップの違いを判断できます。

以前にSTM32 / STM32CubeMX / FreeRTOSなどを使用したことはありますが、STM32のイーサネットペリフェラルを使用したことはありません。これに関する私の唯一の経験は、常に組み込みで動作するように見えるカスタムの組み込みLinuxシステムに関するものだけです。これは私にとって新しい領域です!

どこかに愚かなチェックボックスか、Ethernet_EnableReceive()呼び出しを忘れた魔法の関数があると確信していますが、それを明示的に有効にする必要があることを示唆するドキュメントを実際に見つけることはできません。インターネット上に表示されている投稿はすべて無関係です。問題。

誰かが何かアイデアがあれば、私はいくつかの助けが欲しいです!

補遺:FreeRTOSを取り除く

物事を排除するために、FreeRTOSプロジェクトコンポーネントを削除し、ベアメタルプロジェクトに戻りました。メインループでは、を呼び出しますMX_LWIP_Process()。この方法では、割り込みの必要性はなくなりますが、問題は解決されません。それでもフレームを受信できません。これにより、STM32CubeMXによって生成されたETH HALコードに何かがあると思います。

解決

誰かが将来この質問に出くわした場合に備えて、問題はRXD0ピンとRXD1ピンが反転していることが判明しました。ロジックアナライザーでトラフィックを確認できたのはこのためですが、MCUでデコードされませんでした。

誰かが指摘したように、私が使用した磁気は非対称であり、auto-MDI-Xには使用しないでください。何の問題もありませんでした。私は2つのことの1つが起こっていると予想します:-磁気は実際には他の方向では機能しませんが、私が持っているすべてがauto-MDI-Xを使用しているため、私のボードは本質的には機能する構成で固定され、他のデバイスはオンですケーブルはその信号を一致するように向けます。-磁気は、イーサネットの実行が短い場合に適切なシグナルインテグリティを提供しますが、長期間の分析では、より長い実行でのパケットドロップまたは問題の発生率が高くなります。

正直なところ、ラインフィルターが1:1変圧器のどちら側に設置されることが重要なのかははっきりしません。そのため、PoEアプリケーション以外では、対称設計と非対称設計がなぜ重要なのかがわかりません。


Wiresharkはどこにインストールされていますか?
匿名

ボードが接続しようとしていたコンピューター。これを明確にするために質問を編集します。
ジェイカールソン

FWIW、私はFreeRTOSスタックの使用をお勧めします。(私はこれがあなたの特定のクエリを妨げないことを理解しています。)私は今夜まで何もすることができませんが、それが助けになった場合、FreeRTOSスタックでpingを実行したそのプロセッサのプロジェクトがあると確信しています。私が立ち上げて実行しているボードにどのPHYがあったかわかりません。とにかく、プロジェクトが必要な場合はお知らせください。FreeRTOSインタラクティブサイトに掲載できます。
DiBosco

それはとても役に立ちます。使用しているスタックにまったくとらわれていません---すぐに起動して実行できるものが必要です。
ジェイカールソン

1
私は対称的なもので磁気を交換しようとしました、そしてそれは問題を解決しませんでした。しかしながら!回路図を見ていて、RXD0とRXD1を交換していることに気付きました。どー!そのため、PHYからRXデータが吐き出されるのを見ましたが、MACは何も受信していません。私は古いマグネティックスをボードに再度はんだ付けするかもしれません(テーブルにぶら下がっているものがないようにするため)、そしてauto-MDI-Xプロトコルがそれを理解できるように感じますよね?「リンク」LEDは、有効なRX / TXリンクが確立されたときにのみ点灯するはずですよね?それは、古い、非対称の磁気学でさえ、常に照らされていました。
ジェイカールソン、

回答:


0

PCにWiresharkがインストールされており、USB-to-LANアダプターを使用していると言います。Wiresharkがセットアップでパケットをキャプチャする物理ポイントがわからないため、送信パケットが実際に物理ネットワークに表示されるかどうかは問題になります。ネットワークインターフェースを備えた別のPCを接続し、これらのPCが互いに通信できるかどうかを確認し、Wiresharksの出力を比較します。

Wiresharkの出力には問題がありません。PCはローカルネットワーク上にあり、IPアドレス10.0.0.1を持っていることを3回通知します(これらの3つのARP要求のいずれかに対する応答を受信した場合、OSはIPアドレスの競合でポップアップします)。

次に、あなたのボードは常に10.0.0.1を持っているのは誰ですか?10.0.0.2に伝え、PCの10.0.0.1での応答は...にあります。問題は、なぜループで発生するのかです。

  1. ボードはPCから送信された応答パケットを物理的に受信しません。
  2. ボードは何か他のものを期待しているか、受信したパケットが破損していて、パケットを破棄します。

したがって、次のトラブルシューティング手順として、「通常の」イーサネットインターフェイスを備えた別のPCを使用して、Wiresharkをインストールし、ボードの場合と同じようにそのネットワークを構成して、telnet 10.0.0.1 80両方のマシンのWiresharkにポップアップが表示されることを確認します。このようにして、USB-to-Ethernetアダプタを備えたPCが正しく動作することを確認します。

次のステップは、これらのWiresharkに表示される内容によって異なります。

更新:

パケットを受信して​​いますが、そうでない場合、RXD0 / D1ピンはアクティビティを表示しません、正しいですか?

正しくありません。ボードがパケットを受信すると考えたいと思います。PHY入力信号のレベルに多少の変化があることがわかりますが、それらは必ずしも有効なパケットを表しているわけではありません。RX_ERRがトグルしないという事実は、PHYが着信イベントで適切に動作していること、または到着した情報が適切なパケットを構成していることをすぐにはわかりません。

とにかく、それはあなた次第です。私のトラブルシューティングの理論は単純です。問題をどこで発生するかをより高いレベルで確認してから、設計のそれぞれの部分を掘り下げる必要があります。すべての部分を掘り下げ、すべてを疑うことは役に立たない。焦点が広がっている問題を見つけたら幸運です。あなたはすでにソフトウェアを単純化しようとしています、それが成功しないならば、あなたはおそらくチップを取り替え始めるでしょう。

私のトラブルシューティング手順は、別のPCがドングルを使用してPCと通信し、私が間違っているか正しいかを証明できるようにするためにそれほど複雑であるとは思わないそれら。


これを書いてくれてありがとうございますが、私のPHYが私のPCからパケットを受信して​​いるのは明らかですが、ボードで受信されていません。そうしないと、RMIIラインにRxデータが表示されません。これは単純で高レベルのネットワーキングの質問ではないと思います。
ジェイカールソン

@JayCarlsonボードのケーブル端の電気信号が、キャプチャして破棄できない適切なパケットであることを証明する必要があります。なぜそんな単純なことを証明せずにテクノロジーの奥深くに行くのか
匿名

私のコンピューターが実際に送信する必要のあるパケットを送信していない(そしてWiresharkが送信していると言っている)のはあなたの理論ですか?私のボードが受け取っているパケットは何ですか?ボードはコンピュータに直接接続されています。これは複雑なネットワーク設定ではなく、ボード上のPHYが受信するパケットはすべて、自分のコンピューターから送信されたものでなければなりません。パケットを受信して​​いますが、そうでない場合、RXD0 / D1ピンはアクティビティを表示しません、正しいですか?あなたの仮説は、何かがパケットを破棄しているということですよね?とは?PHY?RX_ERRビットはセットされません。MCUのMAC?受信ISRは起動しません。
Jay Carlson

答えを更新しました。疑わしく先入観しないでください。複雑なものはあなたが思っているよりも単純に見えるかもしれません。行動して情報を収集するだけです。
匿名

1
了解しました。同じケーブルとUSB-イーサネットアダプターを使用してコンピューターを別のコンピューターに接続しました。私は両方のコンピューターでWiresharkのインスタンスを実行しましたが、同じデータが表示されます---一部のARPチャッターと、ポート80で実行されているnetcatサービスへの接続が成功しました。両方の方法でテストしました。私は組み込みボードからそのサービスに接続してみましたが、先ほど述べたように、ARPメッセージを見逃すことはありません。コンピューターからボードに接続しようとしても、ボードがコンピューターのARP要求に応答しないため、ARPステージを通過できません。私はそれがパケットを聞いているとは本当に思いません。
ジェイカールソン

0

このトピックを復活させて申し訳ありません。私の経験に触れずに合格することはできませんでした。

私はこのHR911105A(磁石付きRJ45)を私のプロジェクトの1つで使用しました。

HR911105A: ここに画像の説明を入力してください 一目で、回路図に従ってLAN8720とRJ45の間の接続に注意を向けました。

接続が交差しているように見えるので。接続されたシステムは主にMDI-Xを使用するため、受信/送信ペアを検出しますが、次のように混乱の少ない接続を提供することをお勧めします。

LAN -> RJ45
=====================
TXP -> TD+ (Pin #1)
TXN -> TD- (Pin #2)
RXP -> RD+ (Pin #3)
RXN -> RD- (Pin #6)

Pin #4 and Pin #5(したがって、49.9Rプルアップ抵抗)を3V3_AN回路図に接続し、もう一方の側をコンデンサ(0.1uFまたは0.022uF)を介してGNDに結合する場合に適しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.