注意 : この日本語版文書は参考資料としてご利用ください 最新情報は必ずオリジナルの英語版をご参照願います AN237 8 ビット PIC マイクロコントローラで EUSART を使って LIN スレーブモードを実装する方法 Author: はじめに Dinesh Baria Microchip Technology Inc. 本書では EUSART (Enhanced Universal Synchronous Asynchronous Receiver Transmitter) モジュールを内蔵した8ビットPIC マイクロコントローラ向けの LIN 2.0 スレーブドライバについて説明します EUSART は LIN アプリケーションをサポートするための機能 (baud レート自動検出 / 校正 ブレーク受信時の復帰 13 ビットのブレーク文字送信等 ) が追加された拡張型の UART です 本書では MPLAB Code Configurator (MCC) を使って LIN ドライバを開発する方法も紹介します LIN システムの設計者がアプリケーションを LIN 上で動作させる事が素早くできるよう 本書は主に MMC のセットアップ方法とMCCが生成するドライバの使い方の説明に重点を置いています 本書では PIC16F1783 を使いますが EUSART モジュールを内蔵した 8 ビット PIC マイクロコントローラであればどれでも使えます 本書の内容は 読者が LIN 仕様 v2.0 を熟知している事を前提としています 従って LIN 全般について詳細に解説しません 補足情報については 本書の 参考資料 を参照してください LIN プロトコル LIN (Local Interconnect Network) は 車載および電化製品を含む様々なネットワークに低コストのバス通信を提供します LIN プロトコルは データ通信に関するシステム開発ガイドラインを提供します LIN の主な特長は以下の通りです 低コストの単線式 単一マスタと複数スレーブ ( 最大 16 個 ) スレーブは 2K ~ 20K の任意の baud レートに同期可能 マスタの速度に対するスレーブの自己同期 シリアル UART に類似するデータ書式 データチェックサムおよびビットエラー検出による動作信頼性 LIN 2.0 と LIN 1.x の互換性 LIN 2.0 は LIN 1.x の上位規格です LIN 2.0 仕様のノードと LIN 1.x 仕様のノードは いくつかの例外を除き 互いに通信できます LIN 2.0 マスタノードは LIN 1.1 x ノードに対して以下の新しい LIN 2.0 機能を要求する事はできません 拡張チェックサム 再構成と診断 baud レートの自動検出 応答エラーステータスの監視 LIN 2.0 スレーブノードは 再構成しない限り LIN 1.x マスタと通信できません アプリケーション最初に持ち上がる疑問は このアプリケーションにこのドライバは使えるのだろうか という事です 以下の各項目には この疑問の答えを見付け それがアプリケーションに適したドライバ実装 ( またはデバイス ) かどうかを素早く判断するために役立つ情報を記載しています これを判断するには 利用可能な処理時間 リソース使用量 ビットレート性能が極めて重要な要因となります 処理時間処理時間は主にビットレート クロック周波数 コード実行によって決まります これが LIN 通信向けに EUSART モジュールを推奨する理由です このハードウェアリソースは より多くの処理をハードウェアで負担する事により ファームウェアの処理負荷を軽減します 従って 平均ファームウェア処理時間は比較的低く抑えられます 表 1 に FOSC = 16 MHz の場合の平均ファームウェア処理時間の概略値を示します 表 1: ファームウェア処理時間 ビットレート (bps) ファームウェア処理時間 (%) 2000 2.7 2400 3.2 9600 13 10417 14 20000 27 LIN バスがアイドル状態である場合 ドライバが要する処理時間は約 1% (@ 16 MHz) に減少します 2015 Microchip Technology Inc. DS00000237B_JP - p. 1
リソース使用量 PIC16F1783 ( または他の EUSART モジュール内蔵デバイス ) に要求されるリソースは以下の通りです EUSART モジュール - 通信用 Timer1モジュール - バスとフレームのタイミング用 プログラムメモリ - 885 ワード ( ファームウェアLIN ドライバ用 ) データメモリ - 22 バイト ビットレート本ドライバは LIN 仕様が定義する最大ビットレート (20000 bps) を達成するよう設計されています ブレークと同期フィールドを正しく検出できるよう 内部クロックは高精度かつ同期している事が必要です マスタがクロック周波数を定義します 全てのスレーブは ヘッダ内の同期フィールド中に内部クロックを同期させます LIN 仕様によると 完全な LIN フレーム ( ヘッダと応答を含む ) に対して許容されるクロック偏差は ±2% 未満です まとめ LIN スレーブドライバは負荷の高い処理の大部分を EUSART モジュールに負担させるため 処理時間を心配する必要はほとんどありません EUSART モジュール以外に必要なリソースは Timer1 だけです このタイマはビットレート周期で割り込みます 従って ドライバはアプリケーションに大きな支障を来す事なく バックグラウンドで事実上透過的に動作できます 本ドライバはリソース ( 処理時間を含む ) をほとんど消費しないため リソースへの要求が高いアプリケーションに適しています ドライバのセットアップアプリケーションのビルドを始める前にファームウェアをセットアップします EUSART と Timer1 向けのモジュールドライバは MLPAB Code Configurator を使ってを設定および生成できます LIN ドライバファイル ( 本書の 補遺 A 参照 ) をプロジェクトにインクルードする必要があります ドライバをセットアップする前に MPLAB X IDE XC8 コンパイラ MPLAB Code Configurator (MCC) プラグインをインストールしておく必要があります プロジェクトのセットアップに必要な基本手順は以下の通りです 1. MPLAB X IDE 内で新規にプロジェクトを作成するか 既存のプロジェクトを開きます 2. MCC プラグインツールを起動します (MPLAB X IDE のメニューバーで [Tools] > [Embedded] を選択し [MPLAB Code Configurator] をクリック ) 3. Project Resources エリアで [System] モジュールをクリックすると Composer エリアにコンフィグレーションビット設定 GUI が表示されます ここでデバイスコンフィグレーションビットを設定します EC/HS/XT オシレータを使う場合 システム周波数も入力します 図 1 内の太線で囲んだ項目に注目してください 4. Device Resources エリアから Timer1 と EUSART 非同期 (NRZ) モジュールを選択します これらのモジュールをダブルクリックすると Project Resources エリアにモジュールが表示されます アプリケーションで使う他のモジュールも Project Resources エリアに移動できます 5. Project Resources エリアで EUSART 非同期 (NRZ) モジュールを選択し 図 2 に示すように設定します 一部のマイクロコントローラ (PIC16F1708 等 ) はペリフェラルピンセレクト (PPS) 機能を備えています この機能を使うと マイクロコントローラが内蔵する周辺モジュールの多くを任意のピンに割り当てる事ができます GPIO ピンを EUSART TX および RX ピンとして設定するには Pin Manager ウィンドウでそれらの GPIO ピンをロックする必要があります 6. Project Resources エリアで Timer1 モジュールを選択し 図 3 に示すように設定します タイマ周期値は LIN 通信に要求されるビットレート値と同じです 下式により EUSART の baud レートに基づく Timer1 のビット時間が求まります T = 0xFFFF (BRG+1) /PR T は TMR1 レジスタが格納する 16 ビット値です BRG は baud レートタイマ (SPBRGH:SPBRGL) の 16 ビット値です PR は Timer1 のプリスケーラ値です DS00000237B_JP - p. 2 2015 Microchip Technology Inc.
図 1: システムモジュール GUI 図 2: EUSART 非同期 (NRZ) 設定 GUI 2015 Microchip Technology Inc. DS00000237B_JP - p. 3
図 3: Timer1 設定 GUI 7. Project Resources エリアに移動した他のモジュールも設定します 8. Project Resources エリアで Interrupt Manager モジュールを選択し アプリケーション要件に応じて割り込み優先度を変更します ( 図 4 参照 ) 9. 全てのモジュールの設定を終えたら Composer エリアの最上部にある [Generate Code] ボタンをクリックしてドライバとイニシャライザを生成します 生成したドライバは 作業中の MPLAB X IDE プロジェクトに取り込まれます ( 図 5 参照 ) 10. LIN ドライバファイル (lin.c lin.h lin_app.c app.h) をプロジェクトに追加します これらのファイルはサンプルプロジェクト内にあります 図 4: 割り込みマネージャ GUI DS00000237B_JP - p. 4 2015 Microchip Technology Inc.
図 5: [PROJECTS] ウィンドウ 11. mcc.h および mcc.c ファイルは コンフィグレーションビットと oscillator_initializer の定義を含みます また system_initializer 関数も含みます この関数は 他のイニシャライザ (EUSART イニシャライザ Timer1 イニシャライザ等 ) を内部で呼び出すアプリケーションプログラム内で呼び出す必要があります 12. pin_manager.h および pin_manager.c ファイルは ピンマネージャ GUI での設定に基づくピンマネージャイニシャライザ関数を含みます 13. interrupt_manager.h および interrupt_manager.c ファイルは割り込みイニシャライザと割り込みサービスルーチンを含みます 14. tmr1.h および tmr1.c ファイルは Timer1 設定関数を含みます 15. eusart.h および eusart.c ファイルは EUSART 設定関数を含みます 16. lin.h および lin.c ファイルは LIN 設定関数を含みます lin.h ファイルは lin.c 内で定義されている関数の新しい型とプロトタイプの定義を含みます 17. lin_app.h および lin_app.c ファイルはアプリケーションインターフェイスであり ユーザが書く必要があります 適切な ID に応答するよう これらのファイルを編集します これにはテーブルまたは単純な比較ロジックが使えます これらにより ユーザはアプリケーションに応じた LIN 通信を定義できます 2015 Microchip Technology Inc. DS00000237B_JP - p. 5
18. アプリケーションに関連する任意のファイルを追加します 本書の例では 特定の ID に対応するアプリケーション関連関数のために lin_xxxevent.c を使います 19. main.c ファイルはプログラム内のエントリポイントを格納します このファイルはアプリケーション要件に応じて編集します 割り込みを正しく設定し ドライバを初期化する必要があります また 全ての外部シンボルを含める必要があります LIN ドライバと一緒にビルドする完全なアプリケーションコードについては 補遺 A を参照してください プロジェクト最初に MPLAB X IDE 内でプロジェクトをセットアップします 図 5 に プロジェクトセットアップの例を示します LIN ドライバの動作には以下のファイルが必要です lin.c - ドライバファイル lin.h - ドライバを設定するためのヘッダファイル lin_app.h - ノードを設定するためのヘッダファイル lin_app.c - LIN イベント処理ファイルその他のアプリケーションに固有のファイルは ユーザが定義します 例えば図 5 の場合 これらのプロジェクトファイルは lin_xxxevent.c (xxx は LIN ID イベント名 ) として表示されています この例では プロジェクトの構成を分かりやすくするために ID 処理を別々のオブジェクトに割り当てるというプログラミングスタイルを採用しています メインオブジェクト main.c モジュールはプログラムへのエントリポイントを格納し そこではドライバ ハードウェア 変数を初期化する必要があります LIN ドライバを初期化するために LIN_Initializer 関数を呼び出します main 関数内でドライバ関数 (LIN_Driver) を呼び出す必要があります ( 例 1 参照 ) この関数内で 受信バッファを読み出してデータを処理します eusart.c 内の EUSART_Receive_ISR () 関数を例 2 に示すように変更する事で baud レート自動検出機能を有効にします 例 2: EUSART RX ISR void EUSART_Receive_ISR(void) //overrun check code // LIN Implementation } if(!eusart_hasbreakdetected()) while(!eusart_hasbreakdetected()); BAUD1CONbits.ABDEN = 1; } //read buffer code eusart.h に以下のマクロを追加する事で 自動復帰機能を有効にし ステータスレジスタを読み出します #define EUSART_Status( ) (RC1STA) #define EUSART_EnableAutoWakeUp( ) (BAUD1CONbits.WUE = 1) #define EUSART_HasBreakDetected( ) (!(BAUD1CON & 0x02)) また tmr1.c ファイル内の TMR1_ISR () 関数は計時関数を格納します サンプルファームウェアはバスタイムアウト用に Timer1 を使いますが 他のタイマを選択する事もできます 例 3 に 割り込み内の配置を示します 例 3: TMR1 ISR Void TMR1_ISR(void) //Clear the TMR1 interrupt flag PIR1bits.TMR1IF = 0; TMR1 += timer1reloadval; 例 1: main エントリポイント void main(void) //System Initialization } //Add your TMR1 interrupt custom code LIN_UpdateTimer( ); } //LIN Driver Initialization LIN_Initializer( ); while(1) //Check Data Received if(eusart_dataready) LIN_Driver( ); } //Add application code here } DS00000237B_JP - p. 6 2015 Microchip Technology Inc.
定義 システムをセットアップするために複数のコンパイル時定義を使います これらは全て lin.h 内にあります 表 2 に これらの定義を示します 表 2: コンパイル時定義 定義名 値 概要 MAX_IDLE_TIME 25000 最大バスアイドル時間です LIN 仕様は この値を 25000 と定義しています MAX_HEADER_TIME 39 最大許容ヘッダ時間です LIN 仕様は これを 49 と定義しています しかし最初のバイト ( ブレーク ) が終了するまでタイミングは始まらないため 実際の値は 39 です ( 定義よりも 10 少ない ) MAX_TIME_OUT 128 復帰要求が出された後の最大許容待機時間です LIN イベント LIN イベント関数では ID に基づいて次の動作 ( 何を送信するか デバイスは何を受信する必要があるか 何バイトを送受信するか ) を決定します ユーザは 各 LIN ID を処理するために イベント関数を編集または変更する必要があります 1 つの方法は ID テーブルを作成する事です この方法は アプリケーションが複数の ID に応答する必要がある場合に便利です あるいは 単純な比較ロジックを使う方法もあります サンプルコード ( 補遺 A 参照 ) は比較ロジックに基づきます ID モジュールサンプルファームウェアでは 各 ID とそれらに対応する関数を処理するために別々のIDファイルを使います 忘れてはならない最も重要な事は 使用する全ての外部シンボルを含める必要があるという事です ドライバが使うシンボルは lin_app.h 内にあり このヘッダファイルは全てのアプリケーションモジュールにインクルードする必要があります lin_app.c は ID イベントの処理に向けてドライバをセットアップするために使います この関数を追加する事で 追加のIDイベントの処理が可能になります ドライバの使用 LIN ドライバに必要なファイルと一緒にプロジェクトをセットアップした後に ドライバが使えるようになります 以下ではドライバの使い方について説明します 重要な内容は以下の通りです 通信フラグの処理 エラーフラグの処理 ドライバ内の状態フラグ LIN ID イベント バス復帰本書のソースコード ( 補遺 A 参照 ) は アプリケーションでの LIN ドライバの使い方を示す簡潔な例を提供します 通信フラグドライバがデータの送受信に成功した事を示すフラグは 2 種類あります エラーの発生なくデータの送受信が完了すると 完了フラグがセットされます このフラグは 処理後にユーザがクリアする必要があります もう 1 つのフラグは保留フラグです これは送受信が進行中である事を示します このフラグも処理後にユーザがクリアする必要があります エラーフラグ期待していた条件が満たされない場合 特定のエラーフラグがセットされます 例えば スレーブで受信 PID と計算 PID したが一致しない場合 ドライバ内でパリティエラーフラグがセットされます エラーは 処理されてクリアされるまで致命的であると見なされます エラーをクリアしない限り ドライバは受信データを無視し続けます 例 4 に main プログラムループ内でのエラー処理の方法を示します この例はバスタイムアウトエラーへの対応だけを示していますが 他のエラーにも同様の方法が適用できます 例 4: エラー対応 void main(void) //System Initialization //LIN Driver Initialization LIN_Initializer( ); while(1) //Check Data Received if(eusart_dataready) LIN_Driver( ); } //Check Bus Timeout error if(l_errflgs_b.bits.le_timeout==1) LIN_GotoSleep(); 2015 Microchip Technology Inc. DS00000237B_JP - p. 7
ドライバのステート LIN ドライバは 受信バイトと受信バイトの間で 各種のステートに基づいて現在の状態を認識します 1 バイトを受信した後に ドライバはこれらのステートに基づいて次の未実行ステートを決定し そのステートへ移行します 図 6: 単純化した LIN トランシーバ ID イベントとイベント関数各 ID に対して 1 つのイベント関数が存在します イベント関数は ID の後のデータにどのように応答すべきかをドライバに知らせるために必要です 例えば ドライバはデータを受信または送信するために準備する必要があります また 送受信するデータの量を知る事も必要です 正常な動作を得るには 以下の 3 つの変数を初期化する必要があります データメモリを指すポインタ フレーム時間 データ長 バスの復帰 バスを復帰させる必要があるアプリケーションでは LIN バス復帰関数 (LIN_SendWakeupSignal) を使います この関数を呼び出すと 復帰要求文字が送信されます 実装サンプルファームウェアは LIN インターフェイスの動作を制御するために以下の 4 つの関数を使います LIN Transmit/Receive Driver LIN Timekeeper LIN Initialization LIN Wake-up ドライバ EUSART モジュールは LIN 通信の鍵となるエレメントです EUSART モジュールを LIN バスのシリアルエンジンとして使う事で いくつかの利点が得られます 注目すべき利点は シリアル制御をソフトウェアではなくハードウェアで実行するという事です 従って データの送受信中に他の処理を実行できます このために スレーブノード LIN プロトコルドライバは バックグラウンドで ( 基本的にデーモンとして ) 動作するよう設計されています 本ドライバは EUSART 受信割り込みによる割り込み駆動型です LIN バスの物理的なフィードバック形態 ( 図 6) により EUSART 受信割り込みは送信動作でも受信動作でも関係なく発生します 加えて 送受信動作中のエラーを示すために エラーフラグが維持されます DS00000237B_JP - p. 8 2015 Microchip Technology Inc.
ステートとステートフラグ LIN ドライバは ステートフラグを使って LIN トランシーバの状態を示します 割り込みが発生すると ドライバはこれらのフラグに基づいて次の未実行ステー トを決定し そのステートへ移行します 図 7 と図 8 に 各種のステートを経由するプログラムフローを示します 表 4 に 各ステートの定義を示します 図 7: レシーバヘッダプログラムフロー 2015 Microchip Technology Inc. DS00000237B_JP - p. 9
図 8: メッセージ送受信プログラムフロー DS00000237B_JP - p. 10 2015 Microchip Technology Inc.
タイムアウトの実装ユーザはタイムアウト機能を有効にするかどうかを選択できます この機能は ユーザが選択した baud レートに基づきます この機能を有効にした場合 最大許容応答時間 ( 計算値 ) に対するタイムアウトを監視するために Timer1 を使います LIN 仕様 2.0 は フレームスロット時間の割り当て要件を以下のように定義しています フレームの送信に関する公称値はレスポンススペース インターバイトスペース インターフレームスペースを除いた送信ビット数に一致する THeader_Nominal = 34 * TBit TResponse_Nominal = 10*(NData+1)*TBit TFrame_Nominal = THeader_Nominal + TResponse_Nominal レスポンススペース インターバイトスペース等の最大許容時間は公称値の 140% とする THeader_Maximum = 1.4 * THeader_Nominal TResponse_Maximum = 1.4* TResponse_Nominal TFrame_Maximum = THeader_Maximum + TResponse_Maximum - TBit: 1 ビットの送信に要する時間 - NData: フレーム内のデータバイトの数 タイムアウトを適用した場合 タイミングは同期ブレークの最初の 10 TBit を受信した後に最大ヘッダ時間を計算します 受信バッファ内の値が 0x00 である事とフレームエラーフラグビットをチェックする事によって同期ブレークを確認した後に Timer1 が有効になり 値 (THeader_Maximum - 10*TBit) が書き込まれます ヘッダタイムアウトのカウントは ID を受信するかタイムアウトイベントが発生した後に終了します ID は 応答の長さに関する情報を提供します 従って応答タイムアウト値は 最初にバイトの総数 ( データバイト + チェックサムの 1 バイト ) を TBit に乗算し 次にヘッダタイムアウトから使われなかった残りの時間を加算する事により 求まります 図 9 に 計時関数のフローを示します 図 9: 計時プログラムフロー 2015 Microchip Technology Inc. DS00000237B_JP - p. 11
LIN スレーブドライバファイルの説明 lin.h lin.h ファイルは lin.c 内で定義されている関数の新しい型とプロトタイプの定義を含みます 表 3: 変数 変数名 バイト数 概要 readback_b 1 送信したデータを保持し このデータと受信したデータを比較する事によってビットエラーを検出します chksum_w 2 ドライバは この変数を使って送信と受信のチェックサムを計算します datalength_b 1 ドライバは この変数を使ってメッセージデータの数を維持します handle_b 1 受信した ID バイトを保持するレジスタです bufferptr_b 1 ドライバが使う記憶領域を指すポインタです ID に応じて データをメモリに書き込むか メモリから読み出します l_state_b 1 LIN バスのステートを示します l_errflgs_b 1 LIN バスのエラー情報を格納します l_comflgs_b 1 実行中のバスアクティビティを示します 表 4: LIN ステート Enum. 値 ステート名 概要 0 LIN_ST_SYNCHBREAK スレーブはブレークフィールドを受信する準備ができています 1 LIN_ST_SYNCHBYTE スレーブは同期バイトを受信します 2 LIN_ST_IDENTIFIER スレーブは PID を受信します 3 LIN_ST_XMIT スレーブはマスタ要求に応答します 4 LIN_ST_RECEIVE スレーブはマスタからデータを受信します 5 LIN_ST_SLEEP スレーブは復帰信号を受信する準備ができています DS00000237B_JP - p. 12 2015 Microchip Technology Inc.
レジスタ 1: エラーフラグ R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 R/W-0/0 LE_TIMEOUT LE_NORESPONSE LE_INCOMPLETE LE_BITERR LE_CHKSUMERR LE_PARITYERR LE_SYNCERR LE_BRKERR bit 7 bit 0 補遺 : R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット 0 として読み出し -n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知 bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 LE_TIMEOUT: タイムアウトエラービット 1 = バスアクティビティタイムアウトエラーが発生した 0 = バスアクティビティタイムアウトエラーは発生していない LE_NORESPONSE: 応答なしエラービット 1 = 受信モード中にマスタからの応答がなかった 0 = 受信モード中にマスタからの応答があった LE_INCOMPLETE: 未完了エラービット 1 = 不完全なフレーム送受信が発生した 0 = 不完全なフレーム送受信は発生していない LE_BITTERR: ビットエラービット 1 = 通信中にビットエラーが発生した 0 = 通信中にビットエラーは発生していない LE_CHKSUMERR: チェックサムエラービット 1 = 受信モード中にチェックサムエラーが発生した 0 = 受信モード中にチェックサムエラーは発生していない LE_PARITYERR: パリティエラービット 1 = 受信した PID でパリティエラーが発生した 0 = 受信した PID でパリティエラーは発生していない LE_SYNCERR: 同期エラービット 1 = 同期フィールドが検出されなかった 0 = 同期フィールドは検出された LE_BRKERR: ブレークエラービット 1 = ブレークフィールドが検出されなかった 0 = ブレークフィールドは検出された 2015 Microchip Technology Inc. DS00000237B_JP - p. 13
レジスタ 2: ステータスフラグ R-W/0-0 LastFrame_PID<7:0> bit 15 bit 8 U-0 U-0 U-0 U-0 U-0 R-W/0-0 R-W/0-0 R-W/0-0 R-W/0-0 Goto_sleep Overrun Successful_transfer Error_In_Response bit 7 bit 0 補遺 : R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット 0 として読み出し -n = POR 時の値 1 = ビットはセット 0 = ビットはクリア x = ビットは未知 bit 15-8 bit 7-4 bit 3 bit 2 bit 1 bit 0 LastFrame_PID<7:0>: 直近フレーム PID 直近フレーム PID とは バス上で直近に検出されてノード内で処理された PID の事です オーバーランが発生すると 直近フレーム PID の 1 つまたは複数の値が失われます ( 直近の値だけが維持されます ) 予約済み Goto_Sleep: スリープ移行フラグビット 1 = 前回のステータス読み出し関数への呼び出し以降に GOTO Sleep 命令を受信した 0 = GOTO Sleep 命令は受信していない Overrun: オーバーランフラグビット 1 = 前回のステータス読み出し関数への呼び出し以降に 2 個以上のフレームが処理された 0 = オーバーランは発生していない Successful_transfer: 転送成功フラグビット 1 = 前回のステータス読み出し関数への呼び出し以降に 1 つまたは複数のフレーム応答がエラーなく処理された 0 = フレーム転送は完了していない Err_In_Response: 応答中エラーフラグビット 1 = 前回のステータス読み出し関数への呼び出し以降に ノードが処理した 1 つまたは複数のフレームのフレーム応答セクションでエラーが発生した ( 例 : チェックサムエラー フレーミングエラー等 ) 0 = フレーム応答エラーは発生していない DS00000237B_JP - p. 14 2015 Microchip Technology Inc.
レジスタ 3: 通信フラグ U-0 U-0 U-0 U-0 U-0 U-0 R/W-0/0 R/W-0/0 LF_COMPLETE LF_PENDING bit 7 bit 0 補遺 : R = 読み出し可能ビット W = 書き込み可能ビット U = 未実装ビット 0 として読み出し -n = POR 時の値 1 = ビットはセット 0 = ビットはクリア bit 7-2 bit 1 bit 0 予約済み LF_COMPLETE: 通信完了フラグビット 1 = 送信または受信が完了した 0 = 送信または受信は完了していない LF_PENDING: 通信実行中フラグビット 1 = 送信または受信が実行中 0 = 送信または受信はまだ開始されていない lin.c lin.c ファイルは LIN スレーブの動作に必要な全ての関数を含みます 以下では 各 API 関数と その使い方について説明します LIN_Initializer -C プロトタイプ : void LIN_Initializer (void); 概要 : LIN スレーブに必要な全てのパラメータを初期化します システム初期化後に main 関数内でこの関数を呼び出す事で LIN 動作を開始します - パラメータ : なし - 戻り値 : なし LIN_Driver -C プロトタイプ : void LIN_Driver (void); - 概要 : この関数は受信した LIN 信号に従ってステートを変更します - パラメータ : なし - 戻り値 : なし LIN_ReadStatus -C プロトタイプ : lin_status LIN_ReadStatus(void); - 概要 : この関数は 呼び出されると 16 ビットのステータスワードを返します - パラメータ : なし - 戻り値 :16 ビットステータスワード LIN_SendWakeupSignal -C プロトタイプ : void LIN_SendWakeupSignal (void); - 概要 : バス上で復帰命令を生成します この関数は 復帰呼び出しをシミュレートする復帰文字を LIN バス上に送信します - パラメータ : なし - 戻り値 : なし LIN_GotoSleep - C プロトタイプ : void LIN_GotoSleep (void); - 概要 : Goto_sleep フラグビットをセットし タイマを無効にしてスリープモードへ移行します マスタは GOTO SLEEP 命令を送信する際にこの関数を使います - パラメータ : なし - 戻り値 : なし 2015 Microchip Technology Inc. DS00000237B_JP - p. 15
LIN_AssignFrameID - C プロトタイプ : uint8_t LIN_AssignFrameID (uint8_t *l_nad) - 概要 : この関数は スレーブモード中にフレームの PID に NAD (Node Diagnostic Address) と 指定されたサプライヤ ID を割り当てます 変更されたフレームは指定されたメッセージIDを持つ必要があり 呼び出し後に保護された ID として PID を持ちます - パラメータ : なし - 戻り値 : 8 ビット値 LIN_AssignNAD - C プロトタイプ : uint8_t LIN_AssignNAD (uint8_t *l_nad) - 概要 : この関数は NAD サプライヤ ID コード ファンクションIDコードが一致する全てのスレーブノードの NAD を割り当てます それらのノードの新しい NAD は新しい NAD です - パラメータ : なし - 戻り値 :8 ビット値 LIN_ReadByID - C プロトタイプ : uint8_t LIN_ReadByID (uint8_t *l_nad) - 概要 : この関数は NAD で選択されたノードに対して ID パラメータに関連付けられたプロパティを返すよう要求します 表 5 を参照してください 表 5: ID の値 ID 意味 0 LIN 製品 ID 1 シリアル番号 2 15 予約済み 16 31 メッセージ ID 1 ~ 16 32 63 ユーザ定義 64 255 予約済み - パラメータ : なし - 戻り値 : 8 ビット値 lin_app.h このファイルは ノード設定を表す LIN 記述ファイル (LDF) の抜粋です このファイルは以下により構成されます フレーム定義 フレーム共用体定義 データ交換用に予約されたバッファのサイズ フレーム定義 #define <Frame_Name>_Index value インデックス値を定義します 値はユーザ定義の連続した整数です #define <Frame_Name>_ID value フレーム ID を定義します 値のレンジは 0 ~ 63(0x3F) です #define <Frame_Name>_PID value PID を定義します LIN Specification Package Revision 2.0 [1] 内の Appendix 7.2 を参照してください #define <Frame_Name>_Len value チェックサムを含まない応答フレームの長さを定義します #define <Frame_Name>_MsgID value スレーブノードの各イベントのメッセージIDを定義します lin_app.h このファイルはアプリケーションインターフェイスであり ユーザが書く必要があります これにより ユーザはアプリケーションの LIN 通信を定義できます lin_app.c ファイルは以下により構成されます ID_Table 変数ユーザは この変数に書き込む事で アプリケーションが処理する必要のある LIN フレームの ID を定義します DS00000237B_JP - p. 16 2015 Microchip Technology Inc.
このリストの各メンバーは 1 つの LIN フレームとその ID に対応します 各メンバーの型は t_id_list です 各メンバーは以下の方法で定義する必要があります 例 5: ID リスト typedef struct uint8_t *bufferptr; uint8_t len; uint8_t *idptr; t_msg_direction direction; uint16_t MsgID; }t_id_list; 補遺 A: ソースコード 文書のサイズを考慮し 本書には完全なソースコードを記載していません ソースコードの完全なバージョンと全てのサポートファイルを収めた Zip ファイルは 以下の Microchip 社ウェブサイトからダウンロードできます : www.microchip.com. bufferptr: フレームに割り当てられたメモリのアドレス len: 対応するフレームのデータバイトの数 (0 ~ 8) idptr: フレーム ID を格納する変数のアドレス direction: データフローの方向 - 型は t_message_direction です マスタが要求しているデータに対しては ID_REQUEST に設定し スレーブが送信するデータに対しては ID_RESPONSE に設定する必要があります MsgID: 各フレームのメッセージ ID 参考資料 1. LIN Specification Package Revision 2.0 LIN Consortium http://www.lin-subbus.org 2. MPLAB Code Configurator ユーザガイド (DS40001725) http://www.microchip.com/ pagehandler/en_us/devtools/code_configurator/ home.html 3. MPLAB XC8 C Compiler User s Guide (DS50002053) Microchip Technology, Inc. 2015 Microchip Technology Inc. DS00000237B_JP - p. 17
NOTE: DS00000237B_JP - p. 18 2015 Microchip Technology Inc.
Microchip 社製デバイスのコード保護機能に関して次の点にご注意ください Microchip 社製品は 該当する Microchip 社データシートに記載の仕様を満たしています Microchip 社では 通常の条件ならびに仕様に従って使用した場合 Microchip 社製品のセキュリティレベルは 現在市場に流通している同種製品の中でも最も高度であると考えています しかし コード保護機能を解除するための不正かつ違法な方法が存在する事もまた事実です 弊社の理解ではこうした手法は Microchip 社データシートにある動作仕様書以外の方法で Microchip 社製品を使用する事になります このような行為は知的所有権の侵害に該当する可能性が非常に高いと言えます Microchip 社は コードの保全性に懸念を抱くお客様と連携し 対応策に取り組んでいきます Microchip 社を含む全ての半導体メーカーで 自社のコードのセキュリティを完全に保証できる企業はありません コード保護機能とは Microchip 社が製品を 解読不能 として保証するものではありません コード保護機能は常に進歩しています Microchip 社では 常に製品のコード保護機能の改善に取り組んでいます Microchip 社のコード保護機能の侵害は デジタルミレニアム著作権法に違反します そのような行為によってソフトウェアまたはその他の著 本書に記載されているデバイスアプリケーション等に関する情報は ユーザの便宜のためにのみ提供されているものであり 更新によって無効とされる事があります お客様のアプリケーションが仕様を満たす事を保証する責任は お客様にあります Microchip 社は 明示的 暗黙的 書面 口頭 法定のいずれであるかを問わず 本書に記載されている情報に関して 状態 品質 性能 商品性 特定目的への適合性をはじめとする いかなる類の表明も保証も行いません Microchip 社は 本書の情報およびその使用に起因する一切の責任を否認します Microchip 社の明示的な書面による承認なしに 生命維持装置あるいは生命安全用途に Microchip 社の製品を使用する事は全て購入者のリスクとし また購入者はこれによって発生したあらゆる損害 クレーム 訴訟 費用に関して Microchip 社は擁護され 免責され 損害をうけない事に同意するものとします 暗黙的あるいは明示的を問わず Microchip 社が知的財産権を保有しているライセンスは一切譲渡されません 商標 Microchip 社の名称と Microchip ロゴ dspic FlashFlex KEELOQ KEELOQ ロゴ MPLAB PIC PICmicro PICSTART PIC 32 ロゴ rfpic SST SST ロゴ SuperFlash UNI/O は 米国およびその他の国における Microchip Technology Incorporated の登録商標です FilterLab Hampshire HI-TECH C Linear Active Thermistor MTP SEEVAL Embedded Control Solutions Company は 米国における Microchip Technology Incorporated の登録商標です Silicon Storage Technology は その他の国における Microchip Technology Incorporated の登録商標です Analog-for-the-Digital Age Application Maestro BodyCom chipkit chipkit ロゴ CodeGuard dspicdem dspicdem.net dspicworks dsspeak ECAN ECONOMONITOR FanSense HI-TIDE In-Circuit Serial Programming ICSP Mindi MiWi MPASM MPF MPLAB 認証ロゴ MPLIB MPLINK mtouch Omniscient Code Generation PICC PICC-18 PICDEM PICDEM.net PICkit PICtail REAL ICE rflab Select Mode SQI Serial Quad I/O Total Endurance TSHARC UniWinDriver WiperLock ZENA Z-Scale は 米国およびその他の国における Microchip Technology Incorporated の登録商標です SQTP は 米国における Microchip Technology Incorporated のサービスマークです GestICとULPPは その他の国におけるMicrochip Technology Germany II GmbH & Co. & KG (Microchip Technology Incorporated の子会社 ) の登録商標です その他 本書に記載されている商標は各社に帰属します 2013, Microchip Technology Incorporated, Printed in the U.S.A., All Rights Reserved. ISBN: 978-1-63277-279-4 QUALITY MANAGEMENT SYSTEM CERTIFIED BY DNV == ISO/TS 16949 == Microchip 社では Chandler および Tempe ( アリゾナ州 ) Gresham ( オレゴン州 ) の本部 設計部およびウェハー製造工場そしてカリフォルニア州とインドのデザインセンターが ISO/TS-16949:2009 認証を取得しています Microchip 社の品質システムプロセスおよび手順は PIC MCU および dspic DSC KEELOQ コードホッピングデバイス シリアル EEPROM マイクロペリフェラル 不揮発性メモリ アナログ製品に採用されています さらに 開発システムの設計と製造に関する Microchip 社の品質システムは ISO 9001:2000 認証を取得しています 2015 Microchip Technology Inc. DS00000237B_JP - p. 19
各国の営業所とサービス 北米本社 2355 West Chandler Blvd. Chandler, AZ 85224-6199 Tel:480-792-7200 Fax:480-792-7277 技術サポート : http://www.microchip.com/ support URL: www.microchip.com アトランタ Duluth, GA Tel:678-957-9614 Fax:678-957-1455 オースティン (TX) Tel:512-257-3370 ボストン Westborough, MA Tel:774-760-0087 Fax:774-760-0088 シカゴ Itasca, IL Tel:630-285-0071 Fax:630-285-0075 クリーブランド Independence, OH Tel:216-447-0464 Fax:216-447-0643 ダラス Addison, TX Tel:972-818-7423 Fax:972-818-2924 デトロイト Novi, MI Tel:248-848-4000 ヒューストン (TX) Tel:281-894-5983 インディアナポリス Noblesville, IN Tel:317-773-8323 Fax:317-773-5453 ロサンゼルス Mission Viejo, CA Tel:949-462-9523 Fax:949-462-9608 ニューヨーク (NY) Tel:631-435-6000 サンノゼ (CA) Tel:408-735-9110 カナダ - トロント Tel:905-673-0699 Fax:905-673-6509 アジア / 太平洋アジア太平洋支社 Suites 3707-14, 37th Floor Tower 6, The Gateway Harbour City, Kowloon Hong Kong Tel:852-2943-5100 Fax:852-2401-3431 オーストラリア - シドニー Tel:61-2-9868-6733 Fax:61-2-9868-6755 中国 - 北京 Tel:86-10-8569-7000 Fax:86-10-8528-2104 中国 - 成都 Tel:86-28-8665-5511 Fax:86-28-8665-7889 中国 - 重慶 Tel:86-23-8980-9588 Fax:86-23-8980-9500 中国 - 東莞 Tel:86-769-8702-9880 中国 - 杭州 Tel:86-571-8792-8115 Fax:86-571-8792-8116 中国 - 香港 SAR Tel:852-2943-5100 Fax:852-2401-3431 中国 - 南京 Tel:86-25-8473-2460 Fax:86-25-8473-2470 中国 - 青島 Tel:86-532-8502-7355 Fax:86-532-8502-7205 中国 - 上海 Tel:86-21-5407-5533 Fax:86-21-5407-5066 中国 - 瀋陽 Tel:86-24-2334-2829 Fax:86-24-2334-2393 中国 - 深圳 Tel:86-755-8864-2200 Fax:86-755-8203-1760 中国 - 武漢 Tel:86-27-5980-5300 Fax:86-27-5980-5118 中国 - 西安 Tel:86-29-8833-7252 Fax:86-29-8833-7256 アジア / 太平洋中国 - 厦門 Tel:86-592-2388138 Fax:86-592-2388130 中国 - 珠海 Tel:86-756-3210040 Fax:86-756-3210049 インド - バンガロール Tel:91-80-3090-4444 Fax:91-80-3090-4123 インド - ニューデリー Tel:91-11-4160-8631 Fax:91-11-4160-8632 インド - プネ Tel:91-20-3019-1500 日本 - 大阪 Tel:81-6-6152-7160 Fax:81-6-6152-9310 日本 - 東京 Tel:81-3-6880-3770 Fax:81-3-6880-3771 韓国 - 大邱 Tel:82-53-744-4301 Fax:82-53-744-4302 韓国 - ソウル Tel:82-2-554-7200 Fax:82-2-558-5932 または 82-2-558-5934 マレーシア - クアラルンプール Tel:60-3-6201-9857 Fax:60-3-6201-9859 マレーシア - ペナン Tel:60-4-227-8870 Fax:60-4-227-4068 フィリピン - マニラ Tel:63-2-634-9065 Fax:63-2-634-9069 シンガポール Tel:65-6334-8870 Fax:65-6334-8850 台湾 - 新竹 Tel:886-3-5778-366 Fax:886-3-5770-955 台湾 - 高雄 Tel:886-7-213-7828 台湾 - 台北 Tel:886-2-2508-8600 Fax:886-2-2508-0102 タイ - バンコク Tel:66-2-694-1351 Fax:66-2-694-1350 ヨーロッパオーストリア - ヴェルス Tel:43-7242-2244-39 Fax:43-7242-2244-393 デンマーク - コペンハーゲン Tel:45-4450-2828 Fax:45-4485-2829 フランス - パリ Tel:33-1-69-53-63-20 Fax:33-1-69-30-90-79 ドイツ - デュッセルドルフ Tel:49-2129-3766400 ドイツ - ミュンヘン Tel:49-89-627-144-0 Fax:49-89-627-144-44 ドイツ - プフォルツハイム Tel:49-7231-424750 イタリア - ミラノ Tel:39-0331-742611 Fax:39-0331-466781 イタリア - ベニス Tel:39-049-7625286 オランダ - ドリューネン Tel:31-416-690399 Fax:31-416-690340 ポーランド - ワルシャワ Tel:48-22-3325737 スペイン - マドリッド Tel:34-91-708-08-90 Fax:34-91-708-08-91 スウェーデン - ストックホルム Tel:46-8-5090-4654 イギリス - ウォーキンガム Tel:44-118-921-5800 Fax:44-118-921-5820 01/27/15 DS00000237B_JP - p. 20 2015 Microchip Technology Inc.