PIC18F26K80のECANレジスタ内容

〔マイコンのトップに戻る〕

CAN通信の基礎概要
MCC操作でECAN 2.0Bプログラムを生成する
PICとPICでECAN通信の実験
MCP2515モジュールでCAN通信の実験1(Arduino)
MCP2515モジュールでCAN通信の実験2(PIC)

このページでは18F26K80のECAN機能で使用するレジスタについて書いています。

ECAN(Enhanced Controller Area Network)は標準のCANモジュールを拡張したECANモジュールです。
ECANモジュールは、BOSCH仕様で定義されている CAN 1.2、CAN 2.0A、CAN 2.0B Passive 及び
CAN 2.0B Active バージョンのプロトコルをサポートします。

ECANモジュールは、次のフレームタイプをサポートしています。

標準データフレーム
拡張データフレーム
リモートフレーム
エラーフレーム
オーバーロードフレーム

ECANモジュールは、3つのモードが有ります。
モード0
 標準のCANモジュールと完全に互換性があるように設計された通常のデフォルト動作モードです。
モード1
 モード0に比べて多くの受信バッファを組み合わせた
動作モードです。
 
拡張バッファ(B0-B5)の内いくつかを送信バッファにする事も出来ます。
 DeviceNetプロトコルなどの高水準プロトコルの実装が簡素化されます。
モード2
 モード1の構成で受信バッファがFIFO(
先入れ先出し)バッファで動作するモードです。
 拡張バッファ(B0-B5)の内いくつかを送信バッファにする事も出来ますが、
 その分FIFOバッファが減ります。
 DeviceNetプロトコルなどの高水準プロトコルの実装が簡素化されます。

モード1とモード2は、沢山の他のノードからジャンジャン受信する場合に利用する使い方でしょう。
モードの設定は、ECANCON
.MDSELビットで行いますが選択したモードによりレジスタの使い方が
異なります。
ここでは、モード0のみで以下記述している事に注意しましょう。

下図は、モード0における送受信バッファ-フィルタ-マスクの構成図でデータシートから拝借しています。

バッファ - フィルタ - マスク構成図(モード0)
バッファ - フィルタ - マスク構成図(モード0)
注1:RXB0はRXB1にオーバフローする事があります
送信バッファ(TXB0-2)が3個、受信バッファ(RXB0/1)が2個で、
フィルタレジスタ(RXF0-5)が6個、マスクレジスタ(RXM0/1)が2個の構成です。
RXM0が受信した場合、RXF0/RXF1-RXB0を通過する事になりますよ。

マスクレジスタでビット1に設定した識別子IDのビットのみを比較する様にフィルタレジスタに渡します。
ビット0の所は識別子IDが"0"でも"1"でも構いません。
フィルタレジスタはマスクされたビット("1"の場所)のみを登録された識別子IDと比較し、
一致したメッセージフレームを受け取る事が出来ます。
ですがぁ、マスクレジスタは全て1に設定(全て通す)して、
フィルタレジスタが6個なので6個の識別子IDを
受け取る様に設計した方が操作しやすい様に思います。

識別子IDの流れ図


CANモジュールI/O制御レジスタ

CANモジュールのI/OピンはデフォルトがCANTX(RB2)/CANRX(RB3)を使いますが、CONFIG3H.CANMX=PORTC
と設定すると
CANTX(RC6)/CANRX(RC7)にピン代替え出来ます。

こ こで説明するレジスタは、CANモジュールのI/Oピン制御の設定を行うレジスタです。
赤文字の設定値はデフォルト値となります。

CIOCON

7
6
5
4
3
2
1
0
TX2SRC
TX2EN
ENDRHI
CANCAP
 -
 -
 -
CLKSEL

TX2SRCCANTX2ピンデータソースの設定を行うビットです。
           1 = CANTX2ピンはCANクロックを出力します
           0 = CANTX2ピンはCANTXを出力します

TX2ENCANTX2ピン有効/無効の設定を行うビットです。
           1 = CANTX2ピンはTX2SRCビットで選択されたCANTXまたはCANクロックを出力します
           0 = CANTX2ピンはデジタルI / O機能で使用します

ENDRHI:HIGHビットの起動を選択するビットです。
           1 = CANTXピンはリセッシブの場合にはVDDで駆動します
           0 = CANTXピンはリセッシブの場合にはトライステートになります
           ディファレンシャルバスを使用する場合は、CANTXの他の近くのピンからの
                      信号クロストークを避ける為に、常にこのビットを設定して下ださい。

CANCAPCANメッセージ受信キャプチャ有効無効の選択ビットです。
           1 = CANキャプチャを有効にします。(CANメッセージ受信信号がRC2 / CCP2の入力となります)
           0 = CANキャプチャを無効にします。

CLKSELCANクロックソースの選択ビットです。
           1 = CANシステムクロックのソースとして発振器を使用する
           0 = CANシステム・クロックのソースとしてPLLを使用する

TX2SRC/TX2ENビットは64pinPICのみサポートですので18F26K80は未実装です。


CAN制御と状態レジスタ

こ こで説明するレジスタは、CANモジュールの全体的な動作を制御し、その動作状態を示します。

CANCON

7
6
5
4
3
2
1
0
REQOP
ABAT
WIN
-

REQOP:CANの動作モードを選択します。
           000 = 通常の動作モード
           001 = 動作禁止でスリープモード
           010 = ループバックモード
           011 = 受信専用モード
           100 = コンフィグレーションモード
           CAN バスのアクティビティを最大限に節約したり、ウェイクアップ出来る様にするには、
               デバイスをスリープ状態にする前に、CANモジュールを"動作禁止でスリープモード" に
               切替えます。

ABAT :保留中(未送信メッセージ)の送信を一括中止させるビットです。
           1 = 全送信バッファに送信中止を通知します
           0 = 送信は通常通り進行します(全ての送信が中止された時にクリアされます)

WIN   :ウィンドウアドレスビット
           これらのビットは、どのCANバッファをアクセスバンク領域に切り替えるかを選択します。
           これにより、任意のデータメモリバンクからのCANバッファレジスタへのアクセスが可能に
           なります。
           メッセージフレームが割込みを引き起こした後、CANSTAT.ICODE ビットをWINビットに
           コピーして正しいバッファを選択する事が出来ます。
          110 = Receive Buffer 0 (RXB0)
          101 = Receive Buffer 1 (RXB1)
          100 = Transmit Buffer 0 (TXB0)
          011 = Transmit Buffer 1 (TXB1)
          010 = Transmit Buffer 2 (TXB2)

通常の動作モード
 CANメッセージデータの送受信が行える標準動作モードです。

動作禁止でスリープモード
 デバイスをスリープやアイドルモードに移行させる前に安全にシャットダウンさせるモードです。
 バス上で11ビットのリセッシブ(アイドル)を検出後にモードを切り替えます、CANクロックを停止させ
 CANTXピンをリセッシブ状態にします、バスアクティビティが発生するかPICがOPMODE="000"を
 設定するとウエイクアップします。

ループバックモード
 自身が送信したメッセージデータを受信させるセルフテストで使用するモードです。
 送信パスは内部的に受信パスと接続されダミーのACK応答が送信データにセットされます。
 ループバックモードはサイレントモードです。つまり、エラーフレームやACK応答など、
 この状態ではメッセージは送信されません。
 デバイスがこのモードの間、CANTXピンはポートI / Oに戻ります。

受信専用モード
 送信プロセスは行わないでバスを監視する為に使用するモードです。
 ACK応答やエラーフレームを生成する事は行ないません。

コンフィグレーションモード
 EANモジュールの初期化設定を行うモードです。
 CANモジュールは、送受信が行われている間はコンフィグレーションモードに入る事が出来ません。
 REQOPビットでコンフィグレーションモードを設定しCANSTAT.OPMODE="100"であれば初期化
 出来ます。
 初期化できるレジスタは、
 ・コンフィギュレーション制御レジスタ(xxxxCON)
 ・ボーレート関連レジスタ(BRGCONx)
 ・受け入れフィルタレジスタ(RXFxxIDx)
 ・受け入れマスクレジスタ
(RXMxxIDx)
 コンフィグレーションモードになると、エラーカウンタはクリアされ、割り込みフラグは変更されません
 又、I / Oピンは通常のI / O機能に戻ります。


CANSTAT

7
6
5
4
3
2
1
0
OPMODE

ICODE


OPMODE:現在操作中のCAN動作モードを示します。
              000 = 通常の動作モード
              001 = 動作禁止でスリープモード
              010 = ループバックモード
              011 = 受信専用モード
              100 = コンフィグレーションモード

ICODE   :このコードは、割り込みのソースを示します。
              001 = CANモジュールエラー割り込み
              110 = Receive Buffer 0 (RXB0)
              101 = Receive Buffer 1 (RXB1)
              100 = Transmit Buffer 0 (TXB0)
              011 = Transmit Buffer 1 (TXB1)
              010 = Transmit Buffer 2 (TXB2)
              111 = CANバスアクティビティウォークアップ割り込み

              割込みが発生すると、これらのビットに優先順位付けされたコード割込み値で示されます。
              CODE ビットをCANCON.IWIN ビットにコピーする事により、マップする正しいバッファを
                  選択する事が出来る様にアクセスバンク領域に移動します。

ECANCON

7
6
5
4
3
2
1
0
MDSEL
FIFOWM
EWIN

MDSEL:ECANモジュールを操作するモードを選択します。
           00 = 従来のモード(MODE 0)
           01 = DeviceNetをサポートする、バッファを拡張された従来のモード(MODE 1)
           10 = DeviceNet をサポートする、バッファを拡張されたFIFOモード(MODE 2)
           このビットを操作するには、CANCON.REQOP = "100"(コンフィグレーションモード)でないと
               設定出来ません。

COMSTAT

7
6
5
4
3
2
1
0
RXB0OVFL
RXB1OVFL TXBO
TXBP
RXBP
TXWARN
RXWARN EWARN

RXB0OVFL:受信バッファ0(RXB0)オーバフローの状態を 示します。
               0 = 受信バッファ0はオーバーフローしていません
               1 = 受信バッファ0がオーバーフローしました

RXB1OVFL:受信バッファ1(RXB1)オーバフローの状態を 示します。
               0 = 受信バッファ1はオーバーフローしていません
               1 = 受信バッファ1がオーバーフローしました

TXBO      :送信側の”バスオフ状態”を示します。
               0 = 送信エラーカウンタ値 ≦ 255
               1 = 送信エラーカウンタ値 > 255 (バスオフ状態中)

TXBP       :送信側の”エラーパッシブ状態”を示します。
               0 = 送信エラーカウンタ値 ≦ 127
               1 = 送信エラーカウンタ値 > 127 (エラーパッシブ状態中)

RXBP       :受信側の”エラーパッシブ状態”を示します。
               0 = 受信エラーカウンタ値 ≦ 127
               1 = 受信エラーカウンタ値 > 127 (エラーパッシブ状態中)

TXWARN  :送信側のバスに重度の障害が有る事を表す警告リミットを示します。
               0 = 送信エラーカウンタ値 ≦ 95
               1 = 送信エラーカウンタ値 > 95 (警告発令中)

RXWARN  :受信側のバスに重度の障害が有る事を表す警告リミットを示します。
               0 = 受信エラーカウンタ値 ≦ 95
               1 = 受信エラーカウンタ値 > 95 (警告発令中)

EWARN    :警告リミットの状態を示します。
               0 = 送受信共に警告リミットのビットはセットされていません。
               1 = 送信側警告リミットのビット又は受信側警告リミットのビットがセットされています。

エラーカウンタの話はこちらを参照下さい。


CAN送信バッファレジスタ関連

ここで説明するレジスタは、CAN 送信バッファレジスタとそれに関連する制御レジスタについて説明します。
レジスタ名のに は、TXB0/TXB1/TXB2 (3個の送信バッファ)を 当てはめます。

TXBnCON

7
6
5
4
3
2
1
0
TXBIF
TXABT
TXLARB
TXERR
TXREQ
-
TXPRI

TXBIF送 信バッファ割り込みフラグビット。
            1 = 送信バッファがメッセージの送信を完了し、再ロード可能
            0 = 送信バッファはメッセージの送信を完了していません

TXABTメッ セージ送 信中 止の状 態ビットを示します。
            1 = メッセージは中止されました
            0 = メッセージは中止されませんでした
            こ のビットは、TXREQ がセットされると自動的にクリアされます。

TXLARB送 信中アー ビトレーション(調停)ロスト情 報ビットを示します。
            1 = メッ セージの送信中にアービトレーションが失われました
            0 = メッ セージは送信中にアービトレーションを失わなかった
            このビットは、TXREQ がセットされると自動的にクリアされます。

TXERR伝 送エラー検出の情報ビットを 示します。
            1 = メッ セージの送信中にバスエラーが発生しました
            0 = メッ セージの送信中にバスエラーが発生しなかった
            こ のビットは、TXREQ がセットされると自動的にクリアされます。

TXREQ送信要求ビット
            1 = メッ セージの送信を要求します。 TXABTTXLARB及びTXERRビットをクリアします。
            0 = メッ セージが正常に送信されると自動的に消去されます。
            TXREQ がセットされている間は、送信バッファレジスタは読み出し専用のままです。
            ビッ トがセットされている間、このビットをソフトウェアでクリアすると、
                メッセージの送信中止が要求されます。

TXPRI
:送信の優先順位をセットするビット
            11 = 優 先レベル3(最高優先順位)
            10 = 優 先度2
            01 = 優 先度1
            00 = 優 先レベル0(最低優先順位)
            こ れらのビットは、送信バッファが転送される順序を定義します。
                尚、 この優先順位はCANプロトコルのアービトレーションの優先順位付とは無関係ですので
                CANメッセージ識別子は変更されません。
            2つのバッファの優先度設定が同じ場合は、最もバッファ番号の大きいバッファが最初に送信
                されます。


以下のレジスタ(TXBnSIDH/TXBnSIDL/TXBnEIDH/TXBnEIDL)は、データ内容や送信ノードの
識別子(ID)をセットするレジスタです。
識別子IDの上位7 ビットがすべて'1'であるID設定は禁止されています。

TXBnSIDH

7
6
5
4
3
2
1
0
SID10
SID9
SID8 SID7 SID6 SID5 SID4 SID3

TXBnSIDL

7
6
5
4
3
2
1
0
SID2
SID1
SID0 -
EXIDE
-
EID17 EID16

EXIDE拡 張識別子の有効無効選択ビット
          1 = メッ セージは拡張IDを送信し、SID[10:0]+EID[17:0]の29ビットになります
          0 = メッ セージは標準IDを送信し、EID[17:0]は無視されます

TXBnEIDH

7
6
5
4
3
2
1
0
EID15
EID14
EID13 EID12 EID11 EID10 EID9 EID8

TXBnEIDL

7
6
5
4
3
2
1
0
EID7
EID6
EID5 EID4 EID3 EID2 EID1 EID0


TXBnDmレジスタは送信するメッセージフレーム内のデータ8バイトをセットするレジスタです。
レジスタ名のに は、D0D7を 当てはめます。
(TXB0-2の3バッファ x 8バイト分有るので24レジスタ有る事になります)

TXBnDm

7
6
5
4
3
2
1
0
TXBnDm7
TXBnDm6 TXBnDm5 TXBnDm4 TXBnDm3 TXBnDm2 TXBnDm1 TXBnDm0


TXBnDLC

7
6
5
4
3
2
1
0
-
TXRTR
-
-
DLC

TXRTR:リモートフレーム送信要求ビット
          1 = リモートフレームを送りたい場合にセットします
          0 = メッセージが送信されるとTXRTR ビットは自動的にクリアされます

DLC  :送信するメッセージデータのバイト数(0-8)をセットします。

TXERRCNT

7
6
5
4
3
2
1
0
TEC

送信エラーカウンタレジスタで、0〜255の値でオーバフローすると”バス オフ状態”に移行します。
バスが11個の連続したリセッシブビットを128回の発生を受信した時、カウンタ値はクリアされます。
エラーカウンタの話はこちらを参照下さい。


CAN受信バッファレジスタ関連

ここで説明するレジスタは、CAN 受信バッファレジスタとそれに関連する制御レジスタについて説明します。
レジスタ名のに は、RXB0/RXB1 (2個の受信バッファ)を 当てはめます。
RXB0はより高い優先順位のバッファであり、RXB1は優先順位の低いバッファとなります。

RXB0CON

7
6
5
4
3
2
1
0
RXFUL
RXM
-
RXRTRRO
RXB0DBEN
JTOFF
FILHIT

RXFUL      :受 信バッファフルの状態を示すビットです。
                1 = 受信バッファに受信メッセージが含まれている
                0 = し いメッセージを受信する為に受信バッファが開いている
                こ のビットは、メッセージを受信するとCANモジュールによってセットされ、
                    バッファが読み込まれた後、ソフトウェアによってクリアされなければなりません
                RXFUL がセットされている限り、新しいメッセージはロードされません、
                    RXFUL フラグをクリアすると、PIR5.RXB0IFをクリアする事が出来ます。
                    RXB0IF がクリアされているがRXFULがクリアされていない場合、RXB0IFは再びセット
                    されます。

RXM
        :受 信バッファモードの設定を行います。
                11 = 全てのメッセージを受信する(エラーの有る物を含む)、フィ ルタ基準は無視されます
                10 = 拡張識別子を持つ有効なメッセージのみを受信する、RXFnSIDL.EXIDEN ='1'にセット時
                01 = 標準識別子を持つ有効なメッセージのみを受信するRXFnSIDL.EXIDEN= '0'にセット時
                00 = RXFnSIDL.EXIDEN ビットごとに全ての有効なメッセージを受信する

RXRTRRO
   :受信メッセージのリモート送信要求ビットです。(読み取り専用)
                1 = 他ノードからリモート送信要求を受信した
                0 = リモート送信要求を受信していない

RXB0DBEN
受信バッファ0ダブルバッファ有効/無効ビットです。
                1 = 受信バッファ0(RXB0)のオーバーフロー時は受信バッファ1(RXB1)に書き込みます
                0 = 受信バッファ0(RXB0)は受信バッファ1(RXB1)にオーバーフローしない

JTOFF
      :ジャンプテーブルオフセットビットです。(RXB0DBENの読み出し専用コピー)
                1 = 6と7の間のジャンプテーブルオフセットを許可します
                0 = 1と0の間のジャンプテーブルオフセットを許可します
                このビットは、RXB0CONRXB1CONの両方に対して同じフィルタジャンプテーブルを
                    許可します。

FILHIT
     :フィルターヒットビット
                1 = 受入れフィルタ1(RXF1)
                0 = 受入れフィルタ0(RXF0)
                このビットは、どの受入れフィルタが受信バッファ0へのメッセージ受信を可能にしたかを
                    示します。

RXB1CON

7
6
5
4
3
2
1
0
RXFUL
RXM
-
RXRTRRO
FILHIT

RXFUL      :受 信バッファフルの状態を示すビットです。
                1 = 受信バッファに受信メッセージが含まれている
                0 = し いメッセージを受信する為に受信バッファが開いている
                こ のビットは、メッセージを受信するとCANモジュールによってセットされ、
                    バッファが読み込まれた後、ソフトウェアによってクリアされなければなりません
                RXFUL がセットされている限り、新しいメッセージはロードされません、
                    RXFUL フラグをクリアすると、PIR5.RXB1IFをクリアする事が出来ます。
                    RXB1IF がクリアされているがRXFULがクリアされていない場合、RXB1IFは再びセット
                    されます。

RXM
        :受 信バッファモードの設定を行います。
                11 = 全てのメッセージを受信する(エラーの有る物を含む)、フィ ルタ基準は無視されます
                10 = 拡張識別子を持つ有効なメッセージのみを受信する、RXFnSIDL.EXIDEN ='1'にセット時
                01 = 標準識別子を持つ有効なメッセージのみを受信するRXFnSIDL.EXIDEN= '0'にセット時
                00 = RXFnSIDL.EXIDENビットごとに全ての有効なメッセージを受信する

RXRTRRO
   :受信メッセージのリモート送信要求ビットです。(読み取り専用)
                1 = 他ノードからリモート送信要求を受信した
                0 = リモート送信要求を受信していない

FILHIT
     :フィルターヒットビット
                101 = 受入れフィルタ5(RXF5)
                100 = 受入れフィルタ4(RXF4)
                011 = 受入れフィルタ3(RXF3)
                010 = 受入れフィルタ2(RXF2)
                001 = 受入れフィルタ1(RXF1)、RXB0CON.RXB0DBENビットがセットされている時に可能
                000 = 受入れフィルタ0(RXF0)、RXB0CON.RXB0DBENビットがセットされている時に可能
                このビットは、どの受入れフィルタが受信バッファ1へのメッセージ受信を可能にしたかを
                    示します。


以下のレジスタ(RXBnSIDH/RXBnSIDL/RXBnEIDH/RXBnEIDL)は、
受信されたデータ内容や送信ノードの識別子(ID)を格納するレジスタです。

RXBnSIDH

7
6
5
4
3
2
1
0
SID10
SID9
SID8 SID7 SID6 SID5 SID4 SID3

RXBnSIDL

7
6
5
4
3
2
1
0
SID2
SID1
SID0 SRR
EXID
-
EID17 EID16

SRR   :代替リ モート要求ビット
          拡張フレームのみ存在するが、リセッシブ(1)固定となります。

EXID 拡 張識別子ビット
          1 = 受信したメッ セージは拡張データフレームであり、SID[10:0]+EID[17:0]になります
          0 = 受信したメッ セージは標準データフレームでありSID[10:0]になります

RXBnEIDH

7
6
5
4
3
2
1
0
EID15
EID14
EID13 EID12 EID11 EID10 EID9 EID8

RXBnEIDL

7
6
5
4
3
2
1
0
EID7
EID6
EID5 EID4 EID3 EID2 EID1 EID0


RXBnDmレジスタは受信されたメッセージフレーム内のデータ8バイトが格納されるレジスタです。
レジスタ名のに は、D0D7を 当てはめます。
(RXB0/1の2バッファ x 8バイト分有るので16レジスタ有る事になります)

RXBnDm

7
6
5
4
3
2
1
0
RXBnDm7
RXBnDm6 RXBnDm5 RXBnDm4 RXBnDm3 RXBnDm2 RXBnDm1 RXBnDm0


RXBnDLC

7
6
5
4
3
2
1
0
-
RXRTR
RB1
RB0
DLC

RXRTR:レシーバリモート送信要求ビット
          1 = リモート転送要求有り
          0 = リモート転送要求無し

RB    :CAN通信で予約されたビット(RB0/RB1)で、ドミナント(1)固定となります。

DLC  :受信したメッセージデータのバイト数(0-8)が格納されます。

RXERRCNT

7
6
5
4
3
2
1
0
REC

受信エラーカウンタレジスタで、127以上で”エラーパッシブ状態”に移行します。
RXERRCNTは、モジュールを”バス オフ状態”にする事は出来ません。
エラーカウンタの話はこちらを参照下さい。


メッセージ受入れフィルタとマスクレジスタ関連

ここで説明するレジスタは、メッセージ受け入れフィルタとCAN受信バッファ用のマスクについて説明
します。
レジスタ名のに は、RXF0/RXF1/RXF2/RXF3/RXF4/RXF5 (6個の受け入れフィルタレジスタ)を
当てはめます。

RXFnSIDH

7
6
5
4
3
2
1
0
SID10
SID9
SID8 SID7 SID6 SID5 SID4 SID3

RXFnSIDL

7
6
5
4
3
2
1
0
SID2
SID1
SID0  -
EXIDEN
 -
EID17 EID16

EXIDEN拡張識別子メッセージフィルタ有効/無効ビット
           1 = フィルタ拡張IDメッセージ(SID[10:0]+EID[17:0])のみを受け入れます
           0 = フィルタ標準IDメッセージ(SID[10:0])のみを受け入れます
                 モード0では、対応するマスク・レジスタ値にかかわらず、必要に応じてこのビットを
                      セット/クリアする必要があります。


RXFnEIDH

7
6
5
4
3
2
1
0
EID15
EID14
EID13 EID12 EID11 EID10 EID9 EID8

RXFnEIDL

7
6
5
4
3
2
1
0
EID7
EID6
EID5 EID4 EID3 EID2 EID1 EID0

以下はCAN受信バッファ用のマスクレジスタです、 レジスタ名のに は、
RXM0/RXM1 (2個のマスクレジスタ)を当てはめます。
'1'を設定したビットのみがフィルタレジスタの比較対象となります、全ての識別子IDを比較したい場合は
全てのビットは'1'にしましょう。

RXMnSIDH

7
6
5
4
3
2
1
0
SID10
SID9
SID8 SID7 SID6 SID5 SID4 SID3

RXMnSIDL

7
6
5
4
3
2
1
0
SID2
SID1
SID0  -
EXIDEN
 -
EID17 EID16

RXMnEIDH

7
6
5
4
3
2
1
0
EID15
EID14
EID13 EID12 EID11 EID10 EID9 EID8

RXMnEIDL

7
6
5
4
3
2
1
0
EID7
EID6
EID5 EID4 EID3 EID2 EID1 EID0



CANボーレートレジスタ関連

これらのレジスタはコンフィギュレーションモードでのみ書き込み可能です。
CAN通信は全ノードがバス上に流れているデータを監視する必要が有ります、その為にデータの
1ビット1ビットを同じ同期で正しく読めないとダメですが、その同期がズレた場合に調整する機能が
有ります、その調整する機能の設定と通信速度の設定を行うレジスタです。

通信データの1ビットには4つの時間セグメント(Time Segments:下図)が割り当てられており、
これはオシレータのドリフト又は伝搬遅延による位相差を補正する為の仕組みで、1TQ
(Time Quanta)
オシレータのクロックから得られる固定の時間単位です。
1ビットにおける時間単位の総数は8-25TQの間で設定する必要が有ります。

リセッシブからドミナントへの遷移時(立下がりエッジ)に同期が行われ
フレームの最初(SOF)で行われるのが"ハード同期"と呼ばれ、
TQカウント時間がスタートします。

"再同期"は、フレームの送信中に立下がりエッジが有った場合に同期が行われる事を言います。
でぇ、設定された各セグメントの時間(TQ)をカウントしていますが、
立ち下がりエッジを検出した時に
"Sync Seg"をカウントしていれば同期が有っていると判断出来ます
"Sync Seg"をカウントした後にエッジを検出した場合は、そのTQ分"Phase Seg1"を伸ばして
サンプルポイントを同期させます。
エッジが立ち下がった時にまだ
"Phase Seg2"の位置で"Sync Seg"をカウントしていない場合は、
その位置の"Phase Seg2"のTQをSJW分縮めます、その分
"Sync Seg"から再カウントされる状態になります。

この辺の話はこちらを参考下さい。

ビットセグメント
この図は、データシートからの拝借です。(一部加工)

TQ(Time Quanta)
 各ビットをクアンタ(量子)と呼ばれる複数のタイムスライスに分割した時間。

サンプルポイント(
Sample Point)
 
CANバス上の状態を読み出すCAN Nominal Bit Time(CAN公称ビット時間)に有るポイントです。
 
サンプリングポイントはできるだけ遅くするか、ビット時間の約80%にする必要が有ります。
 又、
サンプリングポイントは"Phase Seg1"と"Phase Seg2"の間に有ります。

1ビット10TQ構成での例
サンプルポイントの位置図
Propagation Seg+Phase Seg1を大きくしてPhase Seg2を小さくすればポイントは遅くなります。
Propagation Seg+Phase Seg1を小さくしてPhase Seg2を大きくすればポイントは早くなります。

同期セグメント
(Sync Seg)
 CANバス上に接続されている全ノードを同期させる為に有ります、
 信号の立下がりエッジはこの場所内で収まる事が望ましいですが、エッジが"Sync Seg"よりも
 ズレた場合は"Phase Seg1"を伸ばしたり"Phase Seg2"を縮める事で、サンプルポイントをずらし、
 正確に信号を読み取ります。
 尚、1TQ固定です。

伝搬セグメント
(Propagation Seg)

 CANバス上に接続されているトランシーバによって発生する物理的な時間遅延の補正に使われます。

位相セグメント1
(Phase Seg1)
 位相差が生じた場合にSJW時間延長されます。

位相セグメント2
(Phase Seg2)
 位相差が生じた場合にSJW時間短縮されます。

同期ジャンプ幅
(SJW:reSynchronization Jump Width)
 位相セグメント1・2の時間間隔に適応する時間収縮の量を制限する事によって、SJWを決定します、
 同期ジャンプ幅は1-4TQとなります。


BRGCON1

7
6
5
4
3
2
1
0
SJW
BRP

SJW:同期ジャンプ幅(SJW値)の設定ビット
        11 = 同期ジャンプ幅時間= 4×TQ
        10 = 同期ジャンプ幅時間= 3×TQ
        01 = 同期ジャンプ幅時間= 2×TQ
        00 = 同期ジャンプ幅時間= 1×TQ
        この時間は、位相セグメント2の時間より長くする事は出来ません。

BRP :ボーレートプリスケーラの設定ビット
        111111 = TQ(us)=(2x64)/Fosc
        111110 = TQ(us)=(2x63)/Fosc
            :
        000001 = TQ(us)=(2x2)/Fosc
        000000 = TQ(us)=(2x1)/Fosc

        例えば、ボーレート=100kbpsなら1Bit=10usでぇ、1Bitを10TQにするなら1TQ=1us
            Fosc=16MHzとするとぉ、BRP=7の設定でぇ、1TQ=(2*8)/16000000=1usとぉなりますね。

BRGCON2

7
6
5
4
3
2
1
0
SEG2PHTS
SAM
SEG1PH
PRSEG

SEG2PHTS位相セグメントの時間選択の設定ビット
                1 = 自由に時間をプログラム可能(BRGCON3.SEG2PHビットで設定)
                0 = 位相セグメント1の最大値と情報処理時間(IPT)のいずれか大きい方

                IPT(Information Processing Time)とは、サンプルポイントした内容をCPUがビットの
                   レベルを確定する処理に必要な時間PIC18F66K80ファミリでは2TQで固定。

SAM       :CANバスラインのサンプル場所の設定ビット
                1 = バスラインはサンプルポイントで1回、その前のTQ/2で2回サンプリングされます
                0 =バスラインはサンプルポイントで1回サンプリングされます

SEG1PH
   :位相セグメント1のTQ時間を設定するビット
                111 = 位相セグメント1時間= 8×TQ
                110 = 位相セグメント1時間= 7×TQ
                101 = 位相セグメント1時間= 6×TQ
                100 = 位相セグメント1時間= 5×TQ
                011 = 位相セグメント1時間= 4×TQ
                010 = 位相セグメント1時間= 3×TQ
                001 = 位相セグメント1時間= 2×TQ
                000 = 位相セグメント1時間= 1×TQ

PRSEG 
    :伝搬セグメント1のTQ時間を設定するビット
                111 = 伝搬セグメント1時間= 8×TQ
                110 = 伝搬セグメント1時間= 7×TQ
                101 = 伝搬セグメント1時間= 6×TQ
                100 = 伝搬セグメント1時間= 5×TQ
                011 = 伝搬セグメント1時間= 4×TQ
                010 = 伝搬セグメント1時間= 3×TQ
                001 = 伝搬セグメント1時間= 2×TQ
                000 = 伝搬セグメント1時間= 1×TQ

BRGCON3

7
6
5
4
3
2
1
0
WAKDIS
WAKFIL
 -
 -
 -
SEG2PH

WAKDISCANバスの動作によるウェイクアップ有効/無効ビット
             1 = CANバス動作ウェイクアップ機能を無効にする
             0 = CANバス動作ウェイクアップ機能を有効にする

WAKFIL
ウェイクアップ用CANバスラインフィルタの選択ビット
             1 = ウェイクアップにCANバスラインフィルタを使用する
             0 = ウェイクアップにCANバスラインフィルタを使用しない

             CANRX入力ラインへのローパスフィルタ機能の使用を有効/無効にします。
                 これにより、バスのノイズまたは短絡のためにデバイスが起動するのを防止します。

SEG2PH
:位相セグメント2のTQ時間を設定するビット
             111 = 位相セグメント2時間= 8×TQ
             110 = 位相セグメント2時間= 7×TQ
             101 = 位相セグメント2時間= 6×TQ
             100 = 位相セグメント2時間= 5×TQ
             011 = 位相セグメント2時間= 4×TQ
             010 = 位相セグメント2時間= 3×TQ
             001 = 位相セグメント2時間= 2×TQ
             000 = 位相セグメント2時間= 1×TQ

             BRGCON2.SEG2PHTSビット=’0’の場合、これらのビットは無視されます。
             情報を処理する時間(IPT)の必要時間は2TQ以内で、PICは2TQ固定な為
                 サンプルポイントは"Phase Seg1"の終端で在るから、IPT は"Phase Seg2"の場所と重なる、
                 IPT が2TQ の時"Phase Seg2"に1TQ を選ぶ事は出来ないので位相セグメント2の実際の
                 最小長は2TQです。



CAN割り込みレジスタ関連

ここで説明するレジスタは、CAN通信の送受信中に発生する色々なイベント割込みの制御を行うレジスタです。
エラー割り込みの発生源は、通信ステータスレジスタCOMSTATを読み出す事によって判断出来ます。

PIR5

7
6
5
4
3
2
1
0
IRXIF
WAKIF
ERRIF
TXB2IF
TXB1IF
TXB0IF
RXB1IF
RXB0IF

IRXIF  :CANバスメッセージエラー割り込みフラグビット
           1 = 送受信中にCANバス上で無効なメッセージが発生しました
           0 = CANバス上に無効なメッセージはありません

           リッスンオンリーモードと組合わせて使用する場合、ボーレートの決定を容易にする為に
               使用されます。

WAKIF
CANバスアクティビティウォークアップ割り込みフラグビット
           1 = CANバス上のアクティビティを検出しました
           0 = CANバス上のアクティビティなし

                デバイスがスリープ中にこの割り込みが発生すると、スリープモードを終了します。
                     割り込みはMCUによってリセットされ、WAKIFビットがクリアされます。

ERRIF
CANモジュールエラー割り込みフラグビット
           1 = CANモジュールにエラーが発生しました
           0 = CANモジュールエラーなし

                オーバフロー条件が発生するか、又は送受信のエラー状態が変化した場合に割り込みが
                     発生します。("エラーパッシブ状態"、"バスオフ状態"の変化に"エラーカウンタ96超えの警告")

TXB2IF
CAN送信バッファ2割り込みフラグビット
           1 = 送信バッファ2はメッセージの送信を完了し、再ロードする事が出来ます
           0 = 送信バッファ2はメッセージの送信を完了していません
           割り込みはソフトによってクリアし、TXB2IFビットを '0'にリセットします。

TXB1IF
CAN送信バッファ1割り込みフラグビット
           1 = 送信バッファ1はメッセージの送信を完了し、再ロードする事が出来ます
           0 = 送信バッファ1はメッセージの送信を完了していません
           割り込みはソフトによってクリアし、TXB1IFビットを '0'にリセットします。

TXB0IF
CAN送信バッファ0割り込みフラグビット
           1 = 送信バッファ0はメッセージの送信を完了し、再ロードする事が出来ます
           0 = 送信バッファ0はメッセージの送信を完了していません
           割り込みはソフトによってクリアし、TXB0IFビットを '0'にリセットします。

RXB1IF
CAN受信バッファ1割り込みフラグビット
           1 = 受信バッファ1が新しいメッセージを受信しました
           0 = 受信バッファ1は新しいメッセージを受信していません
           割り込みはソフトによってクリアし、RXB1IFビットを '0'にリセットします。

RXB0IF
CAN受信バッファ0割り込みフラグビット
           1 = 受信バッファ0が新しいメッセージを受信しました
           0 = 受信バッファ0は新しいメッセージを受信していません
           割り込みはソフトによってクリアし、RXB0IFビットを '0'にリセットします。

PIE5

7
6
5
4
3
2
1
0
IRXIE
WAKIE
ERRIE
TXB2IE
TXB1IE
TXB0IE
RXB1IE
RXB0IE

IRXIE  :CANバスメッセージエラー割り込み有効/無効の設定ビット
           1 = 無効なメッセージ受信割り込みを有効にする
           0 = 無効なメッセージ受信割り込みを無効にする

WAKIECANバスアクティビティウォークアップ割り込み有効/無効の設定ビット
           1 = CANバス上のアクティビティを有効にする
           0 = CANバス上のアクティビティを無効にする

ERRIECANモジュールエラー割り込み有効/無効の設定ビット(COMSTATが変化した時)
           1 = CANモジュールエラー割り込みを有効にする
           0 = CANモジュールエラー割り込みを無効にする

TXB2IECAN送信バッファ2割り込み有効/無効の設定ビット(送信完了でバッファが空になった時)
           1 = 送信バッファ2割り込みを有効にする
           0 = 送信バッファ2割り込みを無効にする

TXB1IECAN送信バッファ1割り込み有効/無効の設定ビット(送信完了でバッファが空になった時)
           1 = 送信バッファ1割り込みを有効にする
           0 = 送信バッファ1割り込みを無効にする

TXB0IECAN送信バッファ0割り込み有効/無効の設定ビット(送信完了でバッファが空になった時)
           1 = 送信バッファ0割り込みを有効にする
           0 = 送信バッファ0割り込みを無効にする

RXB1IECAN受信バッファ1割り込み有効/無効の設定ビット(メッセージを受信した時)
           1 = 受信バッファ1割り込みを有効にする
           0受信バッファ1割り込みを無効にする

RXB0IECAN受信バッファ0割り込み有効/無効の設定ビット(メッセージを受信した時)
           1 = 受信バッファ0割り込みを有効にする
           0受信バッファ0割り込みを無効にする

IPR5

7
6
5
4
3
2
1
0
IRXIP
WAKIP
ERRIP
TXB2IP
TXB1IP
TXB0IP
RXB1IP
RXB0IP

IRXIP  :CANバスメッセージエラー割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

WAKIPCANバスアクティビティウォークアップ割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

ERRIPCANモジュールエラー割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

TXB2IPCAN送信バッファ2割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

TXB1IPCAN送信バッファ1割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

TXB0IPCAN送信バッファ0割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

RXB1IPCAN受信バッファ1割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

RXB0IPCAN受信バッファ0割り込み優先度の設定ビット
           1 = 高い優先度にする
           0 = 低い優先度にする

優先度の高い割込みにはより低い値が割当てられる様に、
      割込みは内部的に優先順位
(ERR>TXB0>TXB1>TXB2>RXB0>RXB1>WAK)が付けられます。
      最高優先度の割込み条件がクリアされると、保留中の次に優先度の高い割込みのコードが
      CANSTAT
.ICODE ビットに反映されますが、関連する割込み許可ビット(PIE5)が設定されている
      割込みソースのみが
CANSTAT.ICODE ビットに反映される事に注意して下ださい。


《その他》

モード1とモード2におけるレジスタの説明や実験等は現在考えていません。m(_ _)m




【きむ茶工房ガ レージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.