CAN ID 一つづつに受信ルール を割当てれば、 F1KH の176pinなら 256の CAN ID+データ を受信できそうですが、後述する 受信Buffer の制約を受けます。 むろんCAN ID MASK値を絞って一つの受信ルール で複数のCAN IDでを受信してもOKですが、CANデータは素早くRAMに退避する必要があります。
CAN ID に一つづつ受信Buffer を割当てれば、 F1KH の176pinなら 128コの CAN ID+データ を同時期に受信でき、最新のそれぞれのCANデータ内容をSFRに保持でき、最も効率的といえます。むろん受信Buffer を複数のCAN IDで使いまわしてもOKですが、CANデータは素早くRAMに退避する必要があります。
受信Buffer は 送信と異なり CAN Channel の割当てはなく、一つの CAN UNIT 内で自由です。 受信ルール が 1つにつき、受信Buffer を一つ割当てます。上記のコード例では以下のように割当てています。
CAN受信側のソフトはオープンソースのBUSMATER を用います。CAN DBを定義でき、CANシグナルに分けてサンプリングとログができます。CANLayzer の CAN DB のコンバートも可。しかし数年間、UPDATEがありません。のでCAN-FDには未対応です。過去職場でも紹介し導入し、割と評判が良かったですが、世間的には知名度が低いのでしょうか? (リリース当時ETASさんもアピールしていましたが) にしてもKavaer CAN King ( 全然Kingじゃない )は使い物にならないと思うのですが…
送信完了割込みは、エラー割込みや送信前のSFRチェックを行えば特に不要です。割込が多発すると、組込みでは貴重な処理能力を食います。今のところは余裕があるため検出しておきました。弊方での実装例は以下のとおりです。実装先は自動コード生成された r_smc_intprg. c です。
/* CAN0 TRANSMIT INTERRUPT */#ifdefined (__CCRH__)#pragmainterruptIntCAN0Tx(enable=false, channel=26, fpu=true, callt=false)#elifdefined (__ghs__)#pragmaghsinterrupt#elifdefined (__ICCRH850__)#pragmatype_attribute=__interrupt#else#errorUnknown Compiler#endifvoidIntCAN0Tx(void){/* Start user code for IntCAN0Tx. Do not edit comment generated here */R_CAN_DispatchEevent( 0 /*unit*/, 0 /* ch.*/, CAN_EVENT_SEND_COMPLATE );/* End user code. Do not edit comment generated here */}