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

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

    ごめんなさい。ソースを生成させて確認したところ、(RX版の)コード生成機能の簡易I2CのAPI関数に渡すスレーブのアドレスは8ビットのようでした。ですので、(少なくとも)簡易I2Cでは以下の処理が必要そうですね。(ただ、アンドする値は0x00ではなくて0x01の間違いですね。)

    Send時

    adr = 0x41;
    dir = 0x00;
    adr = (adr<<1) | (dir & 0x01);

    Receive時

    adr = 0x41;
    dir = 0x01;
    adr = (adr<<1) | (dir & 0x01);

    以下、確認した時のSendに関する資料です。(自分自身への備忘録としてでもあります。)

    RX230グループ、RX231グループ  ユーザーズマニュアル ハードウェア編の画面コピー
    www.renesas.com/jp/ja/search/keyword-search.html#genre=document&q=r01uh0496
    r01uh0496jj0120-rx231.pdf



    r_cg_sci.c

    void R_SCI12_IIC_Master_Send(uint8_t adr, uint8_t * const tx_buf, uint16_t tx_num)
    {
        if (1U > tx_num)
        {
            return;
        }

        gp_sci12_tx_address = tx_buf;
        g_sci12_tx_count = tx_num;
        g_sci12_slave_address = adr;
        g_sci12_iic_transmit_receive_flag = _80_SCI_IIC_TRANSMISSION;
        g_sci12_iic_cycle_flag = _80_SCI_IIC_START_CYCLE;

        /* Disable RXI and ERI interrupt requests */
        SCI12.SCR.BIT.RIE = 0U;

        /* Generate start condition */
        R_SCI12_IIC_StartCondition();
    }

    r_cg_sci_user.c

    static void r_sci12_transmitend_interrupt(void)
    {
        if (_80_SCI_IIC_START_CYCLE == g_sci12_iic_cycle_flag)
        {
            SCI12.SIMR3.BIT.IICSTIF = 0U;
            SCI12.SIMR3.BIT.IICSCLS = 0U;
            SCI12.SIMR3.BIT.IICSDAS = 0U;
            SCI12.TDR = g_sci12_slave_address;
        }
        else if (_00_SCI_IIC_STOP_CYCLE == g_sci12_iic_cycle_flag)
        {
            SCI12.SIMR3.BIT.IICSTIF = 0U;
            SCI12.SIMR3.BYTE |= _30_SCI_SSDA_HIGH_IMPEDANCE | _C0_SCI_SSCL_HIGH_IMPEDANCE;
            if (_80_SCI_IIC_TRANSMISSION == g_sci12_iic_transmit_receive_flag)
            {
                r_sci12_callback_transmitend();
            }
            if (_00_SCI_IIC_RECEPTION == g_sci12_iic_transmit_receive_flag)
            {
                r_sci12_callback_receiveend();
            }
        }
    }

     

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

    ごめんなさい。ソースを生成させて確認したところ、(RX版の)コード生成機能の簡易I2CのAPI関数に渡すスレーブのアドレスは8ビットのようでした。ですので、(少なくとも)簡易I2Cでは以下の処理が必要そうですね。(ただ、アンドする値は0x00ではなくて0x01の間違いですね。)

    Send時

    adr = 0x41;
    dir = 0x00;
    adr = (adr<<1) | (dir & 0x01);

    Receive時

    adr = 0x41;
    dir = 0x01;
    adr = (adr<<1) | (dir & 0x01);

    以下、確認した時のSendに関する資料です。(自分自身への備忘録としてでもあります。)

    RX230グループ、RX231グループ  ユーザーズマニュアル ハードウェア編の画面コピー
    www.renesas.com/jp/ja/search/keyword-search.html#genre=document&q=r01uh0496
    r01uh0496jj0120-rx231.pdf



    r_cg_sci.c

    void R_SCI12_IIC_Master_Send(uint8_t adr, uint8_t * const tx_buf, uint16_t tx_num)
    {
        if (1U > tx_num)
        {
            return;
        }

        gp_sci12_tx_address = tx_buf;
        g_sci12_tx_count = tx_num;
        g_sci12_slave_address = adr;
        g_sci12_iic_transmit_receive_flag = _80_SCI_IIC_TRANSMISSION;
        g_sci12_iic_cycle_flag = _80_SCI_IIC_START_CYCLE;

        /* Disable RXI and ERI interrupt requests */
        SCI12.SCR.BIT.RIE = 0U;

        /* Generate start condition */
        R_SCI12_IIC_StartCondition();
    }

    r_cg_sci_user.c

    static void r_sci12_transmitend_interrupt(void)
    {
        if (_80_SCI_IIC_START_CYCLE == g_sci12_iic_cycle_flag)
        {
            SCI12.SIMR3.BIT.IICSTIF = 0U;
            SCI12.SIMR3.BIT.IICSCLS = 0U;
            SCI12.SIMR3.BIT.IICSDAS = 0U;
            SCI12.TDR = g_sci12_slave_address;
        }
        else if (_00_SCI_IIC_STOP_CYCLE == g_sci12_iic_cycle_flag)
        {
            SCI12.SIMR3.BIT.IICSTIF = 0U;
            SCI12.SIMR3.BYTE |= _30_SCI_SSDA_HIGH_IMPEDANCE | _C0_SCI_SSCL_HIGH_IMPEDANCE;
            if (_80_SCI_IIC_TRANSMISSION == g_sci12_iic_transmit_receive_flag)
            {
                r_sci12_callback_transmitend();
            }
            if (_00_SCI_IIC_RECEPTION == g_sci12_iic_transmit_receive_flag)
            {
                r_sci12_callback_receiveend();
            }
        }
    }

     

Children
No Data