シリアルインターフェイスIICAでデータを取得できません

ボッシュさんのBMP180 気圧センサで気温のデーターを取得しようとしているのですが、うまくいきません。
ご指導お願いします。個人的には下のコードで、パソコンの方でなにか数字がでると思っているのですが、000でした。
抵抗値か転送クロックに問題があるように思っています。よろしくお願いいたします。

 

環境
e2 studio Version:5.3.1.002 評価期間の有効期限が切れています。
RL78/G10+E2 Lite

 

周辺機能の設定の転送クロックは100000です。

抵抗は5kΩ位です。

 

/* Start user code for global. Do not edit comment generated here */
char buf[256]="";
char data[10]="";
unsigned long millisec;
void sleep(long i_end_millisecond);
void uart(void);
/* End user code. Do not edit comment generated here */ 

 

static void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    R_UART0_Start();
    buf[0]=0xF4;
    buf[1]=0x2E;
    buf[2]=0x00;
    R_IICA0_Master_Send(0xEE, (uint8_t *)buf, 2,20);
    sleep(20);
    while (1U){
        //R_UART0_Receive((uint8_t *)rx_buf,10);
     uart();
     sleep(10);
    }
    R_UART0_Stop();
    /* End user code. Do not edit comment generated here */
}
/* Start user code for adding. Do not edit comment generated here */
void uart(void){
    int i;
    R_IICA0_Master_Receive(0xEF, (uint8_t *)buf,256,20);
    for(i=0;i<256;i++){
     if((i%8)==7){
      sprintf_tiny(data,"%03d,%03d\n ",i,buf[i]);
     }else{
      sprintf_tiny(data,"%03d,%03d ",i,buf[i]);
     }
    //R_UART0_Send((uint8_t*)message,strlen(message));
    R_UART0_Send((uint8_t*)data,10);
    sleep(15);
   }
}
  • In reply to つくたろう:

    チョコです。
    以前サンプルプログラム等に書きましたが,I2Cバスでの通信はスレーブに合わせる必要があります。おそらく,表示器では,コマンドと表示データの書き込みだけで済んだのではないかと思います。(要は,単に送信していれば済んだ?)
    ところが今回のスレーブは,読み出し(受信)が必要になるので,表示器よりは一段難しくなります。
    I2C通信では,マスタはスレーブの動作に合わせた通信を行う必要があります。つまり,スレーブの通信仕様をきちんと理解するのが肝要です。

    実際のプログラムのプロジェクト・ファイルでアップしてもらえれば,具体的に問題点を指摘できるのですが。
  • In reply to つくたろう:

    チョコです。
    IICA0の信号はN-chオープンドレイン出力でドライブします。従って,信号が抵抗でプルアップされていないとSCLA0はHighにはなりません。また,マルチマスタのためのバス調停機能(アービトレーション)があり,SDAA0信号も出力したデータと異なる状態が確認されたら,アービトレーション負けと判断して通信を中止します。
    一方,IIC00のSCL00信号は通常のCMOS出力でドライブするので,プルアップ抵抗なしでもHighを出力可能です。また,アービトレーション機能もありません。
    ここらが,影響しています。
  • In reply to つくたろう:

    わわいです
    もちっとIICについて勉強しましょう。
    通常のシリアル通信と違います。
    本来、IICのSDA、SCL の端子は双方オープンドレイン出力なので、プルアップ抵抗を付けないと波形は出ません。
    また、そのつなぐスレーブ側のデバイスの取説にIICの通信仕様というか、通信手順の説明はないでしょうか。
    スレーブアドレスやら通信手順やら、それに合わせてコードを書く必要があります。
  • In reply to つくたろう:

    自分の出した信号を自分で受け取るループバック・プログラムを作った事は有りますか?
     書き込みを見ると、何処かからソフトをコピーして使っているだけと言う感じがします。
     基礎的な送信と受信のプログラムを作った経験が無いと、調べようが有りません。
     オシロで波形を見ても仕組みが分からなければ、相手側が受信したのかが分かりません。
     データ数が多いと、オシロで見てもデータの区切りが良く分かりません。
     それならばクロック周期を切りの良い値にすれば計測しやすいだろうとアドバイスできます。
     コネクタを抜いて切断しても波形の最後のところに変化が無ければ、相手は受信していないと判断できます。
  • コード生成担当の鈴木です。BMP180は使ったことがないのですが、コード生成で出力したソースだけでは、データの取得はできません。BMP180でデータを取得するにはリスタート処理が必要になります。RL78 EEPROMアクセスする方法を参考資料として掲載します。この方法で、同じようにBMP180からもデータ取得できると思われます。

  • In reply to 鈴木 康之:

    チョコです。
    鈴木さん,少しコメントさせていただきます。
    API関数の使用法で,R_IICA0_Master_Send関数やR_IICA0_Master_Receive関数の第4引数が0になって
    いるとスタート・コンディション発行処理を行ってすぐにスタート・コンディションの確認を行うことになります。
    その場合,通信クロックの位相関係によっては,エラーになることがあります。ここは,きちんとした値を
    設定しておくべきです。

    また,Start bitやStop bitと書いていて,波形もビットのイメージに書かれていますが,これはおかしいです。
    NXPの仕様書では,START conditionやSTOP conditionと記載されていて,それと異なる表記は問題です。
    SDAの波形で見ると,slave addressの送信が開始される直前にはSDAはLowになります。同様にSTOP
    conditionのところはHighが連続しているように書かれていますが,これも明確な間違いです。SCLがHigh
    の状態でSDAが立ち上がるのがSTOP conditionです。
    I2Cバスは信号波形を確認して状態をチェックするのが基本なので,こんないい加減な波形を書かれると
    こまります。

  • In reply to チョコ:

    チョコさん、指摘ありがとうございます。
    なるほど、波形イメージととらえたのですね。資料としてWEB掲載を考えているので、表記方法に注意します。(波形イメージではありません)
    関数の第4引数は、バスライン自体の容量もあるので、あえて 0 にしています。この点も注意事項の記載が必要ですね。
    以上、よろしくお願いします。
  • In reply to 鈴木 康之:

    チョコです。
    早速の回答ありがとうございます。
    >(波形イメージではありません)
    そうですか。

    >関数の第4引数は、バスライン自体の容量もあるので、あえて 0 にしています。
    容量があると,その分信号の変化が鈍るので,その分時間が延びます。ぜひ注意事項を記載して置いてください。
    個人的には,サンプルプログラム等にアップしているように,固定ループ回数まつのではなく,あくまで無限ループ
    防止用のリミッタとして,スタート・コンディション検出待ちのループの上限にすると,早く検出できれば,早く抜ける
    ことができるようにするのがいいかと思っています。
  • In reply to チョコ:

    >個人的には,サンプルプログラム等にアップしているように,固定ループ回数まつのではなく,あくまで無限ループ防止用のリミッタとして
    そうですね、資料で書き方をガイドするようにします。
    以上、よろしくお願いします。
  • In reply to 鈴木 康之:

    わわいです
    IICのヤバい(?)のは、スレーブアドレスのあとのオフセットデータが、スレーブデバイスによりバイト数が変わったり、中にはコマンドごとにオフセット部のバイト数が変わるというデバイスもあったりするところですねー
    そのおかげで、出来合いのコード持ってきてそれでOK、というのがやりにくいですね。
    そのうえ、割り込み駆動しようとすると、コマンドの送出タイミングで、ストップコンディションが出てくれなかったりと、なかなか苦労させられました。。
    #ストップコンディションが出ない、ってのは動作上正常に見えるだけにヤバい。。
    #こーゆーのはオシロで見ないとわかりませんわな。。
  • In reply to わわい:

    チョコです。
    >IICのヤバい(?)のは、スレーブアドレスのあとのオフセットデータが、スレーブデバイスによりバイト数が変わったり、中にはコマンドごとにオフセット部のバイト数が変わるというデバイスもあったりするところですねー

    これはI2Cだけではなく,SPIでも同じです。ここらは,スレーブの仕様なので,どんなI/Fでも同じようなことは起こります。
    I2Cではこれに輪をかけて,内部のレジスタアドレス(オフセット)の上位ビットがスレーブアドレスの下位の方に入る
    ことがあることです。
    どちらにしても,通信はスレーブの通信仕様に合わせることが必要です。
  • In reply to リカルド:

    ループバックの経験はないです。石は2つあるので、挑戦したいと思います。
  • In reply to 鈴木 康之:

    ページ4を拝見しているとfCLKというのがあるのですが、私のはでてこないです。
    色々なのがあるみたいですね。

  • In reply to つくたろう:

    チョコです。
    止めた方がいいと思います。
    通常,ループバックはUARTなどで行いますが,I2Cでは不確実なもの同士を接続しても混乱が広がるだけです。
    接続するなら,動作が確認されたものにすべきです。
    なお,IICA0は自分で送信した情報を同時に受信もおこなっているので,そのままでループバックしているのと
    同じになっています。

    BMP180のようにレジスタアドレスを指定してアクセスするタイプのスレーブを制御するマスタ(テストプログラム)を
    作成したことがありますが,使用したデバイスはRL78/G13でRL78/G10とは機能が異なるので,そのままでは動作
    しません。イメージ的には,以下のアプリケーションノートのRL78/I1DのIIC00をRL78/g13のIICA0に変更したものです。
    ANの「5.6.15 RAM からのデータ受信」で説明しているg_iic_get_data ()関数が参考になるかと思います。

    www.renesas.com/.../r01an3288jj0100-rl78i1d.pdf
  • In reply to チョコ:

    >止めた方がいいと思います。
    >通常,ループバックはUARTなどで行いますが,I2Cでは不確実なもの同士を接続しても混乱が広がるだけです。

     「ループバック」と言うのが良くなかったかも知れない。言いたいのは相手が既製品で無く、送信側受信側とも自分の作ったプログラムで試験し、送信受信が思った通りに動く事をまず確立しましょうと言う事です。