ads1115から正常にデータ取得できない件について

いま上記のプログラムでads1115とセンサを接続して通信を行っているのですが

実行してデバックコンソールを見るとstartと0しか表示されておらずセンサの値が取得できません。

どなたか原因がわかる方がいらっしゃったら教えていただけるとありがたいです。

Parents
  • チョコです。
    別のスレッドにもコメントしましたが、R_Config_RIIC0_Master_Send関数とR_Config_RIIC0_Master_Receive関数の使い方を間違えています。
    これらは、通信を起動するだけで、通信の完了は待ちません。従って、通信が完了するのをプログラムで待つ必要があります。このためには、通信完了フラグを準備しておき、r_Config_RIIC0_callback_receiveend関数とr_Config_RIIC0_callback_transmitend関数でこのフラグをセットするようにします。また、R_Config_RIIC0_Master_Receive関数とR_Config_RIIC0_Master_Send関数をお呼び出した後は、このフラグをクリアしてから、フラグがセットされるのを待つようにしてください。
  • チョコさん、回答ありがとうございます。

    R_Config_RIIC0_Master_Send関数とR_Config_RIIC0_Master_Receive関数が通信を起動させるだけのものだということはわかりました。では実際に通信自体はどのタイミングでおこなわれるのでしょうか?

    何度もすみません、よろしくお願いします。
  • たむらさん簡単なことですよ、
    r_Config_RIIC0_callback_transmitend()
    {
    flg=1;
    }
    としておき
    R_Config_RIIC0_Master_Send();
    flg=0;
    while(!flg);
    ここ送信完了
  • チョコです。
    通信を起動するというのは、(引数で示された通信パラメータを保存し、)スタート・コンディションに続けてRIIC0にスレーブ・アドレスを書き込むことです。RIIC0はスレーブ・アドレスの送信を開始します。以降は全てRIIC0(ハードウェア)の動作で、ソフトウェアは、RIIC0からの割り込みでの処理となります。
    スレーブ・アドレスの通信が完了したら、RIIC0から割り込みが発生するので、そこで、通信パラメータに従った通信を行います(バッファからデータを読み出してRIIC0に書き込むことでデータを送信したり、RIIC0にデータ受信を指示することで、データ受信を起動したりします)。
    RIIC0から割り込みが発生し、引数で示された通信が全て完了していたら、r_Config_RIIC0_callback_receiveend関数かr_Config_RIIC0_callback_transmitend関数が実行されます。
    これらの関数でフラグをセットするようにしておけば、通信が終わったことが確認できます。
  • IKUZOさん、回答ありがとうございます。

    おっしゃられた通りにプログラムを組んだのですが
    while(!flg);の部分でループしてしまいます。
    原因はわかりますでしょうか?
    よろしくお願いします。以下がメインのプログラムです。

    #include "r_smc_entry.h"
    #include <stdio.h>
    #include <stdlib.h>
    void main(void);

    extern volatile uint8_t flgt;
    extern volatile uint8_t flgr;

    extern volatile uint8_t g_riic0_tx_buf[4];
    extern volatile uint8_t g_riic0_rx_buf[2];
    extern volatile uint16_t val;
    void main(void)
    {


    R_Config_RIIC0_Start();

    R_Config_RIIC0_Master_Send(0x48, (uint8_t *)g_riic0_tx_buf,3);
    flgt=0;
    while(!flgt);

    R_Config_RIIC0_Master_Receive(0x48,(uint8_t *)g_riic0_rx_buf,2);
    flgr=0;
    while(!flgr);
    printf("%x,\n",g_riic0_rx_buf[0]);



    }
  • チョコさん、回答ありがとうございます。

    R_Config_RIIC0_Master_Send();とかの関数ではスレーブアドレスしか通信は行わず、
    それ以降の引数の通信は割り込みで発生する関数で行われるという認識でよろしいでしょうか?

    また、通信完了フラグのセットするときとしないときの違いがまだイメージできていないのですが
    そこはどうゆう違いが生じるのでしょうか?
    よろしくお願いします。
  • チョコです。

    >R_Config_RIIC0_Master_Send();とかの関数ではスレーブアドレスしか通信は行わず、
    >それ以降の引数の通信は割り込みで発生する関数で行われるという認識でよろしいでしょうか?
    はい、そのように考えてください。

    >また、通信完了フラグのセットするときとしないときの違いがまだイメージできていないのですが
    割り込み処理の方は、通信するデータ数が完了したかどうかはわかっているので、フラグをセットすることはできます。
    一方、main処理からは実際の処理は割り込みで行われているので、どうなっているかが分かりません。次の処理を行うには、直前の通信が終わったことを確認する必要があり、そのためにフラグを使うと、main処理でも通信が終わったことが分かるので、次の通信を起動することができます。
  • チョコさん、回答ありがとうございます。

    プログラムの流れはわかりました。IKUZOさんの返信でも書いたのですが
    while(!flg);の部分でループするということは通信が完了していないということでよろしいでしょうか?
    また、そうだった場合何が原因か調べたのですが解決できなかったので
    教えていただけるとありがたいです。

    よろしくお願いします。
  • チョコです。
    >while(!flg);の部分でループするということは通信が完了していないということでよろしいでしょうか?
    はい、そうです。元々、フラグを追加したのが通信完了を確認するためです。フラグが立っていないのは通信が完了していないからです。

    >また、そうだった場合何が原因か調べたのですが解決できなかったので
    I2Cに限らず、通信はそれなりの時間が必要です。ファスト・モードで400kbpsの速度でスレーブ・アドレスを送るだけでも、22.5μsかかります。さらに1バイトのデータを送ると22.5μs合計で45μs程度かかります。ここまでは正常です。
    I2Cバスでエラーが発生するのは、スレーブ・アドレスに対してACK応答がなかった(アドレスを間違えた)か、送信したデータに対してACKがなかった場合(こちらはスレーブデータを処理できない状態にある)だけです。
    これ以外にはありません。
    RIIC0ではエラーを検出すると、r_Config_RIIC0_error_interruptで処理するようですから、r_Config_RIIC0_callback_receiveerrorに引数としてエラー要因が渡されるので、そこでも通信完了フラグをセット(正常な通信完了と異なるエラー要因をセット)するようにしてみてください。その上で、while(!flg);の後でフラグの値で判断してください。または、RIIC0のレジスタでチェックしてください。

    以前にも書きましたが、私はRXを使ったことはない(RL78の環境は結構持っていますが、RXの環境は持っていません)ので、これ以上のコメントはできません。
  • チョコです。

    1点気になるところがあります。ads1115はADDRpinの処理方法によってスレーブ・アドレスが0x48~0x4Bと変わりますが、その設定と、使用しているスレーブ・アドレスは一致していますか。これを確認してください。
  • チョコさん、回答ありがとうございます。

    丁寧にありがとうございました。頑張ってプログラム作成します。
Reply Children
No Data