Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

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

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

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

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

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

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

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

    チョコです。

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

     

     

     

  • In reply to チョコ:

    チョコ先生 NAKAです。
    なるほど、最初に入れる0の数で8の倍数に調整するんですね!Microwireっていうのを使ったことが無かったので知りませんでした。勉強になります!_(._.)_
    wikiで調べると、速度も遅いし、4本も信号線が必要だし、少し古い規格なんですかね?今後もこのI/Fを使った製品がでてくるのかな?
    内臓データ・フラッシュを使わずに、外付けEEPROMを使うメリットって何かあるのでしょうか?
    フラッシュはブロック毎にしか消去できないとか?消去可能回数は1000000回くらいで同じでした。
  • In reply to チョコ:

    チョコさん

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

    EEPROMが接続されているのがCSI11なので、CSI00をCSI11に置き換えて試します。
  • In reply to わか:

    教えて下さい。

    チョコさんに教えていただいた情報を元にプログラムを作成しました。

     

    結果として、読み込みを行うと、書き込んだ値から1bitずれた状態で読み込まれます。

    0x1111を書き込んで0x0x0888が読み込まれる。

    今はクロックの位相選択は4でタイプ1でも同じです。

    タイプ2と3だとまともに読めません。

     

    原因は何が考えられますでしょうか?

  • In reply to わか:

    チョコです。
    アプリケーションノートの「図 5.2 READ 命令実行時のタイミング」の上に書かれている以下の説明がヒントになるんじゃないでしょうか。
    「本来であれば命令3 バイト目から位相をタイプ4 からタイプ2 に変更するのが正しい方法ですが、AT93C46D の出力遅延時間が最大で250ns であり、CSI00 のホールドタイムに比べて十分大きいことを考慮し、本アプリケーションでは位相タイプ4 のまま送受信を継続させております。」
  • In reply to チョコ:

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

    波形を確認したところ、ご教示いただいたように、受信時はタイプ2でないと
    タイミングが合わないようです。
    SCRレジスタはいつ変えても問題ないのでしょうか?
  • In reply to わか:

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

    チョコさん

    ありがとうございます。

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

    ありがとうございます。
  • In reply to わか:

    チョコです。
    わかさん,ご報告有難うございます。
    うまく動いてよかったですね。
  • In reply to チョコ:

    チョコさんへ
    EEPROMの読み書き専用に作成したプロジェクトでは読み書きできるようになったのですが、
    本番のプログラムに移植したところ、全く動きません。

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

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

    原因は何が考えられますでしょうか?
  • In reply to わか:

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

    R_SAU0_Create() 以外の初期化が足らないのでは
  • In reply to fujita nozomu:

    情報足らずで申し訳ありません。

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

    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取得(割込み含む)等は動作しています。
  • In reply to わか:

    SPIが動作しないソースを添付します。

     

    MOTOR-RL78_20191121-send.zip

  • In reply to わか:

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

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page