データフラッシュ読み込みで uint32_t の値がおかしい

RL78G13 でデータフラッシュライブラリを使用していますが、添付画像のように uint32_t の取得で値がおかしくなります(偶数アドレスデータが 0x00 になる?)。

SETTING_STORAGE は下記の構造です。

typedef struct
{
    uint8_t     ValidMark;      
    uint8_t     CheckSum;       
    uint8_t     RunMode; 
    uint8_t     Temperature;  
    uint32_t    SafeModeTime;
}   SETTING_STORAGE;

なお、memcpy() でコピーすると正常に取得できます。

原因がお判りの方がいらっしゃいましたら、お教え願えないでしょうか?

よろしくお願いいたします。

  • 物理アクセスで1バイト単位のみとか、2バイト単位のみとか、次のアクセスまでに待ち時間が必要とか、何かしらの制限があって、それが原因で発生している症状かなと思いました。

  • 実際に動作を見てみました。

    データフラッシュには、

    A1 ~ A8のデータを入れておき、

    高橋さまと(多分大体)同じようなプログラムで、変数にアクセス

    してみました。ES:[DE]が 0xf1006 です。0xf1006のデータを、MOVW命令で、AXにコピーしています。

    コピー結果は、0x00A7になっているので、この時点で偶数アドレスのデータは失われています。

    ハードウェアマニュアルを見ると、データフラッシュは、8ビットアクセスのみ可能とあります。MOVW命令(16ビット)でアクセスしているために、データが失われています。8ビットアクセスになる様に(=MOV命令で)アクセスする必要があると思います。

  • Yamamoto さん

    有益な情報、ありがとうございます。

    データ・フラッシュは8ビット単位でのみアクセス可能というのは、見落としていました。

    そうゆうことでしたか。

    memcpy でコピーできるとということは、CS+ の memcpy は 8bit アクセスしかしていないのでしょうかね。

    ワードバウンダリまで 8bit コピーした後ワードアクセスでコピーするというのが memcpy の良くある実装ですが...

    しかしながら、memcpy での 8bit アクセスは保証されないと思うので、別途コピー関数を作ろうと思います。

    ありがとうございました。