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
  • タカオさん、こんにちは。NoMaYと申します。

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

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

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

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

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

Reply
  • タカオさん、こんにちは。NoMaYと申します。

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

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

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

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

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

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

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

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