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データ

  • odawaraさん?ODAさん? NAKAといいます。

    なぜDATAを2Byteごとに書きたいんでしょうか?
    iodefine.hでも2byteで入力できる構造になってないと思うんですけど?
    自分でこの部分を改造しちゃいますか?(笑)

    struct st_can {
    struct {
    union {
    unsigned long LONG;
    struct {
    unsigned short H;
    unsigned short L;
    } WORD;
    struct {
    unsigned char HH;
    unsigned char HL;
    unsigned char LH;
    unsigned char LL;
    } BYTE;
    struct {
    unsigned long IDE:1;
    unsigned long RTR:1;
    unsigned long :1;
    unsigned long SID:11;
    unsigned long EID:18;
    } BIT;
    } ID;
    unsigned short DLC;
    unsigned char DATA[8];
    unsigned short TS;
    } MB[32];

  • 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合体させるようになっているのではないでしょうか、、、

  • わわいです。
    そこんところはバイトアクセスしないといけないんで、ワードデータは上位バイト、下位バイトで分ければいいです
    // 書き込み
    CAN0.MB[0].DATA[0]=data;
    CAN0.MB[0].DATA[1]=data>>8;

    // 読み出し
    data = (CAN0.MB[0].DATA[1]<<8) | CAN0.MB[0].DATA[0];

    まあ、これらの操作は、実際はマクロとか関数にまとめればいいかと。
  • odawaraです。

    NAKAさん、NoMaYさん、わわいさん、いろいろと教えて頂き、ありがとうございました。
    DATAを2Byteごとに書きたい理由は、2回のBYTEアクセスによって分解or合体させることも
    考えましたが、単にWORDデータを1回のアクセスで処理したかっただけの話です。
    ちなみに、RL78の場合は、わざわざ、2回のBYTEアクセスによって分解or合体させる必要はありません。
    最初に記入しましたが、送信バッファ・レジスタまたは受信バッファ・レジスタが充実していて、
    これらのHLレジスタを別々にして2個のBYTEデータとするか、HLレジスタを合わせて1個のWORDデータが
    対応可能です。
    RXのユーザーズマニュアルのメールボックスの説明につきましては、疑問が残りますが、RX初心者としては
    素直にBYTE処理した方が無難であると理解しました。
    いろいろと教えて頂き、ありがとうございました。
  • odawaraさん、こんにちは。NoMaYです。

    > RXのユーザーズマニュアルのメールボックスの説明につきましては、疑問が残りますが、

    この疑問が残る点なのですが、こういうことではないだろうか、と私は思います。

    ● ユーザーズマニュアルは C言語+iodefine.h(の構造体) でプログラムを作る人に向けてだけ書かれたものではなくて、iodefine.h(の構造体)を使わない人やアセンブラ言語を使う人(今は全てアセンブラというのはレアケースと思いますのでアセンブラ言語を併用する場合)も対象としている為、iodefine.h(の構造体)では簡単/素朴には出来ないことでも、マイコンのハードウェア上そういうことも出来ます、ということで記載されたものではないでしょうか。

    ● ですが、普段から C言語+iodefine.h(の構造体) でプログラムを作っている人からすれば、(無意識の前提として C言語+iodefine.h(の構造体) ありきで→)「それは出来ないのでは?ん?出来るのか?どうやって?」という戸惑いに繋がった、ということではないでしょうか。

    ● もっとも、ユーザーズマニュアルで注意を喚起したかったのは、iodefine.h(の構造体)を使わない人やアセンブラ言語を併用する場合、きっとその人がついやってしまいがちな以下のアクセスはマイコンのハードウェア上出来ないですよ、ということですよね。

    「DATA0~DATA3、あるいはDATA4~DATA7を32ビット単位で一度にアクセスすることはできません。」

  • NoMaYさん、odawaraです。
    RXのユーザーズマニュアルのメールボックスの説明の疑問点につきましては、
    おっしゃるとおりで、返す言葉もありません。
    丁寧な解説をして頂き、ありがとうございました。
  • わわいです
    まあ、そもそもそこはそういうふうに作ってあるってことで、疑問にもとーが理屈に合わないとか言っててもしよーがないわけで。
    私達一ユーザとしては、ルネサス様のおっしゃるとおりにしないと動いてくれないのです

    これでいいはずなのに動かない、とさんざ悩んだあげく、データシートの片隅に書かれた1行の注意書きを見つけて、

    な ぜ そ こ だ け ち が う !!

    と血涙を流したのは私だけではないでしょう