
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
PSoC® コントロール エリア ネットワーク (CAN) プロトコル トラブルシューティング ガイド - KBA224456 - Community Translated (JA)
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 5LP 、PSoC 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 開発を始めるまえに下記のドキュメントに目を通してください:
- CAN Component Datasheet : これは対応しているすべての PSoC コントローラの CAN コンポーネントのデータシートです。
- AN52701 - PSoC® 3 and PSoC 5LP - Getting Started with Controller Area Network (CAN): これは PSoC Creator で PSoC 3 や PSoC 5LP の CAN コンポーネント使用方法概要が記載されたアプリケーションノートです。
- CE97311 - PSoC® 4 M: CAN Simplex Communication with CapSense®: これは PSoC Creator で PSoC 4M, PSoC 4L, PSoC 4S の CAN コンポーネント使用方法概要を示すサンプルコードです。
さらに下記のドキュメントがご参照いただけます:
- PSoC® 3 Architecture TRM
- PSoC® 5LP Architecture TRM
- PSoC 4100M / PSoC 4200M Family: PSoC® 4 Architecture Technical Reference Manual (TRM)
- PSoC 4200L Family: PSoC 4 Architecture Technical Reference Manual (TRM)
- PSoC 4100S and PSoC 4100S Plus: PSoC 4 Architecture Technical Reference Manual (TRM)
1.3 サンプルプロジェクト
PSoC Creator は対応しているデバイス用に CAN basic と CAN full のサンプルコードを含んでいます。メニューから File > Code Example を選択します。Find Code Example ウィンドウの中で、Device family ドロップダウンリストからご使用の PSoC ファミリを選択してください。Filter のドロップダウンリストから CAN を選択してください。図 1 参照
図 1. PSoC Creator で CAN のサンプルコードを選択する
1.4 CAN プロジェクト開発用 Cypress キット
以下が それぞれの PSoC ファミリに対応したプロトタイピングキットとトランシーバキットのリンク一覧です。
- PSoC 4 ファミリ: CY8CKIT-046 PSoC® 4 L-Series Pioneer KitCY8CKIT-044 PSoC® 4 M-Series Pioneer Kit
- PSoC 3 ファミリ: CY8CKIT-030 PSoC® 3 Development Kit
- PSoC 5LP ファミリ:CY8CKIT-050 PSoC® 5LP Development Kit
- トランシーバキット: CY8CKIT-026 CAN and LIN Shield Kit
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 コンポーネントを設定するのには以下の手順に従ってください。
- Project.cydwr > Clocks の中でクロックが 対応するドキュメントにしたがって設定されていることを確認する。CAN コンポーネント ハードウェア設定の手順 2 をご参照ください。
- CAN コンポーネントをドラッグ&ドロップする。
- CAN Tx と Rx ピンを適切なポートに設定する。
- CAN コンポーネント設定の General タブの内容を設定する。
- ボーレートを希望の値に設定する。コンポーネント設定で BRP, TSET, SJW に適切なものを選択する。
- Rx バッファを設定する
- 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 ジャンパの回路図と接続の詳細
- 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 を使用したトリム
- IMO を使用する代わりに、CAN クロックの要求精度を満たす外付けの水晶または発振器を使用する。図 4 のように、使用する PSoC デバイスの所定のピンに外部クロックが接続されていることをご確認ください。
図 4. 外部クロックを有効にする
- PSoC 3 と PSoC 5LP では、3 MHz に設定された IMO を使用することが可能です。IMO は精度が ±1% であるため、ボーレートが 125 kbps までの CAN で使用することが可能です。それよりも高いボーレートを実現するためには、精度 ±0.5% の外付けクロックが必要になります。
詳細については AN60631 - PSoC® 3 and PSoC 5LP Clocking Resources と AN52701 - PSoC® 3 and PSoC 5LP - Getting Started with Controller Area Network (CAN) をご参照ください。 - DB9 コネクタを使用される場合には、ケーブルは直接接続されたケーブルであることをご確認ください。
ケーブルの種類については http://www.interfacebus.com/Can_Bus_Connector_Pinout.html をご参照ください。図 9 に DB9 メスコネクタの CAN ピンを示します。
図 9. DB9 コネクタ
2.3 CAN のエラーイベントを監視するための割込み設定
CAN の送受信で発生する問題を監視してデバッグするために、エラーイベントの監視が役に立ちます。発生したエラーへの対応はユーザーソフトウェアの責任となります。CAN コンポーネントの Interrupt (割込み) タブでは割込み発生を有効にできるイベントの一覧が表示されています。CAN コンポーネントに割り当てられている ISR は一つだけです。そのため発生したいかなるイベントに対してもその ISR が起動されます。そのため、メッセージ受信イベントもエラーイベントも同一の ISR を起動します。ソフトウェア上で CAN_INT_SR_REG の該当するフラグを確認して、発生したイベントを処理することが必要になります。ここではエラー割込みの処理について説明します。
CAN 設定ウィンドウで必要な割込みを有効にしてください。図 6 参照
図 6. CAN の割込みを有効にする
ある割込みが有効になると、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 をご参照ください。
- CY_ISR(CAN_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. ピン設定
2. Clocking タブへ移動して、下記のパラメータを設定します:
- In clock
- In clk en
- In reset
- Out clock
- Out clk en
図 8. クロック設定
3. clock コンポーネントをドラッグ&ドロップして設定します:
- Initially align to:HFCLK
- Frequency: 24 MHz
図 9. Clock コンポーネント設定
4. 図 10 のように、clock コンポーネントをピンに接続します。
図 10. Clock コンポーネントをピンに接続する
これでオシロスコープを使用して 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. クロック エラー
CAN のソースクロックは HFCLK です。SYSCLK はデバイス内で HFCLK から生成されるすべての他のクロックと以上の周波数である必要があります。SYSCLK が CAN ソースクロックと同等かそれよりも高い周波数であることをご確認ください。
4. よくある質問 (FAQ)
1. 一つの ID もしくはある範囲内の ID だけを受信するようにフィルタを設定するのにはどうしたら良いですか?
以下がメールボックスを設定する手順です。
Full CAN で単一の ID だけを受信するようにする:
- CAN コンポーネントを右クリックしてConfigure を選択する。
- Receive Buffers タブへ移動
- mailbox を選択する
- Full CAN を選択する。
- ID カラムにフィルタしたい ID を入力する。
詳細については PSoC 4100M/4200M Family PSoC 4 Architecture TRM の section 17.5.2 Acceptance Filter をご参照ください。 Basic CAN で単一の ID だけを受信するようにする:
- CAN コンポーネントを右クリックしてConfigure を選択する。
- Receive Buffers タブへ移動
- mailbox を選択する
- Basic CAN を選択する。
- 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 TRM の section 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 の受信フィルタ
例えば、標準 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. バスーオフ リスタート
ファームウェアから以下のコードスニペットを使用してリスタートすることも可能です。
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 タブ
図 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 ファイルは再度生成され、追加されていたカスタムコードは無効になります。
ワークアラウンドとしてはメールボックスをリネームする前にカスタムコードをコピーしておくことです。カスタムコードを書き戻すのには
- メールボックスをリネームします。
- プロジェクトをビルドします。
- コードを書き込みます。
- プロジェクトを再度ビルドします。
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 を有効にする
22. CAN メッセージを使用して PSoC をハイバネートモードからウェイクアップするのにはどうしたら良いですか?
CAN コンポーネントは PSoC をハイバネートモードからウェイクアップさせることは出来ません。しかし、CAN Rx ピンを割込みピンに設定してデバイスをウェイクアップすることは可能です。
- Rx ピンを右クリックして Configure を選択します。
- Input タブへ移動します。
- Interrupt as Falling edge を選択します。
- Rx ピンに IRQ ターミナルが表示されます; ISR コンポーネントをその Rx ピンに接続してください。
ローパワーモードについては以下のアプリケーションノートをご参照ください。
デバイスをハイバネートモードまたは他のローパワーモードからウェイクアップしている間は、ダミーフレームを送信してください。実データの送信はウェイクアップ終了後にのみ開始することが可能です。
23. CAN コンポーネントはユニバーサル デジタル ブロック (UDB) の使用をサポートしていますか?
いいえ。UDB で CAN コンポーネントは実装できません。
24. CAN コンポーネントに CAN-open ライブラリはありますか?
いいえ。CAN-open ライブラリを使用したサンプルはありません。
25. PSoC で CAN FD はサポートされていますか?
いいえ。現在のところ PSoC は CAN FD をサポートしていません。しかし、これは将来の車載 PSoC デバイス向けには検討されているところです。