シリアルインターフェイス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
  • コード生成担当の鈴木です。BMP180は使ったことがないのですが、コード生成で出力したソースだけでは、データの取得はできません。BMP180でデータを取得するにはリスタート処理が必要になります。RL78 EEPROMアクセスする方法を参考資料として掲載します。この方法で、同じようにBMP180からもデータ取得できると思われます。

  • チョコです。
    鈴木さん,少しコメントさせていただきます。
    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バスは信号波形を確認して状態をチェックするのが基本なので,こんないい加減な波形を書かれると
    こまります。

Reply
  • チョコです。
    鈴木さん,少しコメントさせていただきます。
    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バスは信号波形を確認して状態をチェックするのが基本なので,こんないい加減な波形を書かれると
    こまります。

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

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