シリアルインターフェイス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);
   }
}
Parents Reply Children
  • シリアルアレイユニットのIIC00で表示器に文字を出したことがあります。
  • チョコです。
    以前サンプルプログラム等に書きましたが,I2Cバスでの通信はスレーブに合わせる必要があります。おそらく,表示器では,コマンドと表示データの書き込みだけで済んだのではないかと思います。(要は,単に送信していれば済んだ?)
    ところが今回のスレーブは,読み出し(受信)が必要になるので,表示器よりは一段難しくなります。
    I2C通信では,マスタはスレーブの動作に合わせた通信を行う必要があります。つまり,スレーブの通信仕様をきちんと理解するのが肝要です。

    実際のプログラムのプロジェクト・ファイルでアップしてもらえれば,具体的に問題点を指摘できるのですが。
  • 自分の出した信号を自分で受け取るループバック・プログラムを作った事は有りますか?
     書き込みを見ると、何処かからソフトをコピーして使っているだけと言う感じがします。
     基礎的な送信と受信のプログラムを作った経験が無いと、調べようが有りません。
     オシロで波形を見ても仕組みが分からなければ、相手側が受信したのかが分かりません。
     データ数が多いと、オシロで見てもデータの区切りが良く分かりません。
     それならばクロック周期を切りの良い値にすれば計測しやすいだろうとアドバイスできます。
     コネクタを抜いて切断しても波形の最後のところに変化が無ければ、相手は受信していないと判断できます。
  • ループバックの経験はないです。石は2つあるので、挑戦したいと思います。
  • チョコです。
    止めた方がいいと思います。
    通常,ループバックは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
  • >止めた方がいいと思います。
    >通常,ループバックはUARTなどで行いますが,I2Cでは不確実なもの同士を接続しても混乱が広がるだけです。

     「ループバック」と言うのが良くなかったかも知れない。言いたいのは相手が既製品で無く、送信側受信側とも自分の作ったプログラムで試験し、送信受信が思った通りに動く事をまず確立しましょうと言う事です。
  • チョコです。
    >言いたいのは相手が既製品で無く、送信側受信側とも自分の作ったプログラムで試験し、送信受信が思った通りに動く事をまず確立しましょうと言う事です。
    それで,一番苦労しました。おかしいときに,原因を絞り込む必要があるわけですが,I2Cバスはマスタとスレーブの
    両方がきちんとしていないと正常にやり取りできません。そんな時に,片方だけ確実なものがあれば,それに対して
    反対側だけをデバッグすることで,絞り込みができます(それでも仕様はきちんと理解していないとダメですが)。
    両方を同時にやってしまうと,仕様を逸脱したものができることがあり,お互いの間では通信できても,他には流用
    できないことがあります(以前ののアプリケーションノートのプログラムがそうでした)。
    と,言うことでできるだけ,きちんとしたものに合わせていくようにしています。
  • わわいです
    まー、やっぱSCLとSDAをオシロで見ながらデバッグしないとどーしよーもないってことで。。
    #そして最初に戻ると
  • 最初に戻る前に寄り道をさせて頂きます。
    イチゴのようなのでi2cをdetectするようなことをしたいです。さっと環境作れないので確認していないのですがコマ
    ンドのi2cdetecです。けっこう色々なスレーブを見つれたと思います。

    こんなかなと思い作成して見ましたがダメでした。ご指導お願いします。

    /* 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 i2cfind(void);
    /* End user code. Do not edit comment generated here */

     

     void i2cfind(void){
     int ad;
     MD_STATUS status;
     for(ad=0;ad<1024;ad++){
      buf[0]=0x05; //ENQ?
      buf[1]=0x00;
      status=R_IICA0_Master_Send((uint8_t)ad,(uint8_t *)buf, 1,(int8_t)100);
      sleep(10);
      if( status==MD_OK ){
       sprintf_tiny(data,"%04d OK ",ad);
       R_UART0_Send((uint8_t*)data,strlen(data));
       sleep(15);
      }else{
       sprintf_tiny(data,"%04d NG ",ad);
       R_UART0_Send((uint8_t*)data,strlen(data));
       sleep(15);
      }
      if((ad%6)==0){
       sprintf_tiny(data,"\n");
       R_UART0_Send((uint8_t*)data,strlen(data));
       sleep(15);
      }
     }
    }

     

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

  • チョコです。
    I2Cバスでは,スレーブアドレスの上位4ビットが0b0000と0b1111は拡張コードとして,通常のI2Cスレーブは
    存在しないはずです。通常EEPROM等は0b1010xxxが使われていますし,BMP180は通常の7ビット・アドレスの
    最後の0b1110111を使っています。
    また,10ビット・アドレスと言うことで,0~1023を指定されようとしていますが,通常の7ビット・アドレスと10
    ビット・アドレスはアドレス指定が異なります。少なくともコード生成は10ビット・アドレスには対応していません。
    通常のデバイスは殆ど7ビット・アドレスです。(10ビット・アドレスはスレーブアドレス部が0b11110xxで,最初の
    データが下位8ビット分のアドレスになるので,やり方はレジスタ・アドレスを指定するのににていますが。)
    今,RL78/G13用のプログラムをRL78/G10に移植中しています。環境が揃わないので,プログラムの移植だけに
    なりますが,本日中には何かアップできると思います。