RX231のコード生成を用いた簡易IIC通信について

電流・電圧測定デバイスであるINA233を用いて電圧値を測定し,測定値を簡易IIC通信でRX231に送るプログラムを作成しておりますが上手くいきません.

RX231シリーズ R5F52316ADFM 

ROM:256Kbyte RAM 32Kbyte  外部発振20MHzを使用しています.

コード生成はSCI12を簡易IICバスに設定し,生成しました.

void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
   {
    uint8_t     adr         =0      ;//7bit address
 uint8_t     dir         =0      ;//0:Write 1:Read
 
 uint8_t  tx_buf[255] = {0};//send data
     uint8_t  rx_buf[255] = {0};//receive data
 
 while(1){
  adr = 0x41;
  dir = 0x00;
  adr = (adr<<1) | (dir & 0x00);
  tx_buf[0] = 0x88; //READ_VIN PMBusコード ina233
  tx_buf[1] = 0x89; //READ_IN PMBusコード ina233
    
  //PMBusコマンド ina233に送信
  R_SCI12_Create();
  R_SCI12_Start();
  R_SCI12_IIC_Master_Send(adr,&tx_buf[0],3);
  R_SCI12_Stop();
 
  adr = 0x41;
  dir = 0x01;
  adr = (adr<<1) | (dir & 0x00);
 
  //ina233からデータ取得
  R_SCI12_Start();
  R_SCI12_IIC_Master_Receive(adr,rx_buf,3);
  R_SCI12_Stop();
 }
   }
  
    /* End user code. Do not edit comment generated here */
}

CS+の設定等もよく分からないのでその辺りも教えていただけるとありがたいです.

初歩的な質問ですいませんが,よろしくお願いいたします.

//INA233のデータシート

www.ti.com/.../ina233.pdf

  • NoMaY様、丁寧に教えていただきありがとうございます。
    教えていただいたコードで書き換えて実行したところ、

    do{}while (g_sci12_rx_ready_flag != 1); 

    のループから抜けない結果となりました。
    その1行前の
    R_SCI12_IIC_Master_Send( (uint8_t)((adr << 1) | 1), rx_buf, rx_num );

    R_SCI12_IIC_Master_Receive( (uint8_t)((adr << 1) | 1), rx_buf, rx_num ); 
    に変えたところ、

    rx_buf[0]='A'(0x41), rx_buf[1]='''(0x27)
    という結果になりました。

    それからINA233のA1端子 = GND、A0端子 = VSで合っております。
  • fiReさん、こんにちは。NoMaYです。

    ごめんなさい。以下は私のチョンボですね。申し訳ないです。(これは恥ずかしいですね。)そして、修正後でも rx_buf[0]='A'(0x41), rx_buf[1]='''(0x27) ですと期待値と異なっていますね。ごめんなさい、私では、ここまでが限界です。他の方からリプライを待って頂けますか、、、

    誤)

    void U_SCI12_IIC_Master_Receive_UWT(uint8_t adr, uint8_t * const rx_buf, uint16_t rx_num)
    {
        R_SCI12_IIC_Master_Send( (uint8_t)((adr << 1) | 1), rx_buf, rx_num );
        do{}while (g_sci12_rx_ready_flag != 1);
        g_sci12_rx_ready_flag = 0;
    }

    正) というか私が意図していたもの

    void U_SCI12_IIC_Master_Receive_UWT(uint8_t adr, uint8_t * const rx_buf, uint16_t rx_num)
    {
        R_SCI12_IIC_Master_Receive( (uint8_t)((adr << 1) | 1), rx_buf, rx_num );
        do{}while (g_sci12_rx_ready_flag != 1);
        g_sci12_rx_ready_flag = 0;
    }

     

  • fiReさん、こんにちは。NoMaYです。

    > 修正後でも rx_buf[0]='A'(0x41), rx_buf[1]='''(0x27) ですと期待値と異なっていますね。

    ふと気付いたのですが、この値は PMBusコード = D0h(MFR_ADC_CONFIG) の時の値ではありませんか?(バイト順が逆ではありますが。) 私が読もうとしていたのは PMBusコード = E0h(TI_MFR_ID)の時の値でしたので、すみませんが、PMBusコードがE0hではなくて、D0hになってしまっていないか確認して頂けませんか?

    INA233データシートの画面コピー

     

  • チョコです。

    鈴木さん,このマニュアルの記述は問題があります。

     R_SCIn_IIC_Master_Send関数では,(引数adrで指定したスレーブ・アドレスとR/W#ビット)と記述されているのに,

    R_SCIn_IIC_Master_Receive関数では,(引数adrで指定したスレーブ・アドレス)と矛盾する記述になっています。

    APIの使い方としてのプログラムも掲載されていないのでは,初心者はつかえませんよ。

    マニュアルのに直しを要望します。

  • NoMaY様、確認したところtx_buf[0] = 0xE0となっていました。

    そこで他のPMBusコードで試したところ、
    なぜか分かりませんが PMBusコード = 7Eh(STATUS_CML)のとき
    rx_buf[0] = 'T'(0x54) , rx_buf[1] = 'I'(0x49)
    となりました、、

    ちなみにPMBusコード = D0h(MFR_ADC_CONFIG) のときも
    rx_buf[0]='A'(0x41), rx_buf[1]='''(0x27)
    となりました。
  • fiReさん、こんにちは。NoMaYです。

    状況としては以下のような印象ですね。やはり、私では、ここから先のお手伝いは無理そう(出来ないことも無いとは思いますが、I2Cを実際に触った経験が無くて、オシロで観測した波形データを見たりして、イチから考えないとダメなので、私では効率が悪そう)ですので、他の方からのアドバイスを待って頂けますか、、、

    (1) 相手側デバイスがリードデータを返しているのは間違い無さそうだ
    ⇒ 7bitスレーブアドレスとR/Wビットは正しく相手側デバイスに正しく伝わっているようだ

    (2) しかしリードデータは、期待値とは異なっている場合もあれば、期待値通りの場合もある
    ⇒ PMBusコードが相手側デバイスに正しく伝わっていない?

    他方、fiReさんがRXスマートコンフィグレータのことを全く知らなかった原因は、把握出来ました。以下の5点だと思います。また、RXスマートコンフィグレータをインストールしてCS+から使えるようにする為のドキュメントを見付けることが出来ました。なので、上の件が片付きましたら、その後で、こちらの件についてお伝えしようと思います。

    (A) CS+のインストーラパッケージにはRXスマートコンフィグレータは含まれない
    (B) RXスマートコンフィグレータはRXスマートコンフィグレータのインストーラでインストールする必要がある
    ⇒ たぶん両者の開発部署は全く別であり、インストーラを合体させることを全く思い付いていない、のだろうと思います

    (C) 無償評価版ツールのダウンロードページにはRXスマートコンフィグレータが掲載されていない
    (D) CS+製品ページにはRXスマートコンフィグレータに関する記述があることはあるが良く読まないと気付かない(と思う)
    (E) CS+製品ページからRXスマートコンフィグレータをダウンロード出来るが何なのか知らない人はダウンロードしない(当然)
    ⇒ CS+の新規ユーザさんがRXスマートコンフィグレータのことを知らなくても当然といえば当然な気がしました、、、

  • チョコ様、ご指摘ありがとうございます。APIマニュアルについては、修正したいと思います。
    NoMaY様、すみません、簡易I2CのAPIアドレスの指定が他と異なっていることはわかっていたのですが、初期の仕様で間違ってきめていたようです。APIを途中で変更することも出来ず、現在に至っています。この点も含めてAPIマニュアルに記載したいと思います。
    スマートコンフィグレータのダウンロードについては下記URLからお願いします。
    www.renesas.com/smart-configurator
    CS+の無償ダウンロードページにも記載したいと思います。
  • fiReさん、こんにちは。NoMaYです。

    以下のURLにArduioライブラリのソースがあることに気付きました。ちょっとこれを読んでみようかと思います。(すみません、朝令暮改ですが、もうちょっとねばってみます、、、)

    infinityPV / infinityPV_INA233_Arduino-library
    github.com/infinityPV/infinityPV_INA233_Arduino-library

    Library for using the INA233 ADC/I2C with Arduino. It makes easier the INA233 configuration from the maximum current and maximum voltage to measure and the used shunt resistor. INA233 supports PMBus commands, so many functions implemented here can be used with other PMBus compatible devices.


    [関連リンク]

    Google検索: INA233 sample OR example program OR code
    www.google.com/search?q=INA233+sample+OR+example+program+OR+code
     

  • fiReさん、こんにちは。NoMaYです。

    ウェブ上のINA233の情報を追い掛けていて以下のページに遭遇したのですが、画面コピーを見る限り、INA233からリードされたワードデータのバイト順はデータシート通りに思えます。それに対して、このスレッドでのバイト順は、それとは逆順になっている気がするのです。昨日のArduinoライブラリのソースを追いかけてみた印象も、基本的にデータシート通りのバイト順のようでした。(正確には、ワードリードやバイトリードのやり方はデータシート記載のものでは無く、ブロックリードのやり方をワードリードやバイトリードにも適用しているようで、単に(かつ無意識に)やり方を統一したかっただけなのか、切実な理由があってそうしているのか、気掛かりではありますが、、、)

    rx_buf[0]='A'(0x41), rx_buf[1]='''(0x27) ← データシートからすると 0x27, 0x41 の順であるべきように思えます
    rx_buf[0]='T'(0x54), rx_buf[1]='I'(0x49) ← データシートからすると 0x49, 0x54 の順であるべきように思えます

    INA233: How to drive INA233 (以下の画面コピーで値がデータシートと異なる箇所は書き換え後なのかなと思っています)
    e2e.ti.com/support/amplifiers/f/14/t/629271
    画面コピー


    それで、この情報から突如として話が飛躍するのですが、以下の点はどうなっているかを知りたいです。

    (1) fiReさんのプロジェクトでスタックサイズはどうなっていますか?以下と同じですか?

    stacksct.h

    #pragma stacksize su=0x100
    #pragma stacksize si=0x300

    resetprg.c

    #define PSW_init  0x00010000    // PSW bit pattern
        set_psw(PSW_init);              // Set Ubit & Ibit for PSW
    //  chg_pmusr();                    // Remove the comment when you need to change PSW PMbit (SuperVisor->User)

    (2) r_cg_main.cを以下のように書き換えるとどうなりますか?

    変更前:

            uint8_t  tx_buf[255] = {0};//send data
            uint8_t  rx_buf[255] = {0};//receive data

    変更後:

            uint8_t  tx_buf[256] = {0};//send data
            uint8_t  rx_buf[256] = {0};//receive data

    (3) アクションブレークポイントで確認するのではなく、素朴にブレークポイントで停止させて、ウォッチウィンドウでrx_buf[0]とrx_buf[1]の値を見るとどうなりますか?

    あと、オシロはお持ちでしょうか?もう一日ほど待ってみても、他の方からアドバイスが来なければ、オシロで波形を観測しながら考えて行かざるを得ないかな、と思うのです。

  • NoMaY様、今回用いている評価ボードを作製したメーカーに問い合わせたところ、
    電流・電圧センサーがINA233ではなくINA226であることが判明しました、、

    INA226はPMBusがサポートされてないそうなので、
    一度INA226 に対応したプログラムを作り直してみようと思います。

    誤った情報を伝えてしまい、すいませんでした、、