📄 lin_driver08.c
字号:
#define LINDRV_GLOBALS
#include "LIN_Header.h"
/*
const L_U16 LIN_Wakeup_Timer[] =
{
LIN_WAKEUP_PHASE_1,
LIN_WAKEUP_PHASE_2,
LIN_WAKEUP_PHASE_3,
LIN_WAKEUP_PHASE_4,
LIN_NO_BUS_ACTIVE_TIME
};
*/
const L_U16 LIN_Wakeup_Timer[] =
{
LIN_WAKEUP_PHASE_1,
LIN_WAKEUP_PHASE_2,
LIN_WAKEUP_PHASE_3,
LIN_WAKEUP_PHASE_4,
LIN_NO_BUS_ACTIVE_TIME
};
L_BOOL LIN_Sys_Init(void)
{
/*
1.关中断
DisableInterrupts;
2.设置初始状态为LIN_FLAG_IGNORE,此时放弃所有活动
LIN_State_Flags = LIN_FLAG_IGNORE;
3.初始化出错计数器
LIN_Err_TxCounter = 0;
LIN_Err_RxCounter = 0;
4.所有的消息初始化为无消息状态
LINMsgStatus[x] = LIN_MSG_NODATA;
5.初始化时钟
LIN_Init_Timer();
6.初始化LIN使用的串口
LIN_IFC_Init_SCI0(void);
7.设置空闲定时溢出
LIN_SetIdleTimeout();
8.开中断
EnableInterrupts;
*/
L_BOOL bRet;
L_U8 i;
bRet = 0;
DisableInterrupts;
//LIN NODE STATUS
LIN_Node_Status = LIN_FLAG_NOINIT | LIN_FLAG_DISCONNECT;// | LIN_FLAG_NOT_RDY_FOR_SYNCHBREAK;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
LIN_Error_Status = LIN_OK;
LIN_Pending_Status = LIN_PENDING_NONE;
//LIN_State_Flags = LIN_FLAG_IGNORE | LIN_FLAG_DISCONNECT | LIN_FLAG_NOINIT;//SCI NOT INITIALIZED
LIN_Err_TxCounter = 0;
LIN_Err_RxCounter = 0;
LIN_TmpByte = 0;
LIN_LastPID = 0;
LIN_Rx_Counter = 0;
LIN_Tx_Counter = 0;
//LIN_Wakeup_Count = 0;
LIN_Wakeup_Phase = 0;
// for( i = 0; i < LIN_ListSize; i++ )
// {
// LIN_MsgStatus[i] = LIN_MSG_NODATA; // Set NO_DATA
// }
// LIN_TIC_Init(); //Disable Timer Input capture function, because we have a OSC Clock.
//so we don't need capture Synchronize Char 0x55 from Input capture channel
//Modified by wang jun peng, 3rd, march, 2005
LIN_Init_SCI0();
#if INT_TIMEBASE_EN
LIN_Init_Timer();// Add Time out function based TBM, dispose the LIN timeout function such as
// Wakeup time out or no-bus-activity timeout
//Modified by wang jun peng, 2nd, march, 2005
#endif //
//EnableInterrupts;
#if LIN_MSG_10
Msg_10_Init_Signals();
#endif
#if LIN_MSG_11
Msg_11_Init_Signals();
#endif
#if LIN_MSG_12
Msg_12_Init_Signals();
#endif
#if LIN_MSG_13
Msg_13_Init_Signals();
#endif
#if LIN_MSG_14
Msg_14_Init_Signals();
#endif
#if LIN_MSG_15
Msg_15_Init_Signals();
#endif
#if LIN_MSG_16
Msg_16_Init_Signals();
#endif
#if LIN_MSG_17
Msg_17_Init_Signals();
#endif
#if LIN_MSG_18
Msg_18_Init_Signals();
#endif
#if LIN_MSG_19
Msg_19_Init_Signals();
#endif
#if LIN_MSG_1A
Msg_1A_Init_Signals();
#endif
#if LIN_MSG_1B
Msg_1B_Init_Signals();
#endif
#if LIN_MSG_1C
Msg_1C_Init_Signals();
#endif
return bRet;
}
L_BOOL LIN_Flag_Tst(void)
{
return TRUE;
}
void LIN_Flag_Clr(void)
{
}
L_U8 LIN_SCH_Tick(void)
{
return 0;
}
void LIN_SCH_Set(void)
{
}
void LIN_Init_SCI0(void)
{
/*
1.关中断
DisableInterrupts;
2.设置;LIN状态为LIN_FLAG_IGNORE|LIN_FLAG_DISCONNECT
LIN_State_Flags = LIN_FLAG_IGNORE|LIN_FLAG_DISCONNECT;
3.设置LIN波特率
SetLIN_Buadrate(LIN_CfgConst.LIN_Baudrate);
4.设置控制寄存器:1位起始位,1位停止位,8位数据位,无校验;
允许发送与接收数据,禁止所有串口中断
LIN_SCI0CR1 = 0;
LIN_SCI0CR2 = LIN_SCCR2_TE|LIN_SCCR2_RE;
5.开中断
EnableInterrupts;
*/
// if((LIN_State_Flags & LIN_FLAG_NOINIT) == 0) return;//already initialized
if((LIN_Node_Status & LIN_FLAG_NOINIT) == 0) return;//already initialized
DisableInterrupts;
//LIN_State_Flags = LIN_FLAG_IGNORE | LIN_FLAG_DISCONNECT;
//no pending, no error, Initialized
LIN_Node_Status = LIN_FLAG_DISCONNECT;// | LIN_FLAG_NOT_RDY_FOR_SYNCHBREAK;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
LIN_SetBaudrate();// Need test the baudrate setting right or not
// 1. send out some char 0x55
// 2. use scope watch the wave and its frequency
// 3. campare the truth frequency with the setting baudrate
LIN_SCI_SCC1 = SCI_EN;//N,8,1; ENABLE SCI MODULE
LIN_SCI_SCC2 = SCI_TE + SCI_RE;//Enable transmit & receive data
LIN_SCIStatus1 = LIN_SCISR1;
LIN_TmpByte = LIN_SCIDRL;
//EnableInterrupts;
}
/*
Error: return none 0
success: return 0;
*/
L_BOOL LIN_Connect(void)
{
L_BOOL bRet;
/*
1.关中断
DisableInterrupts;
2.检查是否已经初始化
LIN_State_Flag & LIN_FLAG_NOINIT == 0
3.检查LIN是否已经处于连接状态
LIN_State_Flags & LIN_FLAG_DISCONNECT == 0
4.连接硬件
清除串口状态位
LIN_TmpSCIByte = LIN_SCI0SR1;
LIN_TmpSCIByte = LIN_SCI0DRL;
允许接收中断
LIN_SCI0CR2 |= LIN_SCCR2_RIE;
等待接收BREAK
LIN_State_Flags = LIN_FLAG_IGNORE;
重新设置空闲溢出时钟
LIN_SetIdleTimerout();
5.开中断
*/
bRet = 0;
//if((LIN_State_Flags & LIN_FLAG_NOINIT) == LIN_FLAG_NOINIT) return ~0;
//if((LIN_State_Flags & LIN_FLAG_DISCONNECT) == 0) return ~0;
//First, check Initialized or not
if((LIN_Node_Status & LIN_FLAG_NOINIT) == LIN_FLAG_NOINIT) return ~bRet;
//Second, check Connected or not
if((LIN_Node_Status & LIN_FLAG_DISCONNECT) == 0) return ~bRet;
DisableInterrupts;
LIN_EN_MASK = 1;
LIN_EN = 1;
//LIN_Enable(1);
LIN_SCIStatus1 = LIN_SCISR1;
LIN_SCIStatus2 = LIN_SCISR2;
LIN_TmpByte = LIN_SCIDRL;
//LIN_SCICR2 |= SCI_RIE;
LIN_SCIRIE = 1;
LIN_SCI_SCC3 = SCI_FEIE;//Enable Frame Error Interrupt
//LIN_State_Flags = LIN_FLAG_IGNORE;
LIN_Node_Status = LIN_FLAG_RDY_FOR_SYNCHBREAK;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
// LIN_SetIdleTimeout();
EnableInterrupts;
return bRet;
}
L_BOOL LIN_Disconnect()
{
L_BOOL bRet;
/*
1.关中断
DisableInterrupts;
2.检查是否已经初始化
LIN_State_Flag & LIN_FLAG_NOINIT == 0
3.检查LIN是否已经处于连接状态
LIN_State_Flags & LIN_FLAG_DISCONNECT == 0
4.切断连接
允许发送与接收数据,禁止所有串口中断
LIN_SCI0CR2 = LIN_SCCR2_TE|LIN_SCCR2_RE;
LIN_State_Flags = LIN_FLAG_IGNORE|LIN_FLAG_DISCONNECT;
重新设置空闲溢出时钟
LIN_SetIdleTimerout();
5.开中断
*/
bRet = 0;
//if((LIN_State_Flags & LIN_FLAG_NOINIT) == LIN_FLAG_NOINIT) return ~0;
//if((LIN_State_Flags & LIN_FLAG_DISCONNECT) == LIN_FLAG_DISCONNECT) return ~0;
//First, check the node initialized or not
if((LIN_Node_Status & LIN_FLAG_NOINIT) == LIN_FLAG_NOINIT) return ~bRet;
//Secons, check the node connected or not
if((LIN_Node_Status & LIN_FLAG_DISCONNECT) == LIN_FLAG_DISCONNECT) return ~bRet;
DisableInterrupts;
LIN_Enable(0);
LIN_SCI_SCC2 = SCI_TE + SCI_RE;//Enable transmit & receive data
LIN_SCI_FEIE = 0;//Disable Frame Error Interrupt
//LIN_State_Flags = LIN_FLAG_IGNORE|LIN_FLAG_DISCONNECT;
LIN_Node_Status = LIN_FLAG_DISCONNECT;//|LIN_FLAG_NOT_RDY_FOR_SYNCHBREAK;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
//LIN_SetIdleTimeout();
EnableInterrupts;
return bRet;
}
void LIN_Data_Received(void)
{
//data LIN_TmpByte is the received data
L_U8 uIndex;
L_U8 uMsgID;
L_U8 uMsgLen;
if((LIN_Transceiver_Status & LIN_FLAG_REC_SYNCH) == LIN_FLAG_REC_SYNCH)
{
if(LIN_TmpByte == LIN_SYNCH_CHAR)
{
LIN_Transceiver_Status = LIN_FLAG_REC_HEADER;
#if LIN_DEBUG_MODE == 1
LIN_Debug_PIN_SYNCH = 1;
#endif
}
else
{
//Error when waiting for SYNCH
LIN_Error_Status |= LIN_ERR_SYNCH;
LIN_Err_RxCounter <<= 1;
LIN_Err_RxCounter |= 1;
LIN_Transceiver_Status = LIN_FLAG_IGNORE;
#if LIN_DEBUG_MODE == 1
LIN_Debug_PIN_SYNCH = 1;
#endif
}//if(LIN_TmpByte == LIN_SYNCH_CHAR)
}//if((LIN_Transceiver_Status & LIN_FLAG_REC_SYNCH) == LIN_FLAG_REC_SYNCH)
else if((LIN_Transceiver_Status & LIN_FLAG_REC_HEADER) == LIN_FLAG_REC_HEADER)
{//receive Header char
LIN_RX_Buf[LIN_INDEX_ID] = LIN_TmpByte;
//uIndex = (LIN_Msg_Index[LIN_TmpByte & 0x3f] & 0x3f);
uIndex = LIN_Msg_Index[LIN_TmpByte & 0x3f];
uMsgLen = LIN_MsgLen[uIndex & 0x3f];
if((uIndex & LIN_MSG_SEND) == LIN_MSG_SEND)
{
//We are the publisher of this message
#if LIN_DEBUG_MODE == 1
LIN_Debug_PIN_ID = 1;
#endif
LIN_Transceiver_Status = LIN_FLAG_SEND_DATA;
LIN_Tx_Counter = 0;
//Encode the data
uMsgID = (LIN_TmpByte & 0x3f);
#if LIN_MSG_10 == LIN_MSG_SEND
#define CON_IF_EXIT 1
if(uMsgID == 0x10)
{
if((LIN_Error_Status & LIN_ERR_IN_RESPONSE) == LIN_ERR_IN_RESPONSE)
{
#if LIN_NODE_SEL == LIN_NODE_SW_C
SW_C_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_SW_D
SM_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_FR
FR_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_FL
FL_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_DR
DR_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_DL
DL_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_MR
MR_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_ML
ML_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_RR
R_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_CH
Head_C_Response_Error = 1;
#endif
}//if((LIN_Error_Status & LIN_ERR_IN_RESPONSE) == LIN_ERR_IN_RESPONSE)
Msg_10_Encode();
//response error: send & clear
LIN_Error_Status &= ~LIN_ERR_IN_RESPONSE;
#if LIN_NODE_SEL == LIN_NODE_SW_C
SW_C_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_SW_D
SM_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_FR
FR_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_FL
FL_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_DR
DR_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_DL
DL_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_MR
MR_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_ML
ML_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_RR
R_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_CH
Head_C_Response_Error = 0;
#endif
}//if(uMsgID == 0x10)
#endif
#if LIN_MSG_11 == LIN_MSG_SEND
#ifndef CON_IF_EXIT
#define CON_IF_EXIT 1
#else
else
#endif
if(uMsgID == 0x11)
{
if((LIN_Error_Status & LIN_ERR_IN_RESPONSE) == LIN_ERR_IN_RESPONSE)
{
#if LIN_NODE_SEL == LIN_NODE_SW_C
SW_C_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_SW_D
SM_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_FR
FR_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_FL
FL_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_DR
DR_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_DL
DL_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_MR
MR_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_ML
ML_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_RR
R_Response_Error = 1;
#endif
#if LIN_NODE_SEL == LIN_NODE_CH
Head_C_Response_Error = 1;
#endif
}//if((LIN_Error_Status & LIN_ERR_IN_RESPONSE) == LIN_ERR_IN_RESPONSE)
Msg_11_Encode();
//response error: send & clear
LIN_Error_Status &= ~LIN_ERR_IN_RESPONSE;
#if LIN_NODE_SEL == LIN_NODE_SW_C
SW_C_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_SW_D
SM_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_FR
FR_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_FL
FL_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_DR
DR_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_DL
DL_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_MR
MR_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_ML
ML_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_RR
R_Response_Error = 0;
#endif
#if LIN_NODE_SEL == LIN_NODE_CH
Head_C_Response_Error = 0;
#endif
}
#endif
#if LIN_MSG_12 == LIN_MSG_SEND
#ifndef CON_IF_EXIT
#define CON_IF_EXIT 1
#else
else
#endif
if(uMsgID == 0x12)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -