Lin_Flagchip_FC7240/Src/LinFlagchip.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;
}