RL78/G13のSPIでEEPROMの読み書き

RL78/G13のSPI(CSI)でEEPROMをお読み書きしたいのですが、接続しているEEPROM(BR93L46F)は

起動時書き込み禁止になっており、書き込み許可をする動作が必要です。

一旦CSIの機能をI/Opポートに変えて、書き込み許可処理をした方がいいのでしょうか?

サンプルプログラムはありますでしょうか?

アセンブラがわからないので、C言語だけで実現したいです。

Parents
  • わかさん NAKAといいます。
    ちょっとだけデータシート見たんですけど、SPIでも、ポートでパタパタしてもコマンド送るだけなのでどちらでも良さそうですが、このEEPROM、MicrowireBUSってなんか中途半端なデータ長で、G13(すいません!G14のデータシートみてます)のSPIだとデータ長は7byteか8byteなので結構めんどくさそうですね。僕なら、全部ポートパタパタしちゃいそう。いっそG13の中のデータ・フラッシュメモリを使ったらだめなんでしょうか?
  • チョコです。

    MicrowireBUSのEEPROMについてはRL78/G13でアプリケーション・ノートが出ていました。

    「RL78/G13 Microwire 通信によるEEPROM 制御 CC-RL 」

    https://www.renesas.com/jp/ja/software/D3017572.html

     

    これは,CC-RLを用いてAT93C46Dを制御しているものですが,使えるかと思います。

    NAKAさん,

    Microwireでは,最初の1のデータをスタート・ビットとしているので,その前に必要な数だけ0のデータを送れば,8bit単位での通信になりまよ。

     

     

     

  • 情報ありがとうございます。

    波形を確認したところ、ご教示いただいたように、受信時はタイプ2でないと
    タイミングが合わないようです。
    SCRレジスタはいつ変えても問題ないのでしょうか?
  • チョコです。
    >SCRレジスタはいつ変えても問題ないのでしょうか?
    「SCRmnレジスタは,動作中(SEmn = 1のとき)の書き換えは禁止です。」とハードウェア マニュアルに記載されているので,STmレジスタでチャネルの動作を停止してから,SCRレジスタを変更し,SSmレジスタでチャネル動作を再開してください。受信が完了したら,再度動作を停止してSCRレジスタをタイプ4に戻してから動作を再開することになるかと思います。
  • チョコさん

    ありがとうございます。

    割込み処理の読み書き関数を3バイト目以降をタイプ2に変更することにより正常に読めるようになりました。

    ありがとうございます。
  • チョコです。
    わかさん,ご報告有難うございます。
    うまく動いてよかったですね。
  • チョコさんへ
    EEPROMの読み書き専用に作成したプロジェクトでは読み書きできるようになったのですが、
    本番のプログラムに移植したところ、全く動きません。

    r_cg_serial.c とr_cg_serial_user.cのファイル自体をコピーをして、関数もファイル化して
    移植したのですが、SIO11にデータを書き込んだらクロック等が発生すると思うのですが、
    SIO11に書き込んでもクロック等が発生しません。

    SPI自体が動いていないようです。
    R_SAU0_Create();を実行はされています。

    原因は何が考えられますでしょうか?
  • > SPI自体が動いていないようです。
    > R_SAU0_Create();を実行はされています。
    >
    > 原因は何が考えられますでしょうか?

    R_SAU0_Create() 以外の初期化が足らないのでは
  • 情報足らずで申し訳ありません。

    下記のように初期設定をしています。

    void R_Systeminit(void)
    {
    volatile uint32_t w_count;

    PIOR = 0x00U;
    R_CGC_Get_ResetSource();
    R_CGC_Create();
    R_PORT_Create();
    R_SAU0_Create();
    R_ADC_Create();
    R_TAU0_Create();
    R_INTC_Create();

    IAWCTL = 0x00U;
    /* Start data flash control */
    DFLEN = 1U;
    for (w_count = 0U; w_count < 3U; w_count++)
    {
    NOP();
    }
    /* End data flash control */
    }

    タイマー割込みやAD取得(割込み含む)等は動作しています。
  • SPIが動作しないソースを添付します。

     

    MOTOR-RL78_20191121-send.zip

  • チョコです。
    CSI11関係のレジスタがどうなっているかを確認してください。
    一番基本は,PER0レジスタのSAU0ENビットが1になっているかどうかです。
    CSI11であれば,SMR03,SCR03,のレジスタの設定を確認し,SE0,SOE0レジスタのビット3を確認してください。
    あとは,兼用になっているポートの設定も確認してください。
  • > SPIが動作しないソースを添付します。

    japan.renesasrulz.com/.../33671 でも書いておりますが大丈夫ですか?
Reply Children
No Data