RL78 - LIN 通信 - 2 つの送信間のディレイ

こんにちは、

RL78 F13 48ピンコントローラーのLINを使用しています。

使用している LIN IC は TJA1021 - マスターです。

2 つのスレーブがマスターに接続されており、50 ミリ秒のタイマー間隔で while ループが発生し、両方のスレーブにヘッダーを 1 つずつ送信してデータを受信しようとしています。

両方の送信間に約 2.5 ミリ秒のディレイを追加すると、LIN 通信は正常に機能しています。

そうしないと、LIN からデータを取得できません。

-------------------------------------------------- -----------------

例:

2回の送信の間に遅延がある場合問題なく動作します。

LIN_Master_HeaderTransmit(0x81); //LIN スレーブ 1
for(int i =ZERO; i<=2500; i++)
{
Wait1us();
}
LIN_Master_HeaderTransmit(0x82); //LIN スレーブ 2

-------------------------------------------------- --------------------

以下のコードは機能しません。

LIN_Master_HeaderTransmit(0x81); //LIN スレーブ 1

LIN_Master_HeaderTransmit(0x82); //LIN スレーブ 2

-------------------------------------------------- --------------------

このディレイは予期されたものですか、それともディレイなく動作するはずですか?
教えてください。

ありがとうございます。

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

    > 両方の送信間に約 2.5 ミリ秒のディレイを追加すると、LIN 通信は正常に機能しています。
    > そうしないと、LIN からデータを取得できません。

    > このディレイは予期されたものですか、それともディレイなく動作するはずですか?

    LIN_Master_HeaderTransmit()というのは、ルネサスさんのアプリケーションノートか何かでソース全体が公開されているものでしょうか?あるいは、CS+のコード生成機能やAppliletで生成されたものであって、ソースを私が見ることが出来るものでしょうか?

  • NoMay さん、

    LIN_Master_HeaderTransmit()というのは、ルネサスさんのアプリケーションノートか何かでソース全体が公開されているものでしょうか?
    >> はい。そうです。
    www.renesas.com/.../search
    (IARのサンプル)

    ありがとうございます。

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

    ドキュメントを見ると、preparationという記載があります。実際、ソースを見ても、送信受信を起動するところまでしかしていないようです。なので、連続して呼び出してはいけません。つまり、ディレイは予期されたもの、です。正直には、LINの通信プロトコルおよび内蔵周辺レジスタ仕様に無知ですので以下の追加コードが正しいのか不明ですが、スーパーループで運用するのであれば、以下のように送信完了フラグや受信完了フラグを立てるコードを追加することが前提、であり、そのあたりのことは自分ですることが前提、である、そういうサンプルプログラムだろうなぁ、と私は思いました。

    3.2 Functions

    Function Name               Outline                                             Code size (bytes)
    RLIN_Master_Init            Initial setting                                     98
    RLIN_Master_HeaderTransmit  Header Transmit preparation                         78
    RLIN_Master_Transmit        Data transmission preparation                       53
    RLIN_Master_Receive         Data reception preparation                          18
    RLIN_Master_GetData         Get data from data buffer                           18
    Clear_DataBuffer            Setting all data buffer to 0                        26
    Get_response_RxData         Store data to variables array from Data buffer      41

     

    bool g_RLIN0_tx_ready_flag = true;

    bool RLIN0_Is_Transmit_Busy(void)
    {
        return !g_RLIN0_tx_ready_flag;
    }

    #pragma vector = INTLIN0TRM_vect
    __interrupt static void RLIN0_Transmission_interrupt(void)
    {
        uint8_t transmit_header_flag;
        uint8_t transmit_response_flag;

        transmit_header_flag=LST0 & 0x80;
        transmit_response_flag=LST0 & 0x01;

        if(transmit_header_flag)
        {    
            /*LIE0&=0xF7;*/     /*Disable header transmit interrupt*//*revision 1.01*/
            LST0&=0x7F;         /*clear successful header reception flag */  
            /*LIE0|=0x80;*/     /*enable header transmit interrupt*//*revision 1.01*/
        }

        if(transmit_response_flag)
        {
            LST0&=0xFE;
        }

        s_RLIN0_tx_ready_flag = true;    /*should be set to false before starting transmission*/
    }

     

    bool g_RLIN0_rx_ready_flag = false;

    bool RLIN0_Is_Receive_Ready(void)
    {
        return g_RLIN0_rx_ready_flag;
    }

    #pragma vector = INTLIN0RVC_vect
    __interrupt static void RLIN0_Reception_interrupt(void)
    {
        LST0&=0xFD;             /*clear response reception successful flag*/
        RLIN_Master_GetData();  /*get the reception data*/

        g_RLIN0_rx_ready_flag = true;   /*should be set to false before starting reception*/
    }

     

    送信受信起動側コードの改造案に関しては省略

     

  • LIN通信ではヘッダ送出後にマスターまたはスレーブがレスポンスフレームを送出します。

    レスポンスが無い場合は、レスポンスタイムアウトになります。

    つまり0x081送出後にレスポンスを確認しています。

    0x81ヘッダ送信後、レスポンスフレームのための時間がなければ物理的に成立しません。

    なのでディレイは必要です。

    通常はレスポンスの処理や、レスポンスエラーなどの処理を行います。

    LINの周期が50msと定められているなら

    ヘッダを50ms周期で送るのがよくあるパターンです。

    マスターがまずヘッダを送出し、それに対してスレーブまたはマスターが1つ応答します。

    ヘッダーを2回連続で送るというのはLIN通信が成立しません。