Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

PSoC® コントロール エリア ネットワーク (CAN) プロトコル トラブルシューティング ガイド - KBA224456 - Community Translated (JA)

PSoC® コントロール エリア ネットワーク (CAN) プロトコル トラブルシューティング ガイド - KBA224456 - Community Translated (JA)

SivaK_96
Employee
Employee
50 questions asked 10 questions asked 5 questions asked

Community Translated by  Motoo Tanaka        Version: *A

Translation - English: Control Area Network (CAN) Protocol Troubleshooting Guide for PSoC® - KBA224456

質問:

コントロール エリア ネットワーク (CAN) コンポーネントを使用する時に一般的に注意しなくてはいけないことはなんでか? また、さまざまな CAN の問題のトラブルシューティングはどのように行ったらよいでしょうか?

回答:

このドキュメントでは PSoC® CAN コンポーネントの一般的な使用方法のガイドラインを示します。良く報告されている問題とデバッグの手順も記載します。このドキュメントは PSoC CAN のトラブルシューティングガイドとしてご利用いただけます。

1. 一般的な情報

1.1 CAN 認証テストレポート

1.2 参照文献とリンク

1.3 サンプルプロジェクト

1.4 CAN プロジェクト開発用 Cypress キット

1.5 ことなる PSoC ファミリの CAN コンポーネントの比較

2. CAN コンポーネントの設定手順

2.1 PSoC Creator での CAN コンポーネントの設定

2.2 ハードウェア接続ガイドライン

2.3 CAN のエラーイベントを監視するための割込み設定

3. CAN 不具合のデバッグ

3.1 CAN フレームが受信されない

3.2 CAN フレームが送信されない

3.3 WCO をトリムすると通信に不具合が発生する

3.4 CY8CKIT-026 で CAN が動作しなかった

3.5 特定のノードが CAN メッセージを受信しなかった、あるいは送信しなかった

3.6 CAN プロジェクトで PSoC Crator がクロックエラー出す

4. よくある質問 (FAQ)

1. 一つの ID もしくはある範囲内の ID だけを受信するようにフィルタを設定するのにはどうしたら良いですか?

2. CAN Rx ID を動的に変更するのにはどうしたら良いですか? AMR と ACR レジスタを変更するのにはどうしたら良いでしょうか?

3. バスーオフ (bus-off) コンディションはどのように対応したらよいでしょうか?

4. 動的にボーレートを変更するのにはどうしたら良いでしょうか?

5. CAN_SetPreScaler () と CAN_SetTsegSample () はどのように使用するのですか?

6. CAN 通信に必要とされる異なる発振器にはどのようなものがありますか?

7. 受信したメッセージが RTR メッセージであることを確認するのにはどうしたら良いですか?

8. 受信したメッセージの識別子はどのように読み取るのですか?

9. メールボックスがメッセージを受信したことを確認するのにはどうしたら良いですか?

10. CAN ブートローダのサンプルはありますか?

11. PSoC CAN コンポーネントは CAN 割込みによる DMA トリガリングをサポートしていますか?

12. CAN メールボックスをリンクするにはどうしたら良いですか?

13. メールボックスをリネームすると CAN_TX_RX_func.c に追加したユーザーコードが消されてしまいます。どのように対応したら良いですか?

14. CAN コンポーネントは Vector スタックをサポートしていますか?

15. PSoC は 1つのデバイスで 2つの CAN ブロックをサポートしていますか?

16. J1939 ライブラリのサンプルプロジェクトはありますか?

17. CAN コンポーネントに オンボードダイアグノスティック (OBD) ライブラリはありますか?

18. CAN コンポーネントで CAN ID に 0x1FFFFFFF を設定できないのはなぜですか?

19. 先に受信したデータを失わずに 8バイト以上を受信するのにはどうしたら良いですか?

20. CAN エラーのカウンタはあるのですか、そしてカウンタが終了した場合何が起こりますか?

21. CAN_SendMessage が一回コールされただけで CAN の送信が連続するのはなぜですか?

22. CAN メッセージを使用して PSoC をハイバネートモードからウェイクアップするのにはどうしたら良いですか?

23. CAN コンポーネントはユニバーサル デジタル ブロック (UDB) の使用をサポートしていますか?

24. CAN コンポーネントに CAN-open ライブラリはありますか?

25. PSoC で CAN FD はサポートされていますか?

1. 一般的な情報

CAN コンポーネントは PSoC 3 PSoC 5LPPSoC 4100M PSoC 4200M PSoC 4200L PSoC 4100S Plus ファミリでサポートされています。

PSoC 4M と PSoC 4100S Plus には車載グレードのデバイスがあります。

CAN コンポーネントは CAN2.0A および CAN2.0B プロトコルの実装をサポートし、 ISO 11898-1 に準拠しています。上位のライブラリは CAN コンポーネントでは実装されていません。CAN 上の独自のライブラリを開発していただけます。このドキュメントは読者が PSoC3, PSoC 4, PSoC 5LP デバイスと PSoC Creatorに関する基本的な知識をお持ちであることを仮定しています。

もしこれらのデバイスを初めてお使いになる場合には、AN54181 - Getting Started with PSoC® 3 AN77759 - Getting Started with PSoC® 5LP AN79953 – Getting Started with PSoC 4 をご参照ください。もし PSoC Creator を初めてお使いになる場合には PSoC Creator home pageをご参照ください。

1.1 CAN 認証テストレポート

CAN コンポーネントは C&S group GmbH から標準プロトコルとデータリンクレイヤー適合試験 (the standard protocol and data link layer conformance test) に基づいて認証を受けています。完全な認証試験報告書については こちらまでお問合せください

1.2 参照文献とリンク

PSoC の CAN 開発を始めるまえに下記のドキュメントに目を通してください:

さらに下記のドキュメントがご参照いただけます:

1.3 サンプルプロジェクト

PSoC Creator は対応しているデバイス用に CAN basic と CAN full のサンプルコードを含んでいます。メニューから File > Code Example を選択します。Find Code Example ウィンドウの中で、Device family ドロップダウンリストからご使用の PSoC ファミリを選択してください。Filter のドロップダウンリストから CAN を選択してください。図 1 参照

図 1. PSoC Creator で CAN のサンプルコードを選択する

001-pastedImage_26.png

1.4 CAN プロジェクト開発用 Cypress キット

以下が それぞれの PSoC ファミリに対応したプロトタイピングキットとトランシーバキットのリンク一覧です。

1.5 異なる PSoC ファミリの CAN コンポーネントの比較

PSoC 3 と PSoC 5LP ファミリに実装されている CAN コンポーネントは同じものです。PSoC 4 (PSoC 4M, PSoC 4L, PSoC 4S) ファミリでの実装は PSoC 3 と PSoC 5LP のものとは少し異なります。

表 1 は比較表となります。

表 1. CAN コンポーネント 実装上の差異

特徴

PSoC 3 と PSoC 5LP の CAN

PSoC 4M, PSoC 4L, PSoC 4S Plus の CAN

シングルショット転送

なし

あり

外部ループバックテストモード

なし

あり

データバイト エンディアン 選択

なし

あり

Rx が 11 ビットタイム以上スタックアット '0' (ドミナント) 時の割込み

なし

あり

RTR の割込み

なし

あり

アクセスエラー取得レジスタ

なし

あり

API 設定のセーブとリストア

あり

なし

CAN コンポーネントのマクロやレジスタの一部は PSoC 3, PSoC 5LP と PSoC 4ファミリでは異なります。

該当する PSoC ファミリのレジスタ テクニカル リファレンス マニュアル (TRM) とアーキテクチャ TRM をご参照ください。

2. CAN コンポーネントの設定手順

2.1 PSoC Creator での CAN コンポーネントの設定

CAN コンポーネントの設定を始める前に予め 1.2 参照文献とリンク をご参照ください。PSoC Creator で CAN コンポーネントを設定するのには以下の手順に従ってください。

  1. Project.cydwr > Clocks の中でクロックが 対応するドキュメントにしたがって設定されていることを確認する。CAN コンポーネント ハードウェア設定の手順 2 をご参照ください。
  2. CAN コンポーネントをドラッグ&ドロップする。
  3. CAN Tx と Rx ピンを適切なポートに設定する。
  4. CAN コンポーネント設定の General タブの内容を設定する。
  5. ボーレートを希望の値に設定する。コンポーネント設定で BRP, TSET, SJW に適切なものを選択する。
  6. Rx バッファを設定する
  7. Tx バッファを設定する。

2.2 ハードウェア接続ガイドライン

必要なボーレートやリスニングモードの設定に基づいて適切な CAN トランシーバを選択します。トランシーバによっては設定や初期化に SPI を必要とするものもあります。 開発時には CY8CKIT-026 CAN and LIN Shield Kit をご利用いただけます。以下は CY8CKIT-026 キットの接続ガイドラインと PSoC Creator 内での設定変更です:

  • CY8CKIT-026 をアルデュイーノ互換コネクタを使用してベースキットに接続してください。CY8CKIT-026 は2つの CAN トランシーバを搭載しています:CAN1 と CAN2。J3_10 (CAN_Rx) と J3_9 (CAN_Tx) をトランシーバの適切な CAN_Rx と CAN_Tx に接続してください。(J19 - CAN1 または J9 - CAN2)
  • 有効にする CAN トランシーバは CY8CKIT-026 キットの電源設定に依存します。ベースボードから電源を供給する場合には CAN2 だけが有効にできることにご注意ください。(CY8CKIT-026 の ジャンパ J20  ピン1 と ピン2 が相互に接続されている場合) 両方の CAN トランシーバを有効にしたい場合、シールドキットに外部から電源を供給する必要があります、同時にこの電源はベースボードにも供給されます。(J20 ピン 2-3 が接続されているか J20 ピン 3-4 が接続されている場合)。図 2 にCY8CKIT-026 のジャンパ J20 の回路図と接続の詳細を示します。有効にする CAN トランシーバに応じて適切な位置にジャンパを設定していることをご確認ください。

図 2. CY8CKIT-026 J20 ジャンパの回路図と接続の詳細

002-pastedImage_5.png

  • CAN のクロック精度要求はボーレートが 125 kbps までは ±1.58%で、それ以上のボーレートでは 0.5% となります。CAN のクロック ソースは PSoC 4 では HFCLK 、PSoC 3 と PSoC 5LP では BUS_CLK になります。これらのクロックが高精度のクロックから生成されていることをご確認ください。PSoC 4 の CAN プロジェクトで高精度の CAN クロックを使用するのには下記のような選択肢があります:
    • もしデバイスが内部メイン発振器 (IMO) で動作している場合には、外部の時計水晶発振器 (WCO) を使用してトリムする必要があります。IMO の誤差精度は ±2% ですが、これは CAN プロトコル仕様を逸脱しています。図 3 のように WCO を使用したトリムを有効にする必要があります。基板に WCO 水晶 (32 kHz) が実装されて、PSoC の適切なピンに接続されていることをご確認ください。ピンを調べるのには、該当する PSoC デバイスのデータシートをご参照ください。

図 3. WCO を使用したトリム

003-pastedImage_6.png

      • IMO を使用する代わりに、CAN クロックの要求精度を満たす外付けの水晶または発振器を使用する。図 4 のように、使用する PSoC デバイスの所定のピンに外部クロックが接続されていることをご確認ください。

図 4. 外部クロックを有効にする

004-pastedImage_7.png

図 9. DB9 コネクタ

005-pastedImage_8.png

2.3 CAN のエラーイベントを監視するための割込み設定

CAN の送受信で発生する問題を監視してデバッグするために、エラーイベントの監視が役に立ちます。発生したエラーへの対応はユーザーソフトウェアの責任となります。CAN コンポーネントの Interrupt (割込み) タブでは割込み発生を有効にできるイベントの一覧が表示されています。CAN コンポーネントに割り当てられている ISR は一つだけです。そのため発生したいかなるイベントに対してもその ISR が起動されます。そのため、メッセージ受信イベントもエラーイベントも同一の ISR を起動します。ソフトウェア上で CAN_INT_SR_REG の該当するフラグを確認して、発生したイベントを処理することが必要になります。ここではエラー割込みの処理について説明します。

CAN 設定ウィンドウで必要な割込みを有効にしてください。図 6 参照

図 6. CAN の割込みを有効にする

006-pastedImage_9.png

ある割込みが有効になると、CAN.h 内の該当するマクロが 1 に設定されます。

例えば、設定ウィンドウで Bit stuffing error detected を選択してプロジェクトをビルドした場合、CAN.h 内で #define CAN_STUFF_ERR が1 に定義されていることを見ることが出来ます。

CAN.h 内の以下のコードが有効になります:

#if (CAN_Rx_STUFF_ERR)

void CAN_BitStuffErrorIsr(void);

#endif /* CAN_Rx_STUFF_ERR */

CAN_Rx_STUFF_ERR が 1 に定義されているとき、関数 void CAN_BitStuffErrorIsr(void) は有効になります。この関数は bit stuff 割込みを処理するのに使用可能です。

コードスニペットから、CAN_INT.c 内にコメント /* `#START BIT_STUFF_ERROR_ISR` */ に続くコードをインクルードします。

void CAN_Rx_BitStuffErrorIsr(void)

{

        /* Clear Stuff Error flag */

        CAN_Rx_INT_SR_REG = CAN_Rx_STUFF_ERROR_MASK;

        /* `#START BIT_STUFF_ERROR_ISR` */

        //Place your code here

        /* `#END` */

        #ifdef CAN_Rx_BIT_STUFF_ERROR_ISR_CALLBACK

          CAN_Rx_BitStuffErrorIsr_Callback();

        #endif /* CAN_Rx_BIT_STUFF_ERROR_ISR_CALLBACK */

}

ISR ルーチンの中に bit error を処理するコードを追加することも可能ですし、コールバック関数 CAN_Rx_BitStuffErrorIsr_Callback() に bit error 処理をインクルードすることも可能です。コールバック関数を有効にするためには、ヘッダファイル cyapicallbacks.h に下記のマクロを追加します:

#define CAN_Rx_BIT_STUFF_ERROR_ISR_CALLBACK

この手法は CAN の設定ウィンドウ内で有効にしたすべての割込みに適用可能です。そしてプロジェクトと CAN ネットワークのデバッグに役立ちます。

3. CAN 不具合のデバッグ

ここでは CAN でよく発生する問題とその問題のデバッグ手順について触れます。

3.1 CAN フレームが受信されない

  • CAN ISR が実行されているか確認してください。
    • CY_ISR(CAN_ISR) 内で受信メッセージのラグがクリアされているかご確認ください。
      受信メッセージフラグをクリアするのに下記コードを追加してください:

      /* Clear Receive Message flag */CAN_INT_SR_REG = CAN_RX_MESSAGE_MASK;
    • CAN 割込みが CY_ISR_PROTO(ISR_CAN) を使用して別のファイルに移動されている場合、CyIntSetVector(CAN_ISR_NUMBER, ISR_CAN)  を使用して割込みベクタを設定してください。受信メッセージフラグをクリアしていることを確認してください。 AN90799 - PSoC® 4 Interrupts  の 4.2 Creating Custom ISR をご参照ください。
  • CAN_1_SetOpMode() と CAN_1_Start() が正しくコールされているかご確認ください。
  • CAN コンポーネントのボーレートが正しく設定されているかご確認ください。
  • *.cydwr で、CAN のクロックソースが正しく設定されているかご確認ください。IMO を使用されている場合、図 3 のように IMO が WCO のトリムが有効になっていることをご確認ください。
  • WCO、外付け水晶、または外付け発振器が基板に正しく設置されていることをご確認ください。2. CAN コンポーネントの設定手順 参照。
  • 送信実験を行ってオシロスコープでビットの時間をご確認ください。ビットの時間が CAN の許容範囲に入っていることをご確認ください。
  • トランシーバが正しく設定され、かつ適切に接続接続されているかご確認ください。使用しているトランシーバが目的のボーレートをサポートしているかご確認ください。
  • トランシーバのピンがデータシートの記載にしたがって接続されていることをご確認ください。
  • 2.3 CAN のエラーイベントを監視するための割込み設定で記載されている割込み処理を使用してエラーイベントを監視してください。エラーの種類にかかわらず、もしノードが自力でエラーから復帰できない場合、エラーカウンタが増加してバス-オフ (bus-off) エラーに至ります。

    以下は CAN メッセージ受信時に発生する可能性のあるエラーです、それぞれのエラーに対処していることをご確認ください。
    • Stuff error: 水晶か発振器をご確認ください。WCO による IMO トリムに関しては、WCO 水晶をご確認ください。
    • CRC error: このエラーは主に送信機で発生しネットワークは復帰可能です。バス上のデータと送信されたデータをご確認ください。
    • Form error: ハードウェア接続をご確認ください。CAN-H または CAN-L が 0 (GND) に張り付いていないかご確認ください。ビット論理に影響を与えるような外部 ESD が発生していないかご確認ください。

3.2 CAN フレームが送信されない

Bit、Ack、Bus-off エラーが発生していないかご確認ください。もし発生していた場合には:

  • バスに終端抵抗が接続されているかご確認ください。
  • バスの接続をご確認ください。
  • *.cydwr で CAN クロックソースが適切に設定されているかご確認ください。IMO を使用されている場合、図 3 のように IMO が WCO のトリムが有効になっていることをご確認ください。
  • WCO、外付け水晶、または外付け発振器が基板に正しく設置されていることをご確認ください。2. CAN コンポーネントの設定手順 参照。
  • CAN コンポーネントのボーレートが正しく設定されているかご確認ください。
  • CAN_1_SetOpMode() と CAN_1_Start() が正しくコールされているかご確認ください。
  • 送信実験を行ってオシロスコープでビットの時間をご確認ください。ビットの時間が CAN の許容範囲に入っていることをご確認ください。
  • トランシーバが正しく設定され、かつ適切に接続接続されているかご確認ください。使用しているトランシーバが目的のボーレートをサポートしているかご確認ください。

3.3 WCO をトリムすると通信に不具合が発生する

WCO が基板上に正しく設置されているかご確認ください。図 3. に示されているように WCO を使用した IMO のトリムに適正な値を設定してください。

WCO が IMO を正しくトリムしていることを確認するために、WCO トリムが有効に設定されている時 HFCLK をピンに接続することが可能です。これによりトリム後の IMO が CAN クロック仕様の許容範囲に入っているかを確認することが可能です。この処理はデジタル信号インターフェース (DSI) を搭載したデバイスのみで行えることにご注意ください。ご使用のデバイスが DSI を搭載しているかについては、当該デバイスのアーキテクチャ TRM かデータシートをご参照ください。

HFCLK をピンに出力するのには以下の手順に従ってください:

1. Digital output pin を回路図にドラッグ&ドロップして、図 7 のように hardware connection を無効して設定してください。

図 7. ピン設定

007-pastedImage_7.png

2. Clocking タブへ移動して、下記のパラメータを設定します:

    • In clock
    • In clk en
    • In reset
    • Out clock
    • Out clk en

図 8. クロック設定

008-pastedImage_8.png

3. clock コンポーネントをドラッグ&ドロップして設定します:

    • Initially align to:HFCLK
    • Frequency: 24 MHz

図 9. Clock コンポーネント設定

009-pastedImage_9.png

4. 図 10 のように、clock コンポーネントをピンに接続します。

図 10. Clock コンポーネントをピンに接続する

010-pastedImage_10.png

これでオシロスコープを使用して IMO クロックを監視することが出来るようになります。

3.4 CY8CKIT-026 で CAN が動作しなかった

このシールドがカスタム基板に接続されていたり、Cypress アルデュイーノ互換基板の上に搭載されていない場合、CAN で使用するためには以下のジャンパ設定が必要になります:

  • CAN 1 トランシーバにはアルデュイーノ ヘッダの J1 - Pin5 (V3.3) が 3.3V か 5V に接続されている必要があります
  • CAN 2 トランシーバにはアルデュイーノ ヘッダの J1 - Pin7 (P4 VDD) が 3.3V か 5V に接続されている必要があります

CAN 1 トランシーバは 125 Kbps までのボーレートをサポートしていることにご注意ください。もしより高速なボーレートが必要な場合、CAN 2 トランシーバを使用して ジャンパ J10 を実装して終端抵抗を追加してください。  CY8CKIT-026 CAN and LIN Shield Kit Guide 参照。

3.5 特定のノードが CAN メッセージを受信しなかった、あるいは送信しなかった

いつでもオシロスコープで CAN Tx と Rx データを確認してください。CAN メッセージが受信、または送信されないときには、いつでも stuff error が発生している可能性があります (3.1 CAN フレームが受信されない 参照)。IMO がトリムされていなかったり WCO 水晶やレイアウトが原因で CAN クロックが正しくない場合、ボーレートはビットタイムの要求に適合しません。WCO の選択と搭載方法については AN95089 - PSoC® 4/PRoC™ BLE Crystal Oscillator Selection and Tuning Techniques   の section 8 Crystal Analysis for WCO をご参照ください。

3.6 CAN プロジェクトで PSoC Creator がクロック エラー出す

図 11 は PSoC Creator による CAN プロジェクトでのクロック エラーの表示です。

図 11. クロック エラー

011-pastedImage_11.png

CAN のソースクロックは HFCLK です。SYSCLK はデバイス内で HFCLK から生成されるすべての他のクロックと以上の周波数である必要があります。SYSCLK が CAN ソースクロックと同等かそれよりも高い周波数であることをご確認ください。

4. よくある質問 (FAQ)

1. 一つの ID もしくはある範囲内の ID だけを受信するようにフィルタを設定するのにはどうしたら良いですか?

以下がメールボックスを設定する手順です。

Full CAN で単一の ID だけを受信するようにする:

    1. CAN コンポーネントを右クリックしてConfigure を選択する。
    2. Receive Buffers タブへ移動
    3. mailbox を選択する
    4. Full CAN  を選択する。
    5. ID カラムにフィルタしたい ID を入力する。

詳細については PSoC 4100M/4200M Family PSoC 4 Architecture TRMsection 17.5.2 Acceptance Filter をご参照ください。 Basic CAN で単一の ID だけを受信するようにする:

    1. CAN コンポーネントを右クリックしてConfigure を選択する。
    2. Receive Buffers タブへ移動
    3. mailbox を選択する
    4. Basic CAN  を選択する。
    5. main.c で CAN_RX_CFG 型の変数を定義する。

      CAN_RX_CFG rxMailbox;
      basic CAN の設定では、ID は 受信マスクレジスタ (acceptance mask register : AMR)  と 受信コードレジスタ (acceptance code register : ACR) を使用して設定されます。ここのメールボックスは独自の AMR と ACR を持ちます。以下が AMR と ACR の各ビットの意味になります。
    • [31;3] - 識別子 (ID[31:21] - IDE = 0 における識別子、ID[31:3] - IDE = 1 における識別子)
    • [2] - IDE,
    • [1] - RTR,
    • [0] - N/A

CAN_RX_CFG 構造体は 4 つの要素 rxmailbox, rxamr, rxacr, rxcmd を持ちます。

ID を設定するのには、メールボックスの AMR と ACR を変更して受信フィルタを設定します。例えば、メールボックスに 0x001 を ID として設定するのには、下記の様に AMR と ACR を設定します:

rxMailbox.rxmailbox = 0;

rxMailbox.rxamr= 0x001FFFF9u; //IDE=0 (Standard ID, RTR=0,Bit[31:21]=0 to AMR register

/* writing 1 to a bit in amr register makes respective acr bit as don't care. If 0 the/n corresponding bit in acr register is checked for filtering. */

rxMailbox.rxacr = 0x00200000u; // Write ID = 0x001 to Bit[31:21] (most significant 11 bits of this register for standard ID).

ある範囲の ID を受信するためには、basic mailbox を使用します。メールボックスが 0x180 - 0x187 の範囲の ID  を受信するように設定するのには、IDE = 0 (クリア), RTR = 0 (クリア)、AMR と ACR レジスタは表 2 のように設定します。

表 2. AMR と ACR レジスタの値:

ACR の値

AMR の値

コメント

ACR[31:21] = 0x180

AMR[31:21] = 0x7

0x180 から 0x187 の範囲のID を受信するためには ID [31:21] の最後の3 ビットはドントケアに設定します。 よって、AMR は 0x7 に設定されます。

ACR[20:3] = 0x0 (ドントケア)

AMR[20:3] = 0x3FFFF (すべて 1)

識別子の 11 ビットすべてドントケア

ACR[2] = 0

AMR[2] = 0

IDE = 0

ACR[1] = 0

AMR[1] = 0

RTR =0

ACR[0] = 0

AMR[0] = 0

N/A

rxMailbox.rxamr= 0x007FFFF9u; //Writing to AMR register

rxMailbox.rxacr=0x30000000u; //180<<21

このようにして、AMR レジスタはある範囲の ID を受信するように設定可能です。

2. CAN Rx ID を動的に変更するのにはどうしたら良いですか? AMR と ACR レジスタを変更するのにはどうしたら良いでしょうか?

ID を動的に設定するためには、CAN コンポーネントの受信フィルタを設定する必要があります。詳細については PSoC 4100M/4200M Family PSoC 4 Architecture TRMsection 17.5.2 Acceptance Filter をご参照ください。図 11 に CAN の受信フィルタを示します。標準 (11-ビット) 識別子の場合、AMR と ACR レジスタのビット番号 21 から 31 がフィルタリングに使用されます。拡張 (29-ビット) 識別子の場合、AMR と ACR レジスタのビット番号 3 から 31 が使用されます。1

図 12 では、メッセージフレームは 11-ビットの識別子を持ち、9番目と10番目のビットはドントケア (0 でも 1 でも可) を要求しています。AMR レジスタのこれらの2-ビットには 1 を書き込む必要があります。そのため、図 12 においてビット 30 と 29 は 1 に設定されています。

図 12. CAN の受信フィルタ

012-pastedImage_7.png

例えば、標準 ID を 0x11 に変更したい場合、ACR レジスタのビット 31 から 21 の値を 0x011 に設定する必要があります。ACR レジスタを確認する受信フィルタのために、AMR レジスタの対応するビットを 0 に設定してください。以下のコードスニペットが該当する PSoC ファミリで使用可能です。

PSoC 3 と PSoC 5LP ファミリ:

標準 ID:

/*0x110 is new ID assigned in the below code, you can assign your own ID */       

uint8 result = CAN_FAIL;

uint32 temp_amr;

uint32 temp_acr;

/* obtain necessary value to put in AMR (Bit[31;21]is Mask set to 0 for ID, Bit[20:3]=1, Bit2(IDE)=0, Bit1 RTR=0,Bit0=N/A */

temp_amr = ((uint32)0x0u << 21u) | ((uint32)0x3FFFFu << 3u);

/* obtain necessary value to put in ACR (Bit[31;21]is ID=0x110, Bit[20:3]=1, Bit2(IDE)=0, Bit1 RTR=0,Bit0=N/A */

temp_acr = ((uint32)0x110u << 21u) | ((uint32)0x3FFFFu << 3u);

/*Writing to AMR reg and check if success*/

if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxamr, temp_amr) == CYRET_SUCCESS)

{

/*Writing to ACR reg and check if success*/

      if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxacr, temp_acr) == CYRET_SUCCESS)

      {

          result = CYRET_SUCCESS;

      }

}

拡張 ID:

uint8 result = CAN_FAIL;

uint32 temp_amr;

uint32 temp_acr;       

temp_amr = ((uint32)0x0u << 3u); /* obtain necessary value to put in AMR (Bit[31;3] are zero */

temp_acr = ((uint32)0x110u << 3u); /* obtain necessary value to put in ACR (Bit[31;3] is ID 0x110, */

temp_acr |= (uint32)0x04u; /* Bit2(IDE)=1*/

  if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxamr, temp_amr) == CYRET_SUCCESS)

  {

      if (CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxacr, temp_acr) == CYRET_SUCCESS)

      {

          result = CYRET_SUCCESS;

      }

  }

}

ここで、temp_acr = ((uint32)0x110u << 3u); 行で temp_acr に ID を保存しています。

API コール  CAN_RXRegisterInit((reg32 *)&CAN_RX[1].rxacr, temp_acr)  が ACR レジスタに ID  を書き込んでいます。

PSoC 4 ファミリ:

#define AMR_1 (0x001FFFF9) /* AMR (Bit[31;21]is Mask set to 0 for ID, Bit[20:3]=1, Bit2(IDE)=0, Bit1   RTR=0,Bit0=N/A*/

#define ACR_1 (0x00600000) /* ACR (Bit[31;21]is ID=0x110, Bit2(IDE)=0, Bit1   RTR=0,Bit0=N/A*/

CY_SET_REG32((reg32 *) (&CAN_Rx_RX[0].rxamr),AMR_1);

CY_SET_REG32((reg32 *) (&CAN_Rx_RX[0].rxacr),ACR_1);

3. バスーオフ (bus-off) コンディションはどのように対応したらよいでしょうか?

バスーオフ コンディションは CAN コントローラのエラーカウントが 255 に達した場合です;これは、エラーが発生した時にコントローラが回復することが出来なかったということです。これは bus-off ISR を発行し、 ISR 内でフラグを設定することが可能です。ISR の設定についての詳細は 2.3 CAN のエラーイベントを監視するための割込み設定 をご参照ください。バスーオフ コンディションが発生した場合、CAN コントローラを再起動する必要があります。図 13 で示されるように、CAN コンポーネントには バスーオフの後に自動的にリスタートする機能もあります。

図 13. バスーオフ リスタート

013-pastedImage_6.png

ファームウェアから以下のコードスニペットを使用してリスタートすることも可能です。

CAN_Start();

CyIntSetVector(CAN_ISR_NUMBER, ISR_CAN);

CAN_Stop() をコールする必要はありません。

4. 動的にボーレートを変更するのにはどうしたら良いでしょうか?

CAN_SetPreScaler ()  と CAN_SetTsegSample () API を使用して、prescaler, Tset, sjw の値をそれぞれ変更してください。ボーレートを変更するのには、Tseg1, Tseg2, SJW, BRP を変更する必要があります。これらの値はクロック周波数とサンプルポイントによって決定されます。あるクロックとボーレート用にこれらの値を特定するためには、コンポーネントの設定ウィンドウの Timing タブの表を参照してください。図 14 はボーレート 125 Kbps のときの例です。

図 14. CAN 設定ウィンドウの Timing タブ

014-pastedImage_8.png

図 14 ではソースクロック 24-MHz ボーレート 125 Kbps での、BRP と Tseg の値がリストされています。ネットワークとサンプルポイントの要求に合わせて値を選択してください。図 14 で、サンプルポイント 81.3 の場合、値は: BRP = 11, Tseg1 = 12, Tseg2 = 3, SJW = 3 となっています。

下記、Timing タブの値に基づいてボーレートを設定するコードスニペットです。

#define BITRATE           (11u) //BRP

#define TSEG1             (12u - 1u) //TSEG1

#define TSEG2             (3u - 1u) //TSEG2

#define SJW               (3u - 1u) //SJW

#define SAMPLING_MODE     (0u) //number of sample point

if (CAN_SetPreScaler(BITRATE) == CYRET_SUCCESS) //Set the BRP value

{

CAN_SetTsegSample(TSEG1,TSEG2,SJW,CAN_SAMPLING_MODE) == CYRET_SUCCESS) //Set TSEG1,TSEG2,SJW and sampling mode.

}

5. CAN_SetPreScaler () と CAN_SetTsegSample () はどのように使用するのですか?

Tseg1, Tseg2, SJW を設定するのには、目的の値より 1 小さい値を CAN_SetTsegSample () 関数に渡してください。BRP を設定するのにはその値を CAN_SetPreScaler ()  関数に渡してください。

例えば、Tseg1 = 11, Tseg2 = 4, SJW = 4, サンプリングモード = 1 (詳細は CAN コンポーネントのデータシートをご参照ください) に設定する場合、以下の値を渡します。

CAN_SetTsegSample(10,3,3,1);

PSoC Creator で、 CAN.h 内に以下の #define があるか確認してください:

#define CAN_CFG_REG_TSEG1

#define CAN_CFG_REG_TSEG2

#define CAN_CFG_REG_SJW

     これら #define は ‘値 - 1’ となっています。これら #define されている値は CAN_Init()関数の中で、 CAN_SetTsegSample に渡されます。(CAN.h ファイル参照)

6. CAN 通信に必要とされる異なる発振器にはどのようなものがありますか?

表 3に異なるデバイスやシナリオで使用される発振器の一覧を示します。

表 3. デバイスよって実装されている発振器

Oscillator

PSoC 4200M, PSoC 4100M

PSoC 4100 S Plus

PSoC 3 and PSoC 5LP

IMO

✔ (IMO= 3 MHz, CAN ではボーレート 125 kbps まで)

IMO with WCO
外部発振器✔ (DSI システムクロック)
外部 MHz 水晶

詳細は 2. CAN コンポーネントの設定手順 をご参照ください。

7. 受信したメッセージが RTR メッセージであることを確認するのにはどうしたら良いですか?

RTR メッセージが受信されたかを確認するのには、CAN0_CAN_RX0_CONTROL レジスタの 21番目のビットをアクセスしてください。 CAN がRTR メッセージを受信するとこのビットがセット (1) されます。 PSoC 4100M/4200M Family PSoC 4 Architecture TRM  の section 3.1.1 CAN0_CAN_RX0_CONTROL をご参照ください。

CAN0_CAN_RX0_CONTROL レジスタは CAN_RX_REG マクロで定義されています。よって、下記のようにマクロをアクセス可能です:

uint32 reg;

reg= (uint32)CAN_RX_REG;

その後、レジスタの 21番目のビットを読むことが可能です。

8. 受信したメッセージの識別子はどのように読み取るのですか?

PSoC 3 と PSoC 5LP で受信メッセージ ID を取得する方法

拡張 ID の場合:

(CY_GET_REG32(CAN_RX_ID_PTR(i)) >> CAN_SET_TX_ID_EXTENDED_MSG_SHIFT)

標準 ID の場合:

(CY_GET_REG32(CAN_RX_ID_PTR(i)) >> CAN_SET_TX_ID_STANDARD_MSG_SHIFT)

PSoC 4 で受信メッセージ ID を取得する方法

拡張 ID の場合:

CAN_GET_RX_IDE(i)

標準 ID の場合:

CAN_GET_RX_ID(i)

9. メールボックスがメッセージを受信したことを確認するのにはどうしたら良いですか?

各メールボックスは ID をもっています。

PSoC 4 では、各メールボックスの状態は CANn_BUFFER_STATUS レジスタで与えられます (0: メールボックスが空の場合、と 1: メールボックスに未読のメッセージがある場合)。

表 4 のバッファステータスレジスタの内容をご参照ください。

表 4. CAN バッファ ステータス レジスタ

RxMessage and TxMessage Buffer Status
Address: 0x402E0008

        Retention: Retained

Bits

7

6

5

4

3

2

1

0

SW   Access

R

R

R

R

R

R

R

R

HW   Access

RW

RW

RW

RW

RW

RW

RW

RW

Name

RX7_MSG_AV

RX6_MSG_AV

RX5_MSG_AV

RX4_MSG_AV

RX3_MSG_AV

RX2_MSG_AV

RX1_MSG_AV

RX0_MS

Bits

15

14

13

12

11

10

9

8

SW   Access

R

R

R

R

R

R

R

R

HW   Access

RW

RW

RW

RW

RW

RW

RW

RW

Name

RX15_MSG_AV

RX14_MSG_AV

RX13_MSG_AV

RX12_MSG_AV

RX11_MSG_AV

RX10_MSG_AV

RX9_MSG_AV

RX8_MSG

Bits

23

22

21

20

19

18

17

16

SW   Access

R

R

R

R

R

R

R

R

HW   Access

RW

RW

RW

RW

RW

RW

RW

RW

Name

TX7_REQ_PEND

TX6_REQ_PEND

TX5_REQ_PEND

TX4_REQ_PEND

TX3_REQ_PEND

TX2_REQ_PEND

TX1_REQ_PEND

TX0_REQ_P

Bits

31

30

29

28

27

26

25

24

SW   Access

None

HW   Access

None

Name

None   [31:24]

PSoC 3 と PSoC 5LP ではメールボックスの状態は CAN[0..0]_CSR_BUF_SR レジスタで与えられます。レジスタの詳細は表 5 をご参照ください。

表 5. CAN0_SR_BUF_SR

BUF_SR

Reset: Domain reset for non-retention flops [reset_all_nonretention]

Register: Address

CAN0_CSR_BUF_SR: 0x4000A008

Bits

15

14

13

12

11

10

9

8

SW Access:Reset

R:0

R:0

R:0

R:0

R:0

R:0

R:0

R:0

HW Access

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Retention

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

Name

rx_msg15

rx_msg14

rx_msg13

rx_msg12

rx_msg11

rx_msg10

rx_msg9

rx_msg8

Bits

7

6

5

4

3

2

1

0

SW Access:Reset

R:0

R:0

R:0

R:0

R:0

R:0

R:0

R:0

HW Access

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Retention

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

Name

rx_msg7

rx_msg6

rx_msg5

rx_msg4

rx_msg3

rx_msg2

rx_msg1

rx_msg0

Bits

31

30

29

28

27

26

25

24

SW Access:Reset

NA:00000000

HW Access

NA

Retention

NA

Name

RSVD

Bits

23

22

21

20

19

18

17

16

SW Access:Reset

R:0

R:0

R:0

R:0

R:0

R:0

R:0

R:0

HW Access

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Retention

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

NONRET

Name

tx_msg7

tx_msg6

tx_msg5

tx_msg4

tx_msg3

tx_msg2

tx_msg1

tx_msg0

これらのレジスタをアクセスするのには CAN_BUF_SR_REG マクロを使用してください。このマクロは PSoC 3、PSoC 4、PSoC 5LP デバイスで使用可能です。

Bits

7

6

5

4

3

2

1

0

SW   Access

R

R

R

R

R

R

R

R

HW   Access

RW

RW

RW

RW

RW

RW

RW

RW

Name

RX7_MSG_AV

RX6_MSG_AV

RX5_MSG_AV

RX4_MSG_AV

RX3_MSG_AV

RX2_MSG_AV

RX1_MSG_AV

RX0_MSG_AV

10. CAN ブートローダのサンプルはありますか?

PSoC 5LP CAN ブートローダサンプルは ここ にあります。PSoC 3 と PSoC 5LP 用の CAN ブートローダを作成するのにはこのサンプルをご参考にしてください。

PSoC 4では、 PSoC 4 Bootloader コンポーネントを custom communication でご使用ください (Bootloader コンポーネントのデータシート参照)。ブートローダサンプルプロジェクトに含まれている CAN_BOOT.c を参照して PSoC 4 CAN コンポーネント API を使用してください。

11. PSoC CAN コンポーネントは CAN 割込みによる DMA トリガリングをサポートしていますか?

PSoC 4M と PSoC 4L ファミリは CAN 割込みによる DMA のトリガリングはサポートしていません。 PSoC 4100S Plus ファミリは CAN 割込みによる DMA のトリガリングをサポートしています。

12. CAN メールボックスをリンクするにはどうしたら良いですか?

複数のメッセージが受信されると、現在のメッセージは上書きされてしまいます。上書きされることを回避するためには、メールボックスのリンクフラグ (RX_CMD レジスタのビット番号 6) を使用して CAN メールボックスをリンクします。メールボックス 1 と メールボックス 2 をリンクするのにはメールボックス 1 のリンクフラグをセット (1) します。メールボックス 2 と メールボックス 3 をリンクするのには メールボックス 2 のリンクフラグをセット (1) します、以下同様に行います。

リンクをするのに最も容易な方法は CAN_SET_RX_LINKING(i) マクロを使用することです、ここで i はメールボックスの番号になります。

CAN を開始後、マクロを以下のように使用できます:

CAN_SET_RX_LINKING(0);

CAN_SET_RX_LINKING(1);

.

.

.

CAN_SET_RX_LINKING(14);

最後のメールボックスでこのビットをセットしてはいけません、それは 15番目のメールボックスでリンクするメールボックスが存在しません。

メールボックスをリンクした後は、メッセージはメールボックスに順次保存されます (最初のメッセージがメールボックス 0 に、2番目のメッセージが メールボックス 1 に、以下同様) 。メッセージに各対応するメールボックスからアクセスすることが可能です。全てのメールボックスで AMR と ACR の設定が同じになっていることをご確認ください。

CAN_SET_RX_LINKING(i) マクロに書き込むためには、コマンドレジスタの書込み保護ビットをクリア(0) する必要があります。コマンドレジスタの書込み保護ビットをクリアするのには CAN_CLEAR_RX_WNPL() を使用して、セット (1) するのには CAN_SET_RX_WNPL() を使用します。

より詳細な情報については CAN component Datasheet と、該当するデバイスの Architecture TRM 、Register TRM をご参照ください。

13. メールボックスをリネームすると CAN_TX_RX_func.c に追加したユーザーコードが消されてしまいます。どのように対応したら良いですか?

メールボックスがリネームされると、CAN_TX_RX_func.c ファイルは再度生成され、追加されていたカスタムコードは無効になります。

ワークアラウンドとしてはメールボックスをリネームする前にカスタムコードをコピーしておくことです。カスタムコードを書き戻すのには

    1. メールボックスをリネームします。
    2. プロジェクトをビルドします。
    3. コードを書き込みます。
    4. プロジェクトを再度ビルドします。

14. CAN コンポーネントは Vector スタックをサポートしていますか?

PSoC 3 には Vector  CAN-互換コンポーネントがあります。PSoC 3 では Vector から提供されているドライバとあわせて Vector CAN コンポーネントをご使用ください。詳細は device datasheet をご参照ください。

PSoC 5LP と PSoC 4 には Vector CAN コンポーネントはありません。しかし、これらのデバイスに独自のスタックを構築することは可能です。

15. PSoC は 1つのデバイスで 2つの CAN ブロックをサポートしていますか?

PSoC 3、PSoC 5LP、PSoC 4100S Plus は 1つのブロックしか搭載していません。PSoC 4L と PSoC 4M は 2つのブロックをサポートしています。

16. J1939 ライブラリのサンプルプロジェクトはありますか?

いいえ。J1939 サンプルプロジェクトはありません。

17. CAN コンポーネントに オンボードダイアグノスティック (OBD) ライブラリはありますか?

CAN コンポーネントに OBD ライブラリはありません。

18. CAN コンポーネントで CAN ID に 0x1FFFFFFF を設定できないのはなぜですか?

CAN プロトコルの仕様によると、CAN メッセージ ID の最上位 7 bit が全てリセッシブ (1) になることは出来ません、そのため、可能なメッセージ ID の範囲は標準 11-ビット識別子では 0x000 から 0x7EF まで、拡張 29-ビット識別子では 0x00000000 から 0x1FBFFFFF までとなります。よって CAN コンポーネントは ID として 0x1FFFFFFF を受諾しません。

19. 先に受信したデータを失わずに 8バイト以上を受信するのにはどうしたら良いですか?

12. CAN メールボックスをリンクするにはどうしたら良いですか?を参照してください。

20. CAN エラーのカウンタはあるのですか、そしてカウンタが終了した場合何が起こりますか?

はい、CAN 2.0 仕様でエラーカウンタが規定されています。CAN_GetTXErrorCount() と CAN_GetRXErrorCount() API がそれぞれ Tx と Rx のエラーカウントを返します。エラーカウントが 255 に到達した場合、 CAN ノードは送信することが許されません。これはバスーオフ (bus-off) エラーと呼ばれます。バスーオフエラーが発生した後に、CAN コントローラはリセットを行わなくてはなりません。

21. CAN_SendMessage が一回コールされただけで CAN の送信が連続するのはなぜですか?

CAN のプロトコルによると CAN はデータを送信して ACK を確認します。もしノードが全く ACK を受信しなかった場合、エラーカウントを 8増やして再度送信を行います。これが CAN が ACK を受信するか、バスーオフエラーが発生するまで継続されます。そのため、CAN_SendMessage を一回しかコールしていなくても、連続したメッセージを観測することになります。もし、メッセージの再送信が好ましくない場合には、single shot transmission モードをご使用ください。このモードでは ACK を受信しない場合でもメッセージは再送信されません。これは PSoC 4 でサポートされていますが、PSoC 3 と PSoC 5LP ではサポートされていません。

図 15 に CAN 設定ウィンドウでsingle shot transmission モードを有効にする例を示します。

図 15. CAN 設定ウィンドウで Single Shot Transmission を有効にする

015-pastedImage_165.png

22. CAN メッセージを使用して PSoC をハイバネートモードからウェイクアップするのにはどうしたら良いですか?

CAN コンポーネントは PSoC をハイバネートモードからウェイクアップさせることは出来ません。しかし、CAN Rx ピンを割込みピンに設定してデバイスをウェイクアップすることは可能です。

    1. Rx ピンを右クリックして Configure を選択します。
    2. Input タブへ移動します。
    3. Interrupt as Falling edge を選択します。
    4. Rx ピンに IRQ ターミナルが表示されます; ISR コンポーネントをその Rx ピンに接続してください。

ローパワーモードについては以下のアプリケーションノートをご参照ください。

デバイスをハイバネートモードまたは他のローパワーモードからウェイクアップしている間は、ダミーフレームを送信してください。実データの送信はウェイクアップ終了後にのみ開始することが可能です。

23. CAN コンポーネントはユニバーサル デジタル ブロック (UDB) の使用をサポートしていますか?

いいえ。UDB で CAN コンポーネントは実装できません。

24. CAN コンポーネントに CAN-open ライブラリはありますか?

いいえ。CAN-open ライブラリを使用したサンプルはありません。

25. PSoC で CAN FD はサポートされていますか?

いいえ。現在のところ PSoC は CAN FD をサポートしていません。しかし、これは将来の車載 PSoC デバイス向けには検討されているところです。

0 件の賞賛
1096 件の閲覧回数
寄稿者