これは、ビギナーズ・ガイド・シリーズの第4回目の記事で、MR-CANHUBK344 評価ボードを使用して、CANバスを介してCANメッセージを送受信できるようにCANペリフェラルを構成する方法を紹介することを目的としています。
MR-CANHUBK344ボードの詳細や、MBDTを使用してMR-CANHUBK344ボード上でSimulink®モデルを実行するステップバイステップの手順については、シリーズの最初の記事「MR-CANHUBK344でのデジタル入力/出力の操作」を確認してください。
この記事のアプリケーションは、デジタル入力とアナログ入力を読み取り、それらをCANバスを介して1つのCANインスタンスから別のCANインスタンスに送信する前に処理し、受信したメッセージに基づいてデジタル出力とアナログ出力を制御することにより構成されています。
最初の記事でご紹介した要件に加え、この記事で開発するアプリケーションには、MathWorksのVehicle Network ToolboxTMが必要です。
この記事では、CANバスとやりとりを行えるデバイスを使用して、CANバスを介して送信されるメッセージを紹介します。使用している特定のモデルは、PCAN-USB Pro FDです。
この章では、ボードのコンポーネントが相互に正しく通信を行うために、構成プロジェクトで変更しなければならない点に焦点を当てます。DIO、ADC、PWM の設定については前回の記事で説明しましたので、今回は主にCAN関連の設定に焦点を当てます。
MR-CANHUBK344 ボードには6 つの CAN インスタンスがあり、その中に 3 つの異なるトランシーバーがあります。CAN0 と CAN1 は TJA1443ATK を使用し、CAN2 と CAN3 は TJA1463ATK を使用し、CAN4 と CAN5 は TJA1153 を使用します。各CANインスタンスには、デイジーチェーン配線を可能にするために、互いに配線された2つの同一のコネクタがあり、AとBのラベルが付いています。
この記事では、CAN0とCAN1のインスタンス間の通信に焦点を当てます。
注意:CANバスは通常、両端に60Ωの終端抵抗が必要です。これは、付属のCAN Termボードのいずれかを使用して行うことができます。
CANインスタンスが適切に動作するためには、未使用のコネクタ(ある場合)は、MR-CANHUBK344パッケージに同梱されているCAN Termボードに接続する必要があります。
以下に、CAN0インスタンスがトランシーバーに接続され、それらの間で信号がどのようにルーティングされるかを示す回路図があります。
CANインスタンスのピンは、回路図内のコンポーネント名を検索することで見つけることができます。
この記事の目的のために、以下に必要なピンを抽出しました。_RX ピンと _TX ピンは CAN インスタンスに直接リンクされていますが、_ERRN、_STB、および _EN ピンは、上の回路図に示すように、CAN インスタンスに関連付けられたトランシーバーに対応しています。
ピンの構成を開始するには、S32 Configuration Tools内のPins Toolを開く必要があります。モデルの構成プロジェクトをすばやく開くには、MBDTブロックをダブルクリックして表示されるウィンドウからConfigure(構成)ボタンをクリックします。ソフトウェアが開いたら、Pin(ピン)ボタンをクリックすると、Pins Toolが開きます。
Pins Tool内では、Pinsタブと呼ばれる左上のウィンドウに焦点を当てます。
まず、検索バーに名前を入力して、追加しようとしているピンが構成にすでに存在するかどうかを確認します。
ここでは、この目的で他のピンが構成されていないことがわかります(左側のボックスに緑色のチェックマークがないためです)。
これは、構成する12個のピンごとに実行する必要があります。このプロセスは、最初の記事「MR-CANHUBK344でのデジタル入出力の操作」で詳しく紹介されています。
ここでは、ピンがすでに存在するケースを説明します。古い構成を削除するために実行すべきステップは、緑色のチェックマークをクリックし、ポップアップ・ウィンドウで現在選択されているオプションのチェックを外すことです。
すべてのピンを確認した後、構成したいピンの追加を開始できます。
注意:CAN_RX、CAN_ERRNは入力であり、CAN_TX、CAN_STB、CAN_ENは出力です。CAN_STB と CAN_ENは出力です。なぜなら、トランシーバーを通常の動作モードに切り替えて初期化するために、これらに適切な値を設定するからです。一方、CAN_ERRNは入力です。これは、トランシーバーの初期化時に発生する可能性のある問題をMCUに通知するために使用されます。
これを行うには、検索バーにピンの値を入力します。例として、構成しているピンの一部を見てみましょう:LED_CAN0ピンは、CANコネクタの近くに配置された赤色のLEDに接続されています。このLEDは、ボード上の他のLEDと同様に、CANとは別に使用されます。また、他のLEDと同様に逆論理を共有しています。
対応する値はPTC18であり、これをフィルターに入力します。その後、Identifier(識別子)とLabel(ラベル)のフィールドにピンの名前を入力します。次に、左側のチェックマークをクリックし、表示されたウィンドウで適切なオプションを選択します。ここでは、LED用にSIUL2:gpio,82オプションを選択します。出力であるLEDを構成するため、ピンの方向を指定するウィンドウでOutput(出力)オプションを選択します。
他のピンの場合もプロセスは同様ですが、CAN_RXピンとCAN_TXピンを構成する際には、使用可能な信号のリストから別の信号を選択する必要があることに注意してください。設定しているピンの違いにより、CAN_ERRN、CAN_EN、CAN_STB は入力/出力として SIUL2 周辺機器に接続されており、CAN_RX と CAN_TX はそれぞれの CAN 周辺機器に接続されています。CAN0_RXピンの見え方は次のとおりです:
これは、構成後のCAN0およびCAN1インスタンスの信号の様子です。
信号を同様に表示するには、下部のウィンドウのRouting Details(詳細のルーティング)という検索バーに「CAN」と入力してください。
次に、強調表示されたボタンをクリックしてPeripherals Tool(ペリフェラル・ツール)に戻る必要があります。
CAN インスタンスの設定を開始するには、まず Can_43_FlexCAN コンポーネントを開き、CanConfigSet パネル内の CanController タブに移動します。
ここでは、CAN0とCAN1のインスタンスに対応する2つのCANコントローラを構成します。
CanControllerセクションは、アプリケーションの要件に応じてCANコントローラのインスタンスを構成するために必要なすべての設定を提供します。他のものよりも頻繁にやり取りすることが予期されているものもあるため、これらが何を行うのかを説明することに焦点を当てています。
Name(名前)フィールドは、コントローラに関連づけられた名前を管理し、他のメニューでコントローラを参照するために使用されます。
Can Hardware Channel(CANハードウェア・チャネル)は、現在のコントローラに接続されている物理的なCANインスタンスを制御します。
Can Controller Activation(Canコントローラの有効化)チェックボックスをオンにすると、Canコントローラが有効になります。それがないと、コントローラは動作しません。
CAN Rx/Tx Processing Type(CAN Rx/Tx処理タイプ)は、ポーリングに設定されている間、PDU(プロトコル・データ・ユニット)イベントを処理するために、CAN_MainFunction_Read()およびCAN_MainFunction_Write()を通じて読み取りおよび書き込み操作を有効化/無効化します。パラメータがPOLLING(ポーリング)またはMIXED(ミックス)に設定されている場合、記載された機能はRX Indication(RX表示)またはTX Confirmation(TX確認)のためにポーリングを行います。パラメータがMIXED(ミックス)に設定されている場合、属性CanHardwareObjectUsesPollingがtrue(真)に設定されているハードウェア・オブジェクトのみが影響を受けます。あるいは、パラメータがINTERRUPTに設定されている場合、
Can FD ISO は、コントローラでフレキシブルデータレート機能が有効かどうかを制御します。この例では、CANインスタンス間の通信にCan FDプロトコルを使用するため、これが確認されます。
Can Controller Default Baudrate(CANコントローラのデフォルト・ボーレート)フィールドは、コントローラに割り当てるボーレート構成を選択する役割を担っています。ボーレートの構成は、次の画面に表示されます。
CanCpuClockRefを使用すると、基準クロックを選択できます。CANペリフェラルには、FLEXCAN_PE_CLK0_2とFLEXCAN_PE_CLK3_5の2つのクロックがあり、それぞれCAN0、CAN1、CAN2とCAN3、CAN4、CAN5をカバーしています。これらのクロックはMcuコンポーネント内で構成できます。次の章でこれが示されます。
「Name」フィールドは、前の画面の「Can Controller Default Baudrate」フィールドで選択するために使用されます。
Can Automatic Time Segments Calculation(Can自動タイムセグメント計算)は、ビットレートとCanコントローラのプリスケーラに応じて、Canプロパゲーション・セグメント、Canフェーズ・セグメント1、およびCanフェーズ・セグメント2を自動的に設定するために使用できます。
Can Controller Prescaler (Canコントローラプリスケーラ)は、選択したクロックに基づいて、コントローラのプリスケーラを設定します。
Can Controller BaudRate (Kbps)(Canコントローラのボーレート(Kbps))はデータ転送速度を制御します。
Can Propagation Segment(Canプロパゲーション・セグメント)、Can Phase Segment 1(Canフェーズ・セグメント1)、およびCan Phase Segment 2(Canフェーズ・セグメント2)を含む次のセクションでは、CAN転送のタイミングを構成できます。
最後に、下部のセクションで、Can FD Controller Baudrate(Can FDコントローラ・ボーレート)、Can FD Propagation Segment(Can FDプロパゲーション・セグメント)、Can FD Phase Segment 1(Can FDフェーズ・セグメント1)、Can FD Phase Segment 2(Can FDフェーズ・セグメント2)、Can FD Resynch Jump Width(Can FD再同期ジャンプ幅)、Can FD Prescaler (Can FDプレスケータ)を変更することにより、FD(Flexible Data-Rate)プロトコルのタイミングを構成できます。これらは、以前の設定のFD相当として見なすことができます。
最初のセクションでは、現在のCanコントローラに関連づけられているCanRamBlockを構成することができます。CANコントローラのCAN RAMには、PDUバッファとして定義されたCANハードウェア・オブジェクトが含まれています。CAN RAMブロックは、異なるサイズ構成でメッセージ・バッファを保存できます。
S32K3XXリファレンス・マニュアルによると、RAMブロックには8バイトのメッセージを32件、16バイトのメッセージを21件、32バイトのメッセージを12件、または64バイトのメッセージを7件、保存できます。
第2セクションCanRxFifoでは、RX Fifoを追加または削除できます。S32K3XXリファレンス・マニュアルによると、Enhanced RX FIFOを使用できるのはCAN0のみです。したがって、別のCANインスタンスとFDプロトコルを使用している場合、CanLegacyFifoとFDプロトコルの非互換性のためにCanRxFifoを無効にする必要があります。
この記事のアプリケーションには、相互に通信する2つのCANインスタンスが含まれているため、既存のCANコントローラに加えて、別のCANコントローラをセットアップする必要があります。
2番目のCanコントローラの構成を確実に始めるには、現在のコントローラの構成をコピーして新しいものに貼り付けてください。
上記の手順を完了すると、2つの同一のCanコントローラができあがり、アイテムが重複しているために競合が発生します。これを解決するには、2番目のCanコントローラの詳細を入力してください。
この場合、Name(名前)、Can Hardware Channel(Canハードウェア・チャネル)、Can Controller ID(CanコントローラID)(単にインクリメントする必要があります)、およびCan Controller Default Baudrate(Canコントローラのデフォルト・ボーレート)(Name(名前)フィールドを変更すると、ドロップダウン・リストに正しいボーレートが表示されます)を変更するだけです。
この新しく作成された Can コントローラで変更する必要がある最後の設定は、CAN1 には Enhanced Fifo 機能がなく、同時に FD プロトコルを使用しているため、CanRxFifo を削除することです。
次のステップは、CanConfigSet メニュー内の CanHardwareObject タブで Can Hardware Objects を設定することです。
前のサブチャプターと同様の方法で、使用できるオプションの説明に焦点を当てます。
まず、一般的なルールとして、RXオブジェクトはオブジェクト・リスト内のTXオブジェクトの前に配置する必要があります。したがって、最も低いTXオブジェクトのID以上のIDのあるRXオブジェクトは存在しないはずです。
名前フィールドは、MBDTブロック内に表示されるハードウェアオブジェクトに関連付けられた名前を制御します。
Can ID メッセージタイプは、CAN メッセージの ID タイプが拡張、混合、または標準であるかを制御します。
Can Object ID(CanオブジェクトID)はハードウェア・オブジェクトの識別子として機能します。0から始まり、空白や欠落なく続ける必要があります。
Can Object Type(Can Object Type)は、ハードウェア・オブジェクトがCANメッセージの送受信に使用されるかどうかを制御します。
CANコントローラー参照は、このオブジェクトがどのCANコントローラーに設定されているかを選択します。
Can Hw Object Countは、ハードウェアFIFO内の要素数を定義します。
CanHwFilterはメッセージをフィルタリングするために使用されます。
Can Hw Filter Mask (Canハードウェア・フィルター・マスク)はフィルターのどの部分をアクティブにするかを特定します。10進数536870911を2進数に変換すると11111111111111111111111111111(29桁)です。これは、拡張ID形式が29ビットであるため、マスクがフィルター全体を有効にしていることを意味します。
Can Hw フィルターコードは、フィルターマスクに基づいてメッセージと比較されるIDです。
画像の例を見てみましょう:
フィルター・コード: 00000000000000000001111110000(10進数で1008)
フィルター・マスク:11111111111111111111111111111
許可されるID:00000000000000000001111110000(10進数で1008)
これは、フィルターが拡張ID 1008からのメッセージのみを許可することを意味します。
フィルターに複数の値を許可したい場合は、フィルター・マスクを変更して、すべてのビットがフィルター・コードと等しいかどうかをフィルターがチェックしないようにする必要があります。
別の例:
フィルター・コード:00000000000000000001111110000(10進数で1008)
フィルターマスク:1111111111111111111111111111
0許可されたID:00000000000000000001111110000、
00000000000000000001111110001
(10進数で1008と1009)
この場合、フィルター・マスクはフィルター・コードと異なる最後のビットを許可します。
すでに存在するCanハードウェア・オブジェクトはCanController_0に対して適切に構成されているため、変更を行う必要はありません。
しかし、CAN1がCAN0インスタンスと通信できるようにするためには、TX(送信)ハードウェアオブジェクトを追加する必要があります。
それを行うには、強調表示された「+」ボタンをクリックし、それに応じてオブジェクトを設定してください。代替案として、CanHardwareObject_Can0_Tx_Interruptから構成をコピーし、CAN1に関連するフィールドのみを変更することができます。
これは、正しいコントローラーを反映するようにNameを変更し、Can Object IDを更新し、Can Object TypeがTRANSMITに設定されていることを確認し、Can Controller ReferenceをCanController1を指すように変更することを意味します。
これらの構成手順を完了すると、CAN0はメッセージの受信と送信の両方を行うように設定され、CAN1はメッセージの送信のみを行うように設定されます。
CANインターフェースは、低レベルのCANドライバーとAUTOSARスタックの上位通信サービス層の間にあります。CANトランシーバーやCANコントローラなどのさまざまな CANハードウェア・デバイス・タイプとやりとりする手段を提供します。
次に、新しく作成されたCanコントローラ(CAN1用)をCanInterfaceのCanIfCtrlDrvCfgメニュー内のCanIfCtrlCfgセクションに追加する必要があります。
新しい CanIfCtrlCfg 要素を追加するには、+ ボタンを押してから、CanIfCtrlId フィールドを更新し、CanIfCtrlCanCtrlRef に対して適切な Can Controller を選択する必要があります。
CANインスタンスを正しく機能させるためには、McuコンポーネントのMcuModuleConfiguration内のMcuModeSettingsConfタブでクロックを有効にする必要があります。
このページに移動したら、下にスクロールして、FlexCANインスタンスに対応するクロックが有効になっていることを確認する必要があります。デフォルトでは、現在の構成で有効になっていますが、CANペリフェラルにはクロックが必要であることを忘れないことが重要です。
一連のCanコントローラの基準クロックCanCpuClockRefを変更する場合は、McuClockSettingsConfig > McuClockReferencePointで確認することができます。
設定ツールの最後のステップは、このモデルで使用しているCANインスタンスの割り込みを設定し、割り込みベースのブロックを使用できるようにすることです。それを行うには、Peripherals Toolの左側にあるPlatformボタンをクリックして、プラットフォームコンポーネントに移動します。
その後、Interrupt Controller(割り込みコントローラ)タブに移動する必要があります。ここで、現在構成されているすべての割り込みを確認できます。
CANインスタンスを構成するには、構成するFlexCANインスタンスが表示されるまでスクロールしてください。この記事では、CAN0インスタンスとCAN1インスタンスを使用するため、これら2つのインスタンスを構成します。
FlexCAN割り込みに関しては、FlexCAN0_0には9つの一般的な割り込みリクエストが含まれ、FlexCAN0_1~FlexCAN0_3インスタンスには96のメッセージバッファ割り込みが含まれます。割り込みマッピングの詳細については、リファレンス・マニュアルS32K3XXRM内の添付ファイルS32K3xx_interrupt_map.xlsxを参照してください。
ご覧のとおり、そのうちの1つはすでに構成されているため、FlexCAN1インスタンスを次のように構成するだけで済みます:
以前に構成した入力/出力ピンも、第2.3章と同様に、Dioコンポーネントで構成する必要があります。最初の記事MR-CANHUBK344のデジタル入力/出力の操作を参照してください。
現在、Dioコンポーネントの内部で、後でモデル内でトランシーバーを有効にするために使用する入出力ピンを構成しています。
プロセスを簡単に説明すると、作業中の構成と一致しないデフォルトのピンを削除する必要があります。この状況では、DioPort PTC_HからCanController_0_EN、CanController_0_STB、CanController_0_ERRN チャネルを削除することを意味します。
その後、以前に設定した入力/出力ピンを追加します。
この記事のアプリケーションでは、前回の記事で構成された方法で、AdcおよびPwmコンポーネントとFreeMASTER機能を使用します。
UartとFreeMASTERの構成方法の詳細については、2番目の記事UART経由でデータを送信し、FreeMASTERで信号を監視」を参照してください。
AdcとPwmの構成については、このシリーズの3番目の記事ADCとPWMによるLEDの強度の制御でステップバイステップの手順を確認できます。
これらのコンポーネントの場合、参照記事で説明されているセットアップと違いはありません。
この記事のアプリケーションの目的は、以前のコンポーネントを1つの例に組み込むことです。このアプリケーションは、ADCポテンショメータとUSER_SW2ボタンの2つの入力からデータを収集し、それを処理してパッケージ化し、CANバスを介して送信することで構成されています。これにより、他のCANインスタンスがデータを受信し、2つの出力を制御できるようになります。2つの出力は、USER_SW2ボタンの押下に応じて点灯する青色LEDと、ポテンショメータの回転に基づいて強度が変化する赤色LEDです。
次の図は、このアプリケーションのフローをよりよく理解するためのものです。
さて、モデルを小さな部分に分解してみましょう。
左上から始めますが、モデルはいくつかの変数を使用します。これらは、目的に基づいてグループ化されています。例えば、ADCのChannel1変数は、ADCから読み取った値を保持する責任があります。同様に、CANインスタンスの場合、変数Dataと変数Length は、CANバスで受信したメッセージを表します。
最後のパネルは最も重要なもので、CANメッセージが展開された直後のDioペリフェラルおよび Aioペリフェラルの値を表します。
初期化セクションに進み、ここでコンポーネントを準備するために必要な操作を実行します。この特定のケースでは、2つのCANトランシーバーを初期化するために、その入力の2つをHIGHに設定します。
初期化サブシステムでは、結果バッファがADC変換に対して設定され、グループ通知が有効化されているため、グループの変換が完了すると、構成されたADCコールバックが実行されます。
最後に、このボードではLEDに反転ロジックが使用されているため、ボードのLEDをオフにします。つまり、通常はボードと一緒にLEDもオンになります。
FreeMASTER Config ブロックは、このプロジェクトで FreeMASTER 機能を有効にするために使用されます。
次に進みますが、モデルのアクティブな部分、つまり各ステップを実行し、ADCのグループ変換を開始する部分について説明する前に、もう1つ説明すべきブロックがあります。変換が完了すると、ADCのハードウェア割り込みがトリガーされ、ハードウェア割り込みコールバック・ブロックにリンクされているサブシステムがADC信号を出力します。
CAN Packブロックは、ポテンショメータの回転量に応じて0Vから3.3Vの電圧を表す浮動小数点数を受け入れるように構成されているため、単一データ型への変換が行われます。
指定どおり、入力であるAioとDioからデータを収集することから始めます。Aioの場合、ADCによって読み取られた電圧を表すために値をスケーリングします。
データをパッケージ化し、転送後に解釈できるように、DBCファイルを使用しています。DBCはCANデータベース・ファイルであり、CANメッセージを通じてどのような信号が保存され送信されるかを記述します。
その後、データは VNT パッキングブロック(VNT は Vehicle Network ToolboxTM の略)に送信されます。CAN PACK ブロックを開くと、DBC ファイルで設定された信号が適切に解析され、ブロックがそれらを入力として期待していることがわかります。
ADC値は0V~3.3Vの電圧を表す32ビット変数になりますが、Dio変数はボタンが押されているかどうかを表す1ビットのみです。合計で、変数は5バイトを占め、これがメッセージの長さになります。
次のブロックであるCAN Unpackは、CANトランスミッション・ブロックによって送信される生データをCANフレームから抽出するために使用されます。
Can_Writeは、Canブロックで利用可能な機能の1つであり、その名前が示すように、CANバスを介してCANメッセージを送信する役割を担っています。
2番目のドロップダウン・アイテムでは、どのCanHardwareObjectがデータを送信するかをユーザーが選択できます。ここに表示されるアイテムは、2.3.2セクションのメニューでTRANSMIT(送信)として構成されたアイテムです。このアプリケーションでは、データは割り込みベースのハードウェア・オブジェクトを使用して送信されています。
CAN FD Message(CAN FD メッセージ)チェックボックスは、送信するメッセージがCAN FDプロトコルを使用しているかどうかを選択し、Extended ID CAN Message(拡張 ID CAN メッセージ)は ID の形式を選択します。
これらは、構成ソフトウェアで行われた設定を反映する必要があります。
アプリケーションの後半は、CAN1 から送信されたメッセージを CAN0 が受信することから始まります。
この仕組みについて注意すべき重要な点の1つは、メッセージの受信は、ハードウェア割り込みコールバックをトリガーするCANif_RxIndicationに基づいているということです。その後、データにアクセスすることができます。
Hardware_Interrupt_Handler ブロックで Interrupt Group(割り込みグループ)としてCanを選択すると、次のCan関連のコールバックの一覧が表示されます。
このアプリケーションには、受信するCANメッセージを読み取る機能が必要なため、CanIf_RxIndicationがその目的で使用されます。CanIf_RxIndicationは、割り込みベースの実行のあるコールバックで、CANフレームが受信されるたびに呼び出されます。
CANメッセージ内から実際の値を取得する前に、もう一度 CAN Packブロックと Unpackブロックを使用してデータを抽出し、DBCファイルに従って複合する必要があります。
値が得られたので、ADCの値を使用して赤色LEDの明るさを比例的に調整し、DIOの値を使用して青色LEDのオン/オフを切り替えます。
モデルを検証するには、FreeMASTERツールを使用して値を読み取り、グラフ化することができます。ご覧のとおり、受信したメッセージは、Adc値とDio値を表す5バイトのデータで構成されています。
以下では、FreeMASTERソフトウェアでリアルタイムに作成されたグラフ上の変数の表現を確認できます。赤色の信号は、0Vから3.3Vの間にあるポテンショメータから読み取られた値を表します。青色の信号はボタンの状態に対応します。ボタンが押されている場合、青色の信号は1になります。それ以外の場合、信号は0になります。
ウィンドウの下部には、スクリーン・キャプチャが行われた時点の信号の値が表示されます。グラフの赤色と青色の信号に対応するADC_Received変数とDio_Received変数とは別に、他の変数は最後に受信したCANメッセージの詳細を示します。
CANメッセージを読み取ることができるデバイスを接続すると、CANバスを介してメッセージが送信されるのを確認することもできます。ここでは、PCAN-Vieソフトウェア・アプリケーションを使用して、PCAN-USB Pro FDによってキャプチャされたメッセージを表示します。
チュートリアルのステップを実行した後、MR-CANHUBK344ボードとサード・パーティの間、または同じボードの異なるCANインスタンス間で、CAN通信を必要とするアプリケーションにMR-CANHUBK344ボードを組み込むことができるようになります。
この記事の適用は、単一のモデルに複数のMBDTコンポーネントを追加するワークフローを管理する方法の例としても役立ちます。
Simulinkは登録商標であり、Vehicle Network ToolboxはThe MathWorks, Inc.の商標です。追加の商標のリストについては、mathworks.com/trademarksを参照してください。