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制御ボード (CPU 最小システムが 1 つだけ搭載されている) は、それ自体に電源が供給されている場合、プログラムが正常に起動できないことがよくありますが、システムに接続されている場合は、制御ボードが起動された後に正常に起動できることがわかりました。カードスロットに挿入し、周辺ボードに接続します。
当初はブーツピンの不具合かと思われましたが、調査の結果それが原因ではないことが判明しました。
最後に、問題は CAN のフローティング RX ピンにあります。
理由
根本原因は、CAN_RX ピンがフローティングであるため、CAN の初期化が失敗することです。
(1) CAN ハードウェアの初期化には、RX ピン上の 11 個の不可視ビットを継続的に監視する必要があります。ここでは、stm32 の RX ピンに対応するリセシブ ビットが High であるか Low であるかは明らかではありません。
(2) 制御基板と周辺基板を切り離した場合、RX 端子はフローティングとなりレベルが不定になります。初期化不良を起こしやすいです。
(3) プログラムの初期化が開始されると、CAN の初期化が完了するのを待っているとタイムアウトになり、初期化が失敗します。
(4) 初期化に失敗すると、Error_Handler 関数に入り、そこで常にハングします。
3、解決策
- RX ピンをフローティングのままにして、レベルが不明になるような状態にしないでください。
- Error_Handler 関数を変更して、ライトの点滅や障害メッセージの送信など、障害の初期化時に障害を報告できるようにします。