こんにちは、みんな、
現在、プロジェクト用の新しい SoC を評価中です。このために、FRDM-MCXN947 評価ボードを使用します。これには CAN-FD ポートが含まれます。私は Zephyr / MCXN の初心者ですのでご了承ください。
CAN IP を評価しても、他のデバイスと通信できませんでした。スコープで確認すると、ビットレートが仕様から大きく外れていることがわかりました (118kBit / 125kBit、943kBit / 1000kBit)。これは私のテスト アプリケーションと Zephyr の例 (west flash frdm_mcxn947/mcxn947/cpu0 Zephyr/samples/ドライバ/CAN/babbling/) を使用したものなので、何らかのクロック設定の問題があると考えられます。
関連すると思われる部品を、evaboard (board.c) の一部として見つけました。デバイスツリーnxp_mcxnx4x_common.dtsi
#DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(flexcan0)) の場合
CLOCK_SetClkDiv(kCLOCK_DivFlexcan0Clk、1U);
CLOCK_AttachClk(kFRO_HF_to_FLEXCAN0);
#endif
flexcan0: can@d4000 {
互換性 = "nxp、flexcan";
レジスタ = <0xd4000 0x4000>;
割り込み = <62 0>;
割り込み名 = "common";
クロック = <&syscon MCUX_FLEXCAN0_CLK>;
clk-source = <0>;
ステータス = "無効";
};
いずれのラベリングも Zephyr OS の一部ではないようです。これを正しく設定する方法についてヒントを教えていただけますか?
助けてくれてありがとう!
こんにちは@mwagner1
frdm_mcxn947.overlayファイルを追加してみてください
&flexcan0 {
status = "okay";
clock-frequency = <48000000>;
bitrate = <125000>;
sample-point = <875>;
bus-speed-data = <1000000>;
sample-point-data = <750>;
};
BR
ハリー
これにより、dt のコンパイル エラーが発生します。
デバイスツリーエラー: /home/user/project/build/Zephyr/zephyr.dts.pre の /soc/peripheral@50000000/can@d4000 に 'clock-frequency' が表示されます。しかし、/home/user/project/zephyr/dts/bindings/can/nxp,flexcan.yaml の 'properties:' では宣言されていません。
以下はコンパイルされますが、ビットレートはまだ間違っています。
&flexcan0 {
ステータス = "正常";
// クロック周波数 = <48000000>;
ビットレート = <125000>;
サンプルポイント = <875>;
// バス速度データ = <1000000>;
// サンプルポイントデータ = <750>;
};
こんにちは@mwagner1
申し訳ありませんが、この問題を再現CAN。それは時計の問題だと思います。
社内チームと協議する必要がありますので、何かニュースがあればすぐにお知らせします。
BR
ハリー
ありがとう、これで問題は解決しました。
#DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(flexcan0)) の場合
CLOCK_SetClkDiv(kCLOCK_DivFlexcan0Clk、3U);
CLOCK_AttachClk(kPLL0_to_FLEXCAN0);
#endif
こんにちは@mwagner1
社内チームに確認しました。このビットレート精度の問題はクロック ソースによって発生します。ファイルfrdm_mcxn947/board.c ボードのクロックを設定し、内部 FRO からクロックを供給します。アプリケーションとカスタムボードがこのボードをカスタマイズすることが予想されます。c必要に応じてファイルを変更するには、 Zephyrのクロック設定を参照してください。 。
https://github.com/zephyrproject-rtos/zephyr/pull/98900には、このボードの CAN FD サポートを有効にするオープン プル リクエストもあり、その PR では、必要な精度を実現するために、代わりに PLL0 からクロックするように board.c が変更されています。
参考にして頂ければ幸いです。
BR
ハリー