STM32F407 はイーサネット チップ 83848 と対話し、接続されていないネットワーク ケーブルを使用するため、初期化が失敗し、接続されなくなります。

プロジェクトのシナリオ:

プロジェクトをデバッグしているときに、STM32F407 が 83848 チップを駆動するときにイーサネットの初期化が失敗することがわかりました。


問題の説明:

具体的なパフォーマンスは、ネットワーク ケーブルを接続しなくてもボードの電源がオンになり、プログラムの実行後、ネットワーク ケーブルを接続すると接続できなくなります。電源を入れる前にネットワーク ケーブルを接続し、通常どおり使用してください。


原因分析:

いくつかのオンライン手順を確認したところ、すべてここで初期化の失敗を示していました。

static void ETH_MACDMA_Config(void)
 {
    
    
  /* Enable ETHERNET clock */
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |
   RCC_AHB1Periph_ETH_MAC_Tx|RCC_AHB1Periph_ETH_MAC_Rx,ENABLE);
   ...//此处省去一大串代码
   /*-------------------- MAC ----------------------------*/
 /* 开启网络自适应功能,速度和工作模式无需配置*/
   ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
  // ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
  // ETH_InitStructure.ETH_Speed = ETH_Speed_10M;
  // ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
    ...//此处省去一大串代码
 ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
   EthStatus = ETH_Init(&ETH_InitStructure, ETHERNET_PHY_ADDRESS);
 }

ここでの問題は、オートネゴシエーション モードが、速度を 10M または 100M、および全二重または半二重モードに設定できないように構成されていることです。
ここに画像の説明を挿入

その結果、戻り値は 0 となり、初期化は失敗します。
ここに画像の説明を挿入


解決:

解決:

  1. ネットワーク ケーブル プラグインの割り込みを使用して、ネットワーク構成を再初期化します。利点はオートネゴシエーション機能が維持されること、欠点は、より面倒で、別の初期化判定プログラムを作成する必要があることです。いくつかのプラグイン割り込み (再初期化なし) をテストしましたが、おそらく 2 つまたは3 つの割り込みがあり、それ以上割り込みに入ることはできません。83848 割り込みレジスタを参照すると、割り込みイネーブルがオンになっています。(設定がうまくできていない可能性もあります)

ここに画像の説明を挿入
この関数を使用してETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)、83848 チップ制御レジスタへの書き込みを完了します。PHYReg は 0X11、PHYValue は 0X0003 で、83848INT ピンは割り込みモードになり、出力がイネーブルになります。
ここに画像の説明を挿入
この関数を使用してETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue)、83848 チップ割り込みステータス レジスタへの書き込みを完了します。PHYReg は 0X12、PHYValue は 0X0020 です。これにより、83848 は INT ピン割り込みレベルを送信して、ネットワークの接続ステータスを通じて STM32 割り込みをトリガーできるようになります。ケーブル。次に、STM32F4 割り込みで初期化します (プログラムはここにはリストされていません。ピンの EXTI 割り込みを忘れずに設定してください)。
2. 必要な設定モードに直接変更します。(実際のテストでは、負荷をかけずに全二重100Mでコンピュータに接続しています) 変化量は非常に少ないので、接続速度が足りないと心配な場合は、10Mに設定してください。

static void ETH_MACDMA_Config(void)
 {
    
    
  /* Enable ETHERNET clock */
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |
   RCC_AHB1Periph_ETH_MAC_Tx|RCC_AHB1Periph_ETH_MAC_Rx,ENABLE);
   ...//此处省去一大串代码
   /*-------------------- MAC ----------------------------*/
 /* 关闭网络自适应功能*/
   ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
   ETH_InitStructure.ETH_Speed = ETH_Speed_100M;//如果担心对接设配速率不够的话直接设置成ETH_Speed_10M就好了
   ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex;
    ...//此处省去一大串代码
 ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
   EthStatus = ETH_Init(&ETH_InitStructure, ETHERNET_PHY_ADDRESS);
 }

おすすめ

転載: blog.csdn.net/weixin_43058521/article/details/121895044