From 5782440e397c8df4ab6a76805755d9878b356324 Mon Sep 17 00:00:00 2001 From: cfif Date: Tue, 25 Nov 2025 16:18:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LinTasks.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++- LinTasks.h | 8 ++++- 2 files changed, 107 insertions(+), 2 deletions(-) diff --git a/LinTasks.c b/LinTasks.c index b7a92fb..5645555 100644 --- a/LinTasks.c +++ b/LinTasks.c @@ -6,6 +6,7 @@ #include "CmsisRtosThreadUtils.h" #include "CanPorts.h" #include "fc7xxx_driver_lin.h" +#include "Lins.h" //начало----------------------------------------- LIN 0 ---------------------------------------------------------------- //начало----------------------------------------- LIN 0 ---------------------------------------------------------------- @@ -101,6 +102,99 @@ void GetLin0CallbackHandler(tLinData *env, uint8_t u8LinIndex, void *state) { osMessageQueuePut(env->rxDataQueue, (uint8_t *) &pXferState->currentEventId, 0x0, 0U); } +static lin_event_id_t SEND_ACTUATOR_COM_x(tLinTaskActuator *env, uint8_t adr) { + lin_event_id_t res = env->linIo->runCommand(env->linIo->env, adr, 50); + SystemDelayMs(20); + return res; +} + +lin_event_id_t DFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_SET; + env->linData->g_aTxBufferLen = sizeof(ACT_DFR_STA); + env->linData->g_aRxBufferLen = 0; + + ACT_DFR_STA *ACT_DFR_STA_ = (ACT_DFR_STA *)env->linData->g_aTxBuffer; + ACT_DFR_STA_->BUS_ADR = ADR; + ACT_DFR_STA_->Data1_DFR_STA = 0xFF; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, DFR_STA); + + if (res == LIN_TX_COMPLETED) { + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t RFR_STA_x(tLinTaskActuator *env, uint8_t ADR) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_GET; + + env->linData->g_aTxBufferLen = 0; + env->linData->g_aRxBufferLen = sizeof(ACT_RFR_STA); + + ACT_RFR_STA *ACT_RFR_STA_ = (ACT_RFR_STA *)env->linData->g_aRxBuffer; + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, RFR_STA); + + if (res == LIN_RX_COMPLETED) { + + + break; + } + + --retry; + } + + return res; +} + +lin_event_id_t ISSR_x(tLinTaskActuator *env, uint8_t ADR) { + lin_event_id_t res; + + env->linData->direction = LIN_DIRECTION_GET; + env->linData->g_aTxBufferLen = 0; + env->linData->g_aRxBufferLen = sizeof(ACT_RFR_ISSR); + + uint8_t retry = 3; + + while (retry) { + + res = SEND_ACTUATOR_COM_x(env->linIo->env, ADR); + + if (res == LIN_RX_COMPLETED) { + + ACT_RFR_ISSR *ACT_RFR_ISSR_ = (ACT_RFR_ISSR *)env->linData->g_aRxBuffer; + + if (ACT_RFR_ISSR_->DIAGNOSE_MT) { + DFR_STA_x(env, ADR); + RFR_STA_x(env, ADR); + } + + break; + } + + --retry; + } + + + return res; + +} void Lin_0_Init(tLinTaskActuator *env, tLinData *linData, @@ -118,10 +212,15 @@ void Lin0_Scheduler(tLinTaskActuator *env) { if (osMutexAcquire(env->access, 100) == osOK) { + + for (uint8_t i = 0; i < LIN0_ISSR_ALL; ++i) { + lin_event_id_t res = ISSR_x(env, i); + } + + osMutexRelease(env->access); } - env->linIo->runCommand(env->linIo->env, 0x11, 1000); } diff --git a/LinTasks.h b/LinTasks.h index ad502bd..d44abc6 100644 --- a/LinTasks.h +++ b/LinTasks.h @@ -114,9 +114,11 @@ typedef enum { LIN_MODE_STOP = 2 } eMode_Mod; + typedef struct __attribute__ ((packed)) { uint8_t BUS_ADR; - eMode_Mod Mode; + eMode_Mod Mode_Slave: 2; + uint8_t Unused: 6; // Установить в 0xFF uint8_t Data2_Mod; // Установить в 0xFF uint8_t Data3_Mod; // Установить в 0xFF } ACT_CFR_MOD; @@ -356,6 +358,10 @@ typedef struct __attribute__ ((packed)) { uint8_t DIAGNOSE_MT: 1; } ACT_RFR_ISSR; +#define LIN0_ISSR_ALL 0x09 +#define LIN1_ISSR_ALL 0x06 +#define LIN2_ISSR_ALL 0x08 + typedef struct { tLinIO *linIo;