2078965_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2078965_ja-JP

2078965_ja-JP

S32K: LINタイムアウトマネジメント構成に関するサポートが必要です

こんにちは、

このメッセージがあなたに届く頃には、お元気でいらっしゃることを願っています。現在、EBTreosを使用してLINタイムアウトマネジメントを設定する際に問題が発生しています。私は、 Lin_MasterFrameTransfer_S32K312のルーチンと、 Lin_TS_T40D34M20I2R0にあるRTD_LIN_UM .pdf ドキュメントを参照しました。私の設定では、MCUがホストとして機能し、CANOEでシミュレートされたメッセージを受信するためにヘッダーを送信しています。私が遭遇した具体的な問題点は以下のとおりです。

  1. Lin Frame Timeout Disableを有効にすると、応答タイムアウト管理は行われず、正常にデータを受信できます。
  2. Lin Frame Timeout Disable を有効にしない場合、LinLpuartStart および LinLpuartStop コールバック関数を手動で追加し、GPT モジュールのタイマーコールバック関数 Switch_TimeOut を設定してタイムアウトイベントを管理します。

しかし、このシナリオでは、スレーブはデータを送信しません。オシロスコープの観測結果によると、ヘッダーを送信しているのはマスター側のみである。問題はタイミングに関係しているのではないかと考えています。タイマーを40MHzのクロックに設定し、 Pit_Ip_StartChannelのCountValueを40MHzに設定しました。これは、タイミング周期が1秒であることを意味します。この構成では、テストは正常に進行します。

しかし、タイマーをマイクロ秒単位のタイミングに設定しようとすると、期待どおりに動作しません。参考までに、私のコードの一部を以下に示します。

void LinLpuartStart(uint8 Instance, uint32 MicroSeconds)
{
	(void)Instance;
	(void)MicroSeconds;
	uint32 count_down = 0U;
	count_down = MicroSeconds * 40U;

	Pit_Ip_StartChannel(0, 0, count_down);
}

uint32 stop_cnt = 0U;
void LinLpuartStop(uint8 Instance)
{
	(void)Instance;
	stop_cnt+=1;
	Pit_Ip_StopChannel(0, 0);
}
uint32 test_lin_out = 0U;
/* This function called when timout event happens. */
void Switch_TimeOut(void)
{
	Lin_PduType linFrame = T_Lin_Frame[0U];
	/* Deal with timout event */
	test_lin_out+=1;
	Lpuart_Lin_Ip_TimerExpiredService(0);
	/* Send the Lin_Header Again */
	Lin_SendFrame(0U, &linFrame);
}

この問題を解決するためのご指導やご提案をいただければ大変ありがたいです。特に、スレーブが正しく応答するようにタイマー設定を適切に構成する方法についてご教示いただければ幸いです。

お時間とご協力に感謝いたします!

BR、

ドンシュン

Re: S32K: Assistance Required with LIN Timeout Management Configuration

はい、ありがとうございます。73μsという結果が出た計算式はどこで入手されたものか教えていただけますか?また、この数式に含まれる様々なパラメータは何を表しているのでしょうか?

Re: S32K: Assistance Required with LIN Timeout Management Configuration

こんにちは、アオインさん。

T_Lin_Frameはデモファイルで定義されており、完全な定義は以下のとおりです。

 
uint8 T_Lin_Data[3] = {0x01, 0x02, 0x03};
const Lin_PduType T_Lin_Frame[T_LIN_TEST_FRM_NUM] =
{
    {0x1A, LIN_ENHANCED_CS, LIN_MASTER_RESPONSE, 3u, T_Lin_Data}
};
そして、pit_dataは私が自分でデバッグする変数です。
デモルーチンを探す場合は、次のパスが存在するかどうかを確認してください。XXX:\NXP\SW32K3_RTD_4.4_2.0.2\eclipse\plugins\Lin_TS_T40D34M20I2R0\examples\EBT\Lin_MasterFrameTransfer_S32K312\
 
Re: S32K: Assistance Required with LIN Timeout Management Configuration

「pit_data」と「T_Lin_Frame」パラメータはどこで定義されているか教えていただけますか?私のプロジェクトではこれらの変数が見つかりませんでしたし、「Switch_TimeOut」関数がどこにリンクされているのかもわかりません。それらの機能について教えてください。ありがとう。

Re: S32K: Assistance Required with LIN Timeout Management Configuration

こんにちは@dongxunさん

これは既知の問題であり、RTD 5.0.0以降で修正されています。

ご迷惑をおかけして申し訳ありません。


よろしくお願いいたします。

ダニエル


Re: S32K: Assistance Required with LIN Timeout Management Configuration

こんにちは、

このメッセージがあなたに届く頃には、お元気でいらっしゃることを願っています。LINタイムアウト**マネジメント**設定で発生した問題の根本原因を特定できたと考えています。

EB_Treos28の設定では、LInResponseTimeoutは14に設定されています。この値はビット伝送時間の 1.4 倍を表し、具体的には(14/10)∗ビット時間( 14/10 ) ビット時間として計算されます。ボーレートが 19200 bps の場合、この構成を生成するのに必要な時間 は 1.4 52.08 μs = 73 μs と 計算 されます。

関連する設定コードの一部を以下に示します。

#ifdef LPUART_LIN_IP_START_TIMER_NOTIFICATION
    2292U,           /*!< HeaderTimeoutValue in microseconds */

    73U,         /*!< ResponseTimeoutValue in microseconds for 1 byte */
#endif

関数 Lpuart_Lin_Ip_MasterRxPidByteProcess(const uint8 Instance, const uint8 Data) において、以下のロジックに気づきました。

        else if (LinCurrentState->RxSize > 0u)
        {
        #if (LPUART_LIN_IP_FRAME_TIMEOUT_DISABLE == STD_OFF)
            #ifdef LPUART_LIN_IP_START_TIMER_NOTIFICATION
            LinCurrentState->TimerCounting = TRUE;
            /* Call notification to start timer for Lpuart instance and configure timeout value. The Master node will receive Response frame */
            LPUART_LIN_IP_START_TIMER_NOTIFICATION(Instance, UserConfig->ResponseTimeoutValue * (uint32)(LinCurrentState->RxSize));
            #endif
        #endif /* (LPUART_LIN_IP_FRAME_TIMEOUT_DISABLE == STD_OFF) */
            LinCurrentState->CurrentNodeState = LPUART_LIN_IP_NODE_STATE_RECV_DATA;
        }

タイマーは初期設定で 73 μs∗9 バイト=657 μs 73 μs 9 バイト = 657 μs です 。この後、LINドライバの状態はLPUART_LIN_IP_NODE_STATE_RECV_DATAに遷移し、スレーブからのデータ応答を待ちます。しかし、当初私は9バイトの応答時間として657μ秒を考慮してタイマーを設定しましたが、これは明らかに間違っています。実際のタイムアウトマネジメントは73 μs∗9 bytes∗8 bits=5256 μs73μs9bytes8bits=5256μsとなります。

この問題を解決するために、LPUART_LIN_IP_START_TIMER_NOTIFICATION コールバック関数を以下のように変更することを提案します。

 
void LinLpuartStart(uint8 Instance, uint32 MicroSeconds)
{
	(void)Instance;
	(void)MicroSeconds;
	uint32 count_down = 0U;
	count_down = MicroSeconds * 40U * 8U;
	pit_data.swtich_notificatio_cnt +=1;  /* The Start notification shall be called many times which depends on the times of sending frames */
	Pit_Ip_StartChannel(0, 0, count_down); 
}

BR、

ドンシュン

Tags (1)
No ratings
Version history
Last update:
‎05-13-2026 03:29 AM
Updated by: