// // 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 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, lin_callback_ext_t LinExtCallbackHandler, void *envCallExtBack, const uint8_t *classicPID, uint8_t numOfClassicPID ) { env->UART_INDEX = UART_INDEX; env->UART = uart; env->linData.rxDataQueue = osMessageQueueNew(1, 1, NULL); env->LinExtCallbackHandler = LinExtCallbackHandler; env->envCallExtBack = envCallExtBack; 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; env->g_linMasterConfig.numOfClassicPID = numOfClassicPID; env->g_linMasterConfig.classicPID = (uint8_t *)classicPID; // 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); lin_event_id_t state; if (osMessageQueueGet(env->linData.rxDataQueue, &state, NULL, timeout) == osOK) { LIN_DrvGoToIdleMode(env->UART_INDEX); lin_event_id_t id = state; return id; } LIN_DrvGoToIdleMode(env->UART_INDEX); // LIN_DrvReceiveFrameBlocking(env->UART_INDEX, env->linData.g_aRxBuffer, env->linData.g_aRxBufferLen, 3000U); return LIN_TIMEOUT; } tLinIO vLinGetIo(tLinFlagchip *env) { tLinIO io = { .env = env, .runCommand = (LinIOTransaction) vLinRunCommand, }; return io; }