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

     

     

     

Reply
  • チョコです。

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

     

     

     

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

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

    EEPROMが接続されているのがCSI11なので、CSI00をCSI11に置き換えて試します。
  • 教えて下さい。

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

     

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

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

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

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

     

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

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

    波形を確認したところ、ご教示いただいたように、受信時はタイプ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() 以外の初期化が足らないのでは