専門家の皆様:
問題が発生しました。S32K144をベースにCAN通信デモを改造しました。デモボード上では正常にメッセージ送信と通信が可能です。私のCANモジュールは内部48MHzクロックを使用しており、カスタムボードに移植すると通信は正常に動作します。しかし、クロックソースを外部水晶発振器に切り替えると、逓倍値が28を超えるとCAN通信メッセージ送信機能が動作しなくなります。原因がよく分かりません。何か注意すべき点はありますか?
私のIDEはS32 for Platform 3.5で、SDKは4.0.1です。同僚のIDEはS32 for ARM 2.2で、SDKは4.0.1と3.0.0です。彼のIDEでもクロックアウトを変更してもうまくいきませんでした。
乗数を 28 に設定できますか? プロジェクトがアップロードされず、読み込みが続きます。
ご参考までに
アップデート状況:S32K144クロックツリーのクロックアウトパスを設定後、ステータスは正常に戻りました。ツールの扱いにはご注意ください。苦労はしますが、やりがいのある経験です。
こんにちは@ナンモ
理解できませんでした。もう少し詳しく説明していただけますか?
こんにちは@ナンモ
問題を再現してみましたが、データシートにはそのような制限事項は記載されていませんでした。そのため、設計チームからの返信を待つため、社内投稿を作成しました。しばらくお待ちください。
赤枠で囲まれた部分は、これまで変更していなかった部分です。デフォルト状態では、コードを生成した後、使用しているクロックソースによってCAN関数の動作が不安定でした。その後、これら2つのオプションを有効にし、spll sclock に設定しました。コンパイルと書き込み後、通信は正常に動作しました。その後、記憶を頼りに設定を元に戻しました(以前と全く同じではないかもしれません)。コンパイルと書き込み後、通信は一貫して正常に動作しました。なぜこのようなことが起こるのか知りたいです。2日半もの間、ずっと悩んでいます。
原理や信頼性は不明です。ご回答をお願いします。
こんにちは@ナンモ
テストの結果、PLL逓倍数を40に設定しても正常に動作しませんでした。データシートにはそのような制限要件が記載されていなかったため、設計チームにクロック制限について問い合わせるケースを提出しました。
次に、CLKOUTを変更するとうまくいったとおっしゃっていましたが、私の場合はうまくいきませんでした。もし成功した例があれば、テストのために送っていただけますか?
こんにちは@ NanMo1
これらのサードパーティのコードを私と共有していただければ、確認させていただきます。
社内の設計チームにはすでに確認済みですが、しばらく時間がかかります。プロジェクトで必要な場合は、現時点ではFLEXCANで外付け水晶クロックをご使用いただけます。問題ないはずです。
このアカウントは会社のメールアドレスを使って登録しました。この問題はまだ解決していませんが、サードパーティ製のコードで同じ設定でCAN通信を実現できることを発見しました。具体的な理由は何でしょうか?
こんにちは@ナンモ
PLL 逓倍数を 40 に設定し、周辺クロックとして PE クロックを選択すると、CAN 通信も異常になります。
CAN PEモジュールはこれまで常に外部クロックを使用していました。システムで逓倍周波数の外部クロックを使用すると、CANが誤動作することがあり、その現象はボードによって異なります。
ご参考までに
提供いただいたプロジェクトで使用されているクロックは外付け水晶発振器です。何が問題なのでしょうか?それはご質問の趣旨と異なるのではないでしょうか?
最初にアップロードした例は…
こんにちは@ NanMo1
デモをアップロードする
デモボードは100ピンですが、カスタムボードは64ピンです。100ピンから64ピンに直接切り替えると問題が発生しますが、切り替え後にすべての設定を削除し、ボードを再設定すると問題は解決します。
こんにちは@ナンモ
お待たせして申し訳ございません。
これは S32 DS IDE のバグです。
これは S32 DS ツールのバグであることがわかったので、参考までにビデオを録画しました。
問題は、SPLL 係数を変更した後、生成されたコードが更新されず、FLEXCAN 構成エラーが発生したことです。
「clock_config.c」では、「SCG_SPLL_CLOCK_MULTIPLY_BY_28」は変更されません。
SPLL係数を変更します。
.spllConfig =
{
.initialize = true,
.monitorMode = SCG_SPLL_MONITOR_DISABLE,/* Monitor disabled */
.locked = false, /* unlocked */
.prediv = (uint8_t)SCG_SPLL_CLOCK_PREDIV_BY_1,/* Divided by 1 */
.mult = (uint8_t)SCG_SPLL_CLOCK_MULTIPLY_BY_28,/* Multiply Factor is 28 */
.src=0U,
.div1 = SCG_ASYNC_CLOCK_DIV_BY_2, /* System PLL Clock Divider 1: divided by 2 */
.div2 = SCG_ASYNC_CLOCK_DIV_BY_4, /* System PLL Clock Divider 3: divided by 4 */
},
1. 基礎となる構成コードを直接変更します。
2. 最初に実行モードを HSRUN に切り替え、次に RUN に切り替え、このプロセス中に SPLL 係数を変更すると、通常のコード生成が可能になることがわかりました。
お返事ありがとうございます。問題の原因が分かりました。