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);

}
Parents
  • while(!RIIC0.ICSR2.BIT.TDRE)のループ自身、3個ありますが、どこで引っ掛っているか?確認された方が良いかと思います。

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

    あと、「EEPROM 未実装の開発ボード」ですと、スレーブ側(EEPROM)からのACK応答が無いので、進めていくうちに問題となってくると思います。
Reply
  • while(!RIIC0.ICSR2.BIT.TDRE)のループ自身、3個ありますが、どこで引っ掛っているか?確認された方が良いかと思います。

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

    あと、「EEPROM 未実装の開発ボード」ですと、スレーブ側(EEPROM)からのACK応答が無いので、進めていくうちに問題となってくると思います。
Children
  • 吉光屋の次男坊吉光屋の次男坊さん
    情報ありがとうございます。

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

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