94 lines
2.6 KiB
C
94 lines
2.6 KiB
C
//
|
|
// Created by cfif on 07.09.22.
|
|
//
|
|
#include <SystemDelayInterface.h>
|
|
#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;
|
|
} |