シリアルインターフェイス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
  • わわいです
    まあ、ワケが分かってないのに、いくらコード生成やらなんやら使ってコードを書いた気になっても動くわけはないですな。

    IICってのは、通常のシリアルとはいろいろ考え方からして違ってくるので、オシロでSDAとSCLの波形を見て、データシートとどう違うかを見ていくのが理解には早いとは思いますです。
Reply
  • わわいです
    まあ、ワケが分かってないのに、いくらコード生成やらなんやら使ってコードを書いた気になっても動くわけはないですな。

    IICってのは、通常のシリアルとはいろいろ考え方からして違ってくるので、オシロでSDAとSCLの波形を見て、データシートとどう違うかを見ていくのが理解には早いとは思いますです。
Children
  • チョコです。
    IICはSDA信号は双方向なので,初心者がオシロの波形だけみても分からないと思いますよ。
    せいぜい,ロジアナで波形変化を逐次取り込み,前後の関係をつかめないと苦しいです。特に,スレーブの
    動作が分かっていないと,どうなっているかも分かりません。
    基本的に,どのような動きをするかを理解するのが先だと思いますよ。

  • こんなことをしてよいのか分からないのですが、プルアップ抵抗もスレーブも
    何もつけずに下のコードと設定で波形をみたら、SCLA0からはなにも出ていないです。
    石が壊れた? なにか設定ができていないのか?状態です。
    SCL00からはなにかでていました。

     static void R_MAIN_UserInit(void)
    {
        /* Start user code. Do not edit comment generated here */
     unsigned char txt[3];
        EI();
     txt[0]=0x00;
     txt[1]=0x38;
     while(1){
      R_IIC00_Master_Send(0x7C,txt,2);
      R_IICA0_Master_Send(0x7c,txt, 2,(int8_t)10);
     }
        /* End user code. Do not edit comment generated here */
    }

     

     

  • チョコです。
    IICA0の信号はN-chオープンドレイン出力でドライブします。従って,信号が抵抗でプルアップされていないとSCLA0はHighにはなりません。また,マルチマスタのためのバス調停機能(アービトレーション)があり,SDAA0信号も出力したデータと異なる状態が確認されたら,アービトレーション負けと判断して通信を中止します。
    一方,IIC00のSCL00信号は通常のCMOS出力でドライブするので,プルアップ抵抗なしでもHighを出力可能です。また,アービトレーション機能もありません。
    ここらが,影響しています。
  • わわいです
    もちっとIICについて勉強しましょう。
    通常のシリアル通信と違います。
    本来、IICのSDA、SCL の端子は双方オープンドレイン出力なので、プルアップ抵抗を付けないと波形は出ません。
    また、そのつなぐスレーブ側のデバイスの取説にIICの通信仕様というか、通信手順の説明はないでしょうか。
    スレーブアドレスやら通信手順やら、それに合わせてコードを書く必要があります。