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

RX130でのI2C通信

はじめまして。

RX130を使用してI2C通信でEEPROMと通信を行いたいのですが、

参考になるサンプルが見つからずマニュアルをもとに作成したソフトも動かず苦戦しています。

 

ひとまずEEPROM未実装の開発ボードを使って、

マスタとなるRX130からSCLとSDAの信号が送信されているところまで確認したいのですが、SCLとSDAはハイのままです。

どうもwhile(!RIIC0.ICSR2.BIT.TDRE)のループから抜け出せていないようです。
SCLとSDA(P16,P17)から信号が出力されるところまでひとまず確認したいのでご指摘等お願いします。
 
↓メインコード
#include < machine.h>
#include "iodefine.h"

//******************************************
//  WDTリセット
//******************************************
void HmWDTRst(void)
{
    IWDT.IWDTRR = 0x00 ;            // IWDTRR
    IWDT.IWDTRR = 0xFF ;
}

/*********EEPROMのデータ変更**********/
int HmEepWrite(char*p,int n)
{
    char *q;
    int ret=-1;

    while(RIIC0.ICCR2.BIT.BBSY);    //BBSY=0待ち
    RIIC0.ICCR2.BIT.ST = 1;             //開始条件発行

    if(RIIC0.ICSR2.BIT.NACKF==0){           //NACK未検出
        while(!RIIC0.ICSR2.BIT.TDRE);       //ICDRTレジスタに送信データなし
        RIIC0.ICDRT = 0xA2;         //Write

        while(!RIIC0.ICSR2.BIT.TDRE);   //ICDRTレジスタに送信データなし

        q=p+n+1;        //番地2byte+データnbyte-1
        while(p<q)
        {
            RIIC0.ICDRT=*p++;               //EEPROMへ番地とデータ送信
            while(!RIIC0.ICSR2.BIT.TDRE);   //ICDRTレジスタに送信データなし
        }
        RIIC0.ICDRT=*p;             //EEPROMへ最後のデータ送信
        while(!RIIC0.ICSR2.BIT.TEND);       //データ送信終了
        ret=-1;
    }
    RIIC0.ICSR2.BIT.STOP = 0;       //ストップコンディション未検出
    RIIC0.ICCR2.BIT.SP = 1;         //停止条件発行
    
    while(!RIIC0.ICSR2.BIT.STOP);   

    //次の通信のための処理
    RIIC0.ICSR2.BIT.NACKF = 0;      //NACK未検出
    RIIC0.ICSR2.BIT.STOP = 0;   

    return ret;
}

//******************************************
//  MPU 初期化
//******************************************
void HmMpuInit()
{
    SYSTEM.PRCR.WORD = 0xA50F ;         // プロテクト解除

    //*************************
    // クロック設定
    //*************************
    SYSTEM.SCKCR.LONG = 0x30000003 ;    // FCK:8分周、ICLK:1分周、PCKB:1分周、PCKD:8分周
    while (SYSTEM.SCKCR.LONG != 0x30000003)
    {
        // 正しくかけるまで待つ
    }

    SYSTEM.SCKCR3.WORD = 0x0200 ;           // クロックソース メインクロック選択
    while(SYSTEM.SCKCR3.WORD != 0x0200)
    {
        // 正しくかけるまで待つ
    }

    //*************************
    //  I/Oピンの設定
    //*************************
    PORT1.PDR.BYTE = 0x00 ;             // ポート1 

    PORT1.PCR.BIT.B6=1; //プルアップ
    PORT1.PCR.BIT.B7=1; //プルアップ

    //*************************
    // ウォッチドッグタイマ:IWDT
    //************************* 
    IWDT.IWDTCR.WORD = 0x3303 ;         // ウィンドウなし, 分周なし, 2048/15000=136.5ms (IWDTCLK 15KHz固定)
    IWDT.IWDTRCR.BIT.RSTIRQS = 1 ;      // リセット出力
    IWDT.IWDTCSTPR.BIT.SLCSTP = 1 ;     // カウント停止有効
    IWDT.IWDTSR.WORD &= 0x3FFF ;        // エラークリア

    SYSTEM.ILOCOCR.BIT.ILCSTP = 0 ;         // IWDT用オンチップオシレータ スタート

    //*************************
    // モジュール初期化:I2C
    //*************************
    SYSTEM.MSTPCRB.BIT.MSTPB21 = 0; //I2Cモジュールスタンバイ解除
    MSTP(RIIC0) = 0;                //RIIC0動作

    RIIC0.ICCR1.BIT.ICE = 0;    //初期設定中はRIIC0を停止
    RIIC0.ICCR1.BIT.IICRST = 1; //RIIC0内部リセット
    
    RIIC0.ICMR1.BIT.MTWP = 1;
    RIIC0.ICCR2.BIT.TRS = 1;
    RIIC0.ICCR2.BIT.MST = 1;

    RIIC0.ICSER.BIT.SAR0E=0;
    RIIC0.ICSER.BIT.GCAE=0;     //ジェネラルコードアドレス無効    
    RIIC0.SARU0.BIT.FS = 0;     //7ビットアドレス
    RIIC0.ICMR1.BIT.CKS = 0;    //PCLK/16
    RIIC0.ICBRL.BYTE =0xF9;
    RIIC0.ICBRH.BYTE =0xEB;

    RIIC0.ICMR2.BYTE = 0;
    RIIC0.ICMR3.BIT.ACKWP=1;

    //RIIC0.ICFER.BYTE=0x10;
    //RIIC0.ICIER.BYTE=0xFE;

    RIIC0.ICCR1.BIT.IICRST = 0; //RIIC0内部リセット解除

    RIIC0.ICCR1.BIT.ICE = 1;    //RIIC0機能


    MPC.P16PFS.BIT.PSEL=0x0F;
    MPC.P17PFS.BIT.PSEL=0x0F;
    // PORT1.PDR.BIT.B6=0;
    // PORT1.PDR.BIT.B7=0;
    PORT1.PMR.BIT.B6=1;
    PORT1.PMR.BIT.B7=1;

    SYSTEM.PRCR.WORD = 0xA500;  // プロテクト
}

//******************************************
//  メイン処理
//******************************************
void main(void)
{
    char rxbuf[19] ;

    HmMpuInit() ;               // MPUの設定   

    HmWDTRst();                 // WDTスタート

    HmEepWrite(&rxbuf[8],2);

}
  • サンプルですが、新しめのRXではスマートコンフィギュレータやFITを使ったものばかりなので、慣れていないと戸惑いがちです。でもやり方をマスターすれば、後は楽ができます。

    古めのRXのサンプルなら、もう少しシンプルなものがあります。
    「R01AN0637JJ0100 RX62T グループ RIIC による EEPROM との通信」
    RX62Tのページからソースとドキュメントがダウンロードできます。
    この頃のRXはレジスタのプロテクトがなかったはずなので、RX130に転用するには、若干の追加が必要です。RIICの基本的な使い方はそれほど変わらないはずです。
  • while(!RIIC0.ICSR2.BIT.TDRE)のループ自身、3個ありますが、どこで引っ掛っているか?確認された方が良いかと思います。

    ただ、Higetaka さんが仰っているとおり、スマートコンフィギュレータやFITの使い方をマスターした方が良いと思います。
    RX130 のサンプルに
    「RXファミリ I2Cバスインターフェース(RIIC)モジュール FIT」
    が有りますので、Higetaka さんが紹介されたサンプルと合わせて読まれてはいかがでしょう。
    www.renesas.com/.../rx130.html
    で「マイクロコンピュータの周辺」ー「通信機能」ー「I2Cバス」だけチェックをいれて検索すると、7件ヒットし、その中にあります。)

    あと、「EEPROM 未実装の開発ボード」ですと、スレーブ側(EEPROM)からのACK応答が無いので、進めていくうちに問題となってくると思います。
  • タカオさん、こんにちは。NoMaYと申します。

    先程のHigetakaさん、吉光屋の次男坊さんのリプライにもありましたが、RXスマートコンフィグレータというツールがあり、それを使うとRXマイコン内蔵周辺機能操作ドライバソースコードを生成することが出来て、楽が出来ます。ちょっとお尋ねしたいことがあるのですが、スマートコンフィグレータは御存知でしょうか?

    例えば、(A4,A5,A6はちょっと私の書き過ぎかなとは思いますが)

    (A1) スマートコンフィグレータの存在を全く知らない
    (A2) スマートコンフィグレータの名前だけは知っているがそれ以上は知らない
    (A3) スマートコンフィグレータの製品ページを見たことはあるがそこまで止まりである
    (A4) スマートコンフィグレータをダウンロード/インストールしたがその先が分からない(e2 studioでは最初からインストール済)
    (A5) スマートコンフィグレータで生成したコードを使ってマイコンを操作したことはあるがIICではコード生成したことが無い
    (A6) スマートコンフィグレータでIICのコードを生成させたものの使い方が分からない

    (A7) スマートコンフィグレータの存在は知っているが今回は使わないでやりたい

    ですと、どれになるでしょうか?

  • In reply to Higetaka:

    Higetakaさん
    情報ありがとうございます。
    スマートコンフィギュレータの存在を知らなかったので触ってみました。
    結果、サンプルソースが出力できて開発ボードでSCLとSDAの出力も確認できました。
    動くコードが分かればこっちのものですね。紹介していただいたドキュメントを見つつ本番基板でがりがりデバッグしていきます。

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

  • In reply to 吉光屋の次男坊:

    吉光屋の次男坊吉光屋の次男坊さん
    情報ありがとうございます。

    while(!RIIC0.ICSR2.BIT.TDRE)は一番最初の部分で引っかかってました。
    設定がうまくいってなくてTDREが変化していないと推測しました。

    スマートコンフィギュレータを使ってみたら、サンプルソースができて開発ボードでSCLとSDAの出力も確認できました。
    ここまでくればEEPROMが実装された本番基板で試せそうです。
  • In reply to NoMaY:

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

    質問時は(A1) だったんですが、調べながら使ってみて何とかSCLとSDAの出力が確認できるコードを作ることができました。

    動くコードが手に入ればそのコードを読んで理解すれば何とかなりそうです。

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