シリアルインターフェイス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);
   }
}
  • つくたろうさん、こんにちは。

    今回の件についてではなくて申し訳ないのですが、UARTはうまく動いたでしょうか?(ちょっと気掛かりだったので。)

  • パソコン側では、データーを受けています。UARTは、動作しているように思っています。

    ただUARTの理解という点では、人間で言うとコミュニケーションはできません。
    一方的にマイコンが話しまくっている感じですね。

  • マイコン側での受信は試す機会がなかったということですね。なんにせよ、前回のスレッドでの、やりたかったことは大丈夫だったようで、なによりです。(茶々を入れてすみません。)

  • 目標は

    という感じです。
    でもワンパターンだったらRL78くんに勝手にしてもらうつもりです。

  • 手書きの回路図ではSCL,SDAの結線が逆ですよ。
  • チョコです。

    基本的にコード生成されたライブラリの使い方を間違えています。
    まず,スレーブアドレスですが,右シフトするのは間違いです。RL78では,送信されるスレーブアドレスと同じく
    上位7ビットでスレーブを指定するので,0xEEをそのまま指定するだけです。
    R_IICA0_Master_Receive等の関数はスレーブアドレスの送信を開始しただけで戻ってきます。関数から戻って
    来た段階ではまだ何も通信されていませんので,受信したデータを処理しても無意味です。
    (これは,IICだけでなくUARTも同様です。

    どうも,ここらを誤解されている人が多いようなので,サンプルソフト等にコード生成された関数の使い方の例を
    追加していこうと思います。
  • 了解しました。配線と図面訂正しましたが、うまくいきませんでした。
  • R_IICA0_Master_Receiveはstatic void R_MAIN_UserInit(void)のwhileの前あたりということでしょうか?
  • チョコです。
    >R_IICA0_Master_Receiveはstatic void R_MAIN_UserInit(void)のwhileの前あたりということでしょうか?
    いいえ,違います。R_IICA0_Master_Receive関数を呼び出したら,通信完了まで待つ必要があります。
    コード生成のAPI関数でみると,r_cg_iica_user.cの中に,IICの通信完了割り込みでiica0_masterhandler
    を呼び出しています。ここで,指定した数のデータの受信が完了したらr_iica0_callback_master_receiveend
    という関数が呼ばれるので,そこで,受信完了のフラグをセットし,それを確認すべきです。
    先ほど,BMP180 のデータシ-トを確認しましたが,スレーブアドレスは0xEEをそのまま使用するのが正解です。
    また,結果の読み出しは,単にBMP180を読み出すだけではだめなようです。データシートのFig9を参照すると,
    読み出すレジスタのアドレスを0xF6に設定後,リスタートしてR/Wを1にして選択して上位下位の順で読み出す
    ようです。
    ただし,コード生成のオリジナルのコードではリスタートに対応できていません。BMP180がリスタートでなく,
    ストップコンディション+読み出しで動作するなら,読み出せるかもしれません。
    この問題があるので,私のサンプルコードではIICはコード生成のAPIは使用していません。具体的には,
    サンプルコード等の「IICマスタ(RL78/G13版)」,「IIC通信のマスタ側(RL78/G12) 」などを参照してください。

    japan.renesasrulz.com/.../287
    japan.renesasrulz.com/.../284
  • チョコです。
    つくたろうさん,BMP180のデータシートをもう少し読んでみました。その中で,さらに読み出しに問題が見つかりました。
    BMP180からのデータは16ビットのデータが1個だけです。これが,上位8ビット,下位8ビットの順で送信されます。精度を拡張すると19ビットになり,さらにその後に下位のデータが追加されるようです。
    ここらをサンプルプログラム等に「シリアル通信でのデータ制御方法」で書き込んでおきました。
    japan.renesasrulz.com/.../339