⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lin_driver08.c

📁 此程序为DP256的SPI实验程序,已经通过实验证明
💻 C
📖 第 1 页 / 共 4 页
字号:
#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 + -