2
STM32F407 + LAN8720A + lwIP + FreeRTOS =受信されたイーサネットフレームなし
STM32F407およびLAN8720AイーサネットPHYを使用するPCBを立ち上げようとしています。フレームの送信に問題はありませんが、イーサネットフレームを受信できません。 ハードウェアのセットアップ 私は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の問題を 回避することはできません。ご覧のように、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を使用しているため、私のボードは本質的には機能する構成で固定され、他のデバイスはオンですケーブルはその信号を一致するように向けます。-磁気は、イーサネットの実行が短い場合に適切なシグナルインテグリティを提供しますが、長期間の分析では、より長い実行でのパケットドロップまたは問題の発生率が高くなります。 …