From a7f9844a50024b42f7a18eabc70c7c4f439630d2 Mon Sep 17 00:00:00 2001 From: cfif Date: Fri, 17 Oct 2025 13:26:07 +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 --- Inc/LinFlagchip.h | 54 +++++++++++++++ Src/LinFlagchip.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++ modular.json | 17 +++++ 3 files changed, 237 insertions(+) create mode 100644 Inc/LinFlagchip.h create mode 100644 Src/LinFlagchip.c create mode 100644 modular.json diff --git a/Inc/LinFlagchip.h b/Inc/LinFlagchip.h new file mode 100644 index 0000000..cea1e65 --- /dev/null +++ b/Inc/LinFlagchip.h @@ -0,0 +1,54 @@ +// +// Created by cfif on 17.11.22. +// + +#ifndef LIN_FLAGCHIP_H +#define LIN_FLAGCHIP_H + +#include "LinIO.h" +#include "cmsis_os2.h" +#include "fc7xxx_driver_adc.h" +#include "fc7xxx_driver_pcc.h" +#include "interrupt_manager.h" +#include "fc7xxx_driver_lin.h" + +// LIN protocol ID definition +#define LIN_MASTER_SEND_ID (0x01U) +#define LIN_MASTER_RECEIVE_ID (0x02U) +#define LIN_MASTER_GO_TO_SLEEP_ID (0x03U) + +typedef struct { + + uint8_t UART_INDEX; + FCUART_Type *UART; + + osMessageQueueId_t rxDataQueue; + + lin_config_t g_linMasterConfig; + lin_xfer_state_t g_xferMasterState; + + uint8_t g_aTxBuffer[8]; + uint8_t g_aRxBuffer[8]; + +} tLinFlagchip; + +void LIN_Initial( + tLinFlagchip *env, + FCUART_Type *uart, + uint32_t BoundRate, + + uint8 UART_INDEX, // UART0 = 0 ... UART7 = 7 + IRQn_Type IRQ_UART, // FCUART0_IRQn ... FCUART7_IRQn + uint8 UART_PRIORITY, + + lin_get_interval_time_t LIN_TimerGetTimeIntervalValue, + lin_callback_t LinCallbackHandler +); + +void GetLinCallbackHandler(tLinFlagchip *env, uint8_t u8LinIndex, void *state); + +void Get_LIN_Result(tLinFlagchip *env); + +tLinIO vLinGetIo(tLinFlagchip *env); + +#endif //LIN_FLAGCHIP_H diff --git a/Src/LinFlagchip.c b/Src/LinFlagchip.c new file mode 100644 index 0000000..50cea82 --- /dev/null +++ b/Src/LinFlagchip.c @@ -0,0 +1,166 @@ +// +// Created by cfif on 07.09.22. +// +#include +#include "LinFlagchip.h" + +static const PCC_ClkSrcType s_ePccUartTable[] = + { + PCC_CLK_FCUART0, + PCC_CLK_FCUART1, + PCC_CLK_FCUART2, + PCC_CLK_FCUART3, + PCC_CLK_FCUART4, + PCC_CLK_FCUART5, + PCC_CLK_FCUART6, + PCC_CLK_FCUART7 + }; + +void GetLinCallbackHandler(tLinFlagchip *env, uint8_t u8LinIndex, void *state) { + lin_xfer_state_t *pXferState = state; + //uint32_t s_countIndex = 0U; + //bool s_rxError = false; + + //LIN_DrvSetTimeOutCounter(env->UART_INDEX, 500); + + switch (pXferState->currentEventId) { + case LIN_PID_OK: + if (pXferState->currentId == LIN_MASTER_SEND_ID) { + // Call to Send Frame DATA Function + LIN_DrvSendFrameNonBlocking(u8LinIndex, env->g_aTxBuffer, sizeof(env->g_aTxBuffer)); + } else if (pXferState->currentId == LIN_MASTER_RECEIVE_ID) { + LIN_DrvReceiveFrameNonBlocking(u8LinIndex, env->g_aRxBuffer, sizeof(env->g_aRxBuffer)); + } else if (pXferState->currentId == LIN_MASTER_GO_TO_SLEEP_ID) { + LIN_DrvGoToSleepMode(u8LinIndex); + } else { + // Misra check. + uint8_t data = LIN_TIMEOUT; + osMessageQueuePut(env->rxDataQueue, &data, 0x0, 0U); + return; + } + + break; + case LIN_PID_ERROR: + // Go to idle mode + LIN_DrvGoToIdleMode(env->UART_INDEX); + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "Receive PID error!\r\n"); + break; + case LIN_TX_COMPLETED: + // Go to IDLE state. + LIN_DrvGoToIdleMode(env->UART_INDEX); + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "This test case will send data to slave node. Send data: \r\n"); + // for (s_countIndex = 0U; s_countIndex < sizeof(g_aTxBuffer); s_countIndex++) { + // FCUART_Printf(DEBUG_FCUART_INSTANCE, " 0x%x ", g_aTxBuffer[s_countIndex]); + // } + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "\r\nMaster node send complete! \r\n"); + break; + case LIN_RX_COMPLETED: + // Go to idle mode + LIN_DrvGoToIdleMode(env->UART_INDEX); + + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "Master node receive data:\r\n"); + //for (s_countIndex = 0U; s_countIndex < sizeof(env->g_aRxBuffer); s_countIndex++) { + // FCUART_Printf(DEBUG_FCUART_INSTANCE, " 0x%x ", g_aRxBuffer[s_countIndex]); + //if (env->g_aRxBuffer[s_countIndex] != (env->g_aTxBuffer[s_countIndex] + 1U)) { + // s_rxError = true; + //} + + //env->g_aRxBuffer[s_countIndex] = 0U; + //} + + //if (true == s_rxError) { + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "\r\nReceived data Error\r\n"); + //} else { + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "\r\nReveiced data matched!\r\n"); + //} + break; + case LIN_CHECKSUM_ERROR: + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "Receive checksum byte error!\r\n"); + break; + case LIN_READBACK_ERROR: + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "Read back error!\r\n"); + break; + case LIN_FRAME_ERROR: + break; + case LIN_RECV_BREAK_FIELD_OK: + break; + case LIN_WAKEUP_SIGNAL: + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "Wake up signal received!\r\n"); + LIN_DrvGoToIdleMode(env->UART_INDEX); + break; + case LIN_TIMEOUT: + // FCUART_Printf(DEBUG_FCUART_INSTANCE, "LIN transfer timeout occurred!\r\n"); + break; + case LIN_SYNC_ERROR: + break; + case LIN_BAUDRATE_ADJUSTED: + break; + case LIN_NO_EVENT: + break; + case LIN_SYNC_OK: + break; + default: + // do nothing + break; + } + + osMessageQueuePut(env->rxDataQueue, (uint8_t *) &pXferState->currentEventId, 0x0, 0U); +} + + +void LIN_Initial( + tLinFlagchip *env, + FCUART_Type *uart, + uint32_t BoundRate, + + uint8 UART_INDEX, // UART0 = 0 ... UART7 = 7 + IRQn_Type IRQ_UART, // FCUART0_IRQn ... FCUART7_IRQn + uint8 UART_PRIORITY, + + lin_get_interval_time_t LIN_TimerGetTimeIntervalValue, + lin_callback_t LinCallbackHandler +) { + + env->UART_INDEX = UART_INDEX; + env->UART = uart; + env->rxDataQueue = osMessageQueueNew(1, 1, NULL); + + + LIN_DrvGetDefaultConfig(LIN_NODE_MASTER, &env->g_linMasterConfig); + env->g_linMasterConfig.baudRate = BoundRate; + env->g_linMasterConfig.clockSrcFreq = PCC_GetPccFunctionClock(s_ePccUartTable[UART_INDEX]); + env->g_linMasterConfig.getIntervalTimeValueCallback = LIN_TimerGetTimeIntervalValue; + +// Switch TJA1021 device to normal mode +// GPIO_WritePins(PORT_E, PORT_PIN_24, PORT_GPIO_HIGH); + + LIN_DrvInit(UART_INDEX, &env->g_linMasterConfig); + + env->g_xferMasterState.Callback = LinCallbackHandler; + LIN_DrvStart(UART_INDEX, &env->g_xferMasterState); + + NVIC_SetPriority(IRQ_UART, UART_PRIORITY); + NVIC_EnableIRQ(IRQ_UART); + +} + +static uint8_t vLinRunCommand(tLinFlagchip *env, uint8_t command, uint32_t timeout) { + + LIN_DrvSendHeader(env->UART_INDEX, command); + + uint8_t state; + if (osMessageQueueGet(env->rxDataQueue, &state, NULL, timeout) == osOK) { + lin_event_id_t id = state; + return id; + } + return LIN_TIMEOUT; +} + + +tLinIO vLinGetIo(tLinFlagchip *env) { + tLinIO io = { + .env = env, + .runCommand = (LinIOTransaction) vLinRunCommand, + }; + return io; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..560a18f --- /dev/null +++ b/modular.json @@ -0,0 +1,17 @@ +{ + "dep": [ + { + "type": "git", + "provider": "HVAC_M7", + "repo": "LinInterface" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file