RXマイコンのCAN通信のWORDデータについて

はじめまして、ODAと申します。
RL78マイコンをCS+ for CA,CXを使ってプログラムを作成してきましたが、今回、初めて
RXマイコンをCS+ for CCを使ってプログラム作成にチャレンジして、つまずいております。
CAN通信において、RL78ではBYTEデータでもWORDデータでも簡単に処理できましたが、

RL78の送信データの事例
TMDF00L = 0x01;  //BYTEデータ
TMDF00H = 0x23;  //BYTEデータ
TMDF10 = 0x4567; //WORDデータ
TMDF20 = 0x89AB; //WORDデータ

RXにおけるWORDデータの処理方法がわかりません。
事例として、動作確認済みのBYTEデータの送信プログラムを記載します。

CAN0.MCTL[0].BYTE = 0x00;    // 送信準備
CAN0.MB[0].ID.BIT.SID = 0x777;
CAN0.MB[0].DLC = 8;
CAN0.MB[0].DATA[0] = 0x01;  //BYTEデータ
CAN0.MB[0].DATA[1] = 0x23;
CAN0.MB[0].DATA[2] = 0x45;
CAN0.MB[0].DATA[3] = 0x67;
CAN0.MB[0].DATA[4] = 0x89;
CAN0.MB[0].DATA[5] = 0xAB;
CAN0.MB[0].DATA[6] = 0xCD;
CAN0.MB[0].DATA[7] = 0xEF;
CAN0.MCTL[0].BYTE = 0x80;    // 送信リクエスト
// 送信完了待ち
while (CAN0.MCTL[0].BIT.TX.SENTDATA != 1){};

ユーザーズマニュアルのメールボックスの説明に
「DATA0~DATA3、あるいはDATA4~DATA7を32ビット単位で一度にアクセスすることはできません。
DATA0~DATA1、DATA2~DATA5、DATA6~DATA7の3回、または、DATA0~DATA1、DATA2~DATA3、
DATA4~DATA5、DATA6~DATA7の4回に分けてアクセスしてください。」
と記入されていますので、WORDデータの処理も可能と考えますが、具体的なアクセス方法(プログラム)
を教えて頂きたく、よろしく、お願い致します。

勝手に下記の内容で、チャレンジしましたが、エラーとはなりませんが、正確なデータは送信できませんでした。
CAN0.MB[0].DATA[01] = 0x0123;  //WORDデータ

Parents
  • odawaraさん、こんにちは。NoMaYと申します。#CANについては知識がありませんけれど。

    C言語の標準的文法+CC-RX特有の__evenaccessキーワードで以下のように出来る筈だと思います。(なお、__evenaccessは無くても大抵は動くと思いますが、最適化レベルを上げた時に、複雑なソースで何かの拍子に動かないケースがあると怖いので、一応付けた方が良いと思っています。)

    *(volatile unsigned short __evenaccess *)(&CAN0.MB[0].DATA[0]) = 0x0123;

    自分が思うに、WORDアクセスが簡単に出来るようなiodefine.hになってないのは、歴史的な理由(RXマイコンの今のCANの回路の御先祖さまの回路が8ビットアクセスしか出来なかったとか)かなと思ったりしています、、、(iodefine.hの今のCANの構造体も御先祖さまの構造体の作りが継承されているとかかなと、、、)

    [追記]

    あと、今回は(たぶんリトルエンディアンだろうなと思ったので)関係の無い話だと思いますが、以下のスレッドも今後の何かの参考になるかも知れません。

    配列と構造体を共用体にしてエンディアンが逆さにならないようにするには?
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/5680/thread

    [追記その2]

    歴史的な理由の他に、もう1つ思い浮かんだのですが、CANのルールにはWORDデータをWORD境界に配置することというものは無いのではないですか、、、つまりDATA[1]とDATA[2]でWORDデータを構成しても構わなくて、そうなるとWORD境界からのWORDアクセスだけ簡単に出来るようになっていても片手落ちですので、潔くBYTEアクセス出来れば良し、としているのかも知れません、、、

    ちなみに、上に書いたコードですが、DATA[1]とDATA[2]でWORDデータを構成している場合は使えません。また、RL78でも、そのような場合には2回のBYTEアクセスによってわわいさんのコードのように分解or合体させるようになっているのではないでしょうか、、、

Reply
  • odawaraさん、こんにちは。NoMaYと申します。#CANについては知識がありませんけれど。

    C言語の標準的文法+CC-RX特有の__evenaccessキーワードで以下のように出来る筈だと思います。(なお、__evenaccessは無くても大抵は動くと思いますが、最適化レベルを上げた時に、複雑なソースで何かの拍子に動かないケースがあると怖いので、一応付けた方が良いと思っています。)

    *(volatile unsigned short __evenaccess *)(&CAN0.MB[0].DATA[0]) = 0x0123;

    自分が思うに、WORDアクセスが簡単に出来るようなiodefine.hになってないのは、歴史的な理由(RXマイコンの今のCANの回路の御先祖さまの回路が8ビットアクセスしか出来なかったとか)かなと思ったりしています、、、(iodefine.hの今のCANの構造体も御先祖さまの構造体の作りが継承されているとかかなと、、、)

    [追記]

    あと、今回は(たぶんリトルエンディアンだろうなと思ったので)関係の無い話だと思いますが、以下のスレッドも今後の何かの参考になるかも知れません。

    配列と構造体を共用体にしてエンディアンが逆さにならないようにするには?
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/5680/thread

    [追記その2]

    歴史的な理由の他に、もう1つ思い浮かんだのですが、CANのルールにはWORDデータをWORD境界に配置することというものは無いのではないですか、、、つまりDATA[1]とDATA[2]でWORDデータを構成しても構わなくて、そうなるとWORD境界からのWORDアクセスだけ簡単に出来るようになっていても片手落ちですので、潔くBYTEアクセス出来れば良し、としているのかも知れません、、、

    ちなみに、上に書いたコードですが、DATA[1]とDATA[2]でWORDデータを構成している場合は使えません。また、RL78でも、そのような場合には2回のBYTEアクセスによってわわいさんのコードのように分解or合体させるようになっているのではないでしょうか、、、

Children
No Data