GD32 が STM32 を直接置き換える場合、CAN 通信インターフェイスの初期化エラーの解決策

GD32 が STM32 を直接置き換える場合、CAN 通信インターフェイス初期化エラーの解決策_匿名の友人のブログ - CSDN ブログ

デバッグにより、STM32 の CAN バスが初期化中 (MSR レジスタの CAN_MSR_SLAK ビットがセットされている) ウェイクアップ状態にあり、初期化ステータス ビット (MSR レジスタの CAN_MSR_INAK ビット) がオンになるとタイムアウト エラーが発生することがわかりました。レジスタ)は 1 に設定されます。初期化プログラムは、次のように stm32f1xx_hal_can.c ファイルの HAL_CAN_Init 関数にあります。

  /* Wait initialisation acknowledge */
  while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
  {
    if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
    {
      /* Update error code */
      hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

      /* Change CAN state */
      hcan->State = HAL_CAN_STATE_ERROR;

      return HAL_ERROR;
    }
  }

このエラーを解決するには、初期化ステータスビット ( MSRレジスタの CAN_MSR_INAK ビット) が 1 に設定されているかどうかを判断する前に、 CAN ウェイクアップ動作を追加できます。参加後のコードは次のとおりです。


  /* Request initialisation */
  SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ);

  /* Get tick */
  tickstart = HAL_GetTick();
	CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP);
  /* Wait initialisation acknowledge */
  while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U)
  {
    if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE)
    {
      /* Update error code */
      hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT;

      /* Change CAN state */
      hcan->State = HAL_CAN_STATE_ERROR;

      return HAL_ERROR;
    }
  }

stm32 はピンstm32を初期化できます

質問

STM32制御ボード (CPU 最小システムが 1 つだけ搭載されている) は、それ自体に電源が供給されている場合、プログラムが正常に起動できないことがよくありますが、システムに接続されている場合は、制御ボードが起動された後に正常に起動できることがわかりました。カードスロットに挿入し、周辺ボードに接続します。

当初はブーツピンの不具合かと思われましたが、調査の結果それが原因ではないことが判明しました。

最後に、問題は CAN のフローティング RX ピンにあります。

理由

根本原因は、CAN_RX ピンがフローティングであるため、CAN の初期化が失敗することです。

(1) CAN ハードウェアの初期化には、RX ピン上の 11 個の不可視ビットを継続的に監視する必要があります。ここでは、stm32 の RX ピンに対応するリセシブ ビットが High であるか Low であるかは明らかではありません。
ここに画像の説明を挿入
(2) 制御基板と周辺基板を切り離した場合、RX 端子はフローティングとなりレベルが不定になります。初期化不良を起こしやすいです。


ここに画像の説明を挿入

ここに画像の説明を挿入
(3) プログラムの初期化が開始されると、CAN の初期化が完了するのを待っているとタイムアウトになり、初期化が失敗します。

(4) 初期化に失敗すると、Error_Handler 関数に入り、そこで常にハングします。

3、解決策

  1. RX ピンをフローティングのままにして、レベルが不明になるような状態にしないでください。
  2. Error_Handler 関数を変更して、ライトの点滅や障害メッセージの送信など、障害の初期化時に障害を報告できるようにします。

おすすめ

転載: blog.csdn.net/m0_37777700/article/details/132324691