シリアルインターフェイス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 NoMaY:

    チョコです。
    IICA0については,コード生成のR_IICA0_Create関数をr_iic_lib.cの中に組み込み,コード生成ではIICA0は使用しないようにしてください。その上で,R_MAIN_UserInitからR_IICA0_Create関数を呼び出せば,IICA0は問題ありません。ただし,R_IICA0_Create関数のプロとタイmpu宣言は追加してください。
    UART関係はr_uart0_lib.cとr_uart0_lib.hをプロジェクトから外して,全てコード生成にしてください。
    これで,コード生成をそのまま使えるはずです。
    (IICA0については,コード生成がリスタートに対応できていないので,今回のように全く別定義にするのがいいでしょう。これ以外にTM03も使っていますが,割り込みは使用せず,直接ハードを操作してポーリングしているので,コード生成で初期設定してあるだけで十分です。)
  • In reply to チョコ:

    チョコです。

    IICA0関係のヘッダファイルのマクロ定義等もコピーしないといけませんでした。

    ついでに,インターバルタイマ関係も割り込み処理がr_cg_main.cで定義していたので,コード生成のインターバルタイマの割り込みを使用しないに変更しました。

    なぜ,IICA0の初期設定がコード生成を利用していたかを思い出しました。通信速度を自由に設定するためにコード生成を使っていました。

    一応,ここらを修正したプロジェクトを作ってみました。

     

     

    ビルドまではやってみましたが,十分に返答ができているかは不明です。

     

    RL78G10_IICA0_rev3.zip

  • In reply to NoMaY:

    しっかりと画像も見えています。インポートもできました。
    転送クロックfscl=100000bpsだとSCLは5μsで0Vと3.3Vになるのだと思うのですが、ずっと3.3Vのままです。
    配線し直したりゴニョニョしてみます。
  • In reply to つくたろう:

    つくたろうさん、こんにちは。NoMaYです。

    もしかしたら、、、と気になったのですが、今回のチョコさんのプロジェクトのmain関数は以下のようになっていて、よく見るとループしてないです。

    void main(void)
    {
        R_MAIN_UserInit();
        /* Start user code. Do not edit comment generated here */
      {

        uint8_t status;

    /* readr EEPROM */
        status = g_IIC_get_wdata( BMP180, A_AC5, &g_AC5 );
        if ( 0x00 == status )
        {
            status = g_IIC_get_wdata( BMP180, A_AC6, &g_AC6 );
            status = g_IIC_get_wdata( BMP180, A_MC, &g_MC );
            status = g_IIC_get_wdata( BMP180, A_MD, &g_MD );

    /* start temperature measurement    */
            status = g_IIC_get_temp( &g_UT );
        }

      }
        /* End user code. Do not edit comment generated here */
    }

    つくたろうさんwrote:
    インポートもできました。
    転送クロックfscl=100000bpsだとSCLは5μsで0Vと3.3Vになるのだと思うのですが、ずっと3.3Vのままです。[引用終]
  • In reply to つくたろう:

    チョコです。
    今,外出から戻ってきました。
    IICA0の各レジスタの値はどうなっていますでしょうか。
    そこらが,問題を解決するヒントになるはずです。

    追伸

    変数の中がどうなってるかもチェックしてください。

  • In reply to NoMaY:

    チョコです。
    先ほど外出から戻ってきました。

    はい,これは,どうやってIICA0を使うかを示すためなので,それ以上は作っていません。
    元々,参考にしてもらうだけで作成したものです。

    最初の3つのg_IIC_get_wdataで温度の計算に使用するパラメータを読み出して,その後の,
    g_IIC_get_tempでg_UTに温度データを読みだしてきているだけです。後はこれらのデータを
    どう使うかです。
    基本的に,計算で使用するパラメータは固定値なので,温度データの読み出しを含むループを
    作る(ここらはつくたろうさんが作成する部分だと思います)ことになります。
  • In reply to NoMaY:

    チョコです。

    NoMaYさん,つくたろうさん,

    今回のIICA0を制御するライブラリの簡単な説明書を作ってみました。これを参考にしてプログラムを見てもらえれば,理解し易いかと思います。

    要は,main関数の中は自分でやってねと言うことです。

     

    IICA0ライブラリの解説.pdf

  • In reply to チョコ:

    チョコさん、どうもありがとうございます。NoMaYです。

    今、説明書を読ませて頂いているところです。

    チョコさんwrote:
    今回のIICA0を制御するライブラリの簡単な説明書を作ってみました。これを参考にしてプログラムを見てもらえれば,理解し易いかと思います。[引用終]
  • In reply to チョコ:

    色々とご指導ありがとうございます。

    ただ、うまくいかないです。106行目の status が0x82です。
    ところで、下記資料の24頁の6.2.8の「または」が気になります。もしかして対応していないのでしょうか。
    www.renesas.com/.../r20ut3964jj0100-csrn.pdf

  • In reply to つくたろう:

    チョコです。
    statusが0x82と言うことはスタート・コンディションが発行できなかったことを示しています。
    何もしていない状態で,SDA信号線がHighになっているかを確認してください。
    ついでに,IICS0,IICF0レジスタの内容も確認してください。
    参照された資料に書いてあるようなことは使っていません(今回の処理では無関係です)。
  • In reply to チョコ:

    r_cg_main.cの132行目のIIC_TM03_init();の辺りで16番が、High、IICS0=0x00、IICF0=0x03です。
    119行目付近でstatus=0x82、IICS0=0x00、IICF0=0x03です。
    ご指導お願いいたします。
  • In reply to つくたろう:

    チョコです。
    どうも,最新のコード生成の吐き出した初期化プログラムがディグレードしてしまったようです。
    (マニュアルが間違えているのが原因かもしれません。)

    r_iic_lib.cに取り込んだR_IICA0_Create関数を一部変更してみてください。89と90行目が
    P0 |= 0xC0U;
    PM0 |= 0xC0U;
    となっていますが,これを以下のように変更して下さい。
    PM0 |= 0xC0U;
    P0 &= 0x3FU;
  • In reply to チョコ:

    つくたろうさん、こんにちは。(Cc: チョコさん) NoMaYです。

    たぶん、つくたろうさんが使っているのは、まだ、RL78G10_IICA0_rev2.zipを基にしたRL78G10_IICA0_rev2_for_e2.zipだと思いますので、そうであれば、cg_src\r_cg_iica.cの中のR_IICA0_Create関数を変更して下さい。

    昨晩、(CS+で、ひとまずBMP180の事は脇において、取り敢えずコード生成させたものを、素朴にそのまま使って)G10のシミュレータでIICA0を試してみようとしていたのですが、動き出す気配が全く無くて頭を抱えていたところでした。(G13のシミュレータで試してみるとあっさりと動く。) 今朝、チョコさんの書き込みを読んで該当部分のコードを変更して試したら、あっさりとG10のシミュレータで動き出しました。(といっても、今までSCLA0もSDAA0も全く出なかったのが、ひとまず出るようになったことを確認出来た、という段階ではありますが。)

    コード生成も間違っているし、マニュアルも間違っているし、ではどうにもこうにも、、、ですね。

  • In reply to NoMaY:

    チョコです。
    NoMaYさん,そう,困ったものです。
    最初は,RL78/G10 V1.04.02.01[15 May 2015]版のコード生成で動作させていたものを,今回[11 Nov 2016]版で
    生成したものにしただけだったので,気にしていませんでした。
    つくたろうさんの症状が全く動作していないようだったので初期設定を疑ってみたら,今回の問題が見つかりました。
    基本的にIICAはポートとOR接続されるので,P07とP06は0にするはずが,1になっていたのでおかしいと思って
    マニュアルを見ていたら,そちらも「表4-5 端子機能使用時のレジスタ,出力ラッチの設定例(2/4)」のP06とP07の
    Pmが1になっていたので,これが原因かと推測しています。同じマニュアルでもIICA0のブロック図は正しいので,
    何かの原因で図にミスが作りこまれ,コード生成がそれを見ておかしくなったのではと想像しています。
  • In reply to チョコ:

    今までと挙動が変わりました。ありがとうございます。いい感じです。

    ただコード生成で作られるファイルr_cg_iica.cのvoid R_IICA0_Create(void)で
    /* Start user code for adding. Do not edit comment generated here */
    PM0 |= 0xC0U;
    P0 &= 0x3FU;
    /* End user code. Do not edit comment generated here */
    ということはできないみたいですね。