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単位での通信になりまよ。

     

     

     

  • > 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 でも書いておりますが大丈夫ですか?
  • チョコです。
    どこにも「R_CSI11_Start」関数を呼び出していないようです。
    なぜか,main関数の中で「R_CSI11_Create」関数を呼び出していますが,この関数は既に「R_SAU0_Create」関数で呼び出されているので不要です。もしかすると,ここが「R_CSI11_Start」関数を呼び出すべきところではないですか。
  • チョコさんへ
    下記のようにレジスタを確認しました。
    SAU0EN 0x1
    SMR03 0x0020
    SCR03 0xf007
    PM5 0xfd
    P5 0x02
    P3 0x01
    PM3 0xfc
    EEPROM専用プロジェクトと同じ値です。
  • チョコさんへ

    R_SAU0_Createの中でR_CSI11_Createが実行されているので、今はmainのR_CSI11_Createはコメントアウトしていますが、SPIのクロックがまだ出ません。
  • チョコです。
    「R_CSI11_Start」関数の呼び出しはどうなっていますか。
  • R_SAU0_Createの最後で呼び出しています。
Reply Children
  • チョコです。

    提示されたプロジェクトの中で「R_CSI11_Start」を検索した結果を示します。

    この結果を見ると,この関数を呼び出しているところが見つかりませんでした。

    「R_CSI11_Start」が呼び出されていないと,SE0レジスタのビット3が立っていないはずですので,確認してみてください。

  • 「R_CSI11_Start」関数の呼び出しはどうなっていますか。
    R_SAU0_Createの最後で呼び出しています。

    なんか、見てるもんが違う感じですね。

    r_cg_serial.c:

    void R_SAU0_Create(void)
    {
        SAU0EN = 1U;    /* supply SAU0 clock */
        NOP();
        NOP();
        NOP();
        NOP();
        SPS0 = _0000_SAU_CK00_FCLK_0 | _0000_SAU_CK01_FCLK_0;
        R_CSI11_Create();
    }
    
  • チョコです。
    >なんか、見てるもんが違う感じですね。
    はい,私もそう思います。
  • チョコです。

    わかさん,誤解されているようなので,直接記述します。

    main関数の中80行目で「R_CSI11_Create」関数を呼び出していますが,ここは,「R_CSI11_Start」関数を呼び出すところではないですか。

    (コメントアウトするのではなく,呼び出す関数を変更するのが正しい変更方法だと思います。)