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

📄 drv_can.c

📁 该模板使用于周立功公司研发的EasyARM2100系列开发板
💻 C
字号:
/**************************************************************************************************
  Copyright (C),  2007-2008, wanyi Tech. Co., Ltd.
  FileName		: drv_can.c
  Author		: kevin 
  modify		:       
  Version 		: 1.0          
  Date			: 2008-4-25
  Description	: auto design for driver can function       
  Function List	: 
				  void			HwEnCAN(eCANNUM CanNum);
				  unsigned int	SoftRstCAN(eCANNUM CanNum);
				  unsigned int	SoftEnCAN(eCANNUM CanNum);
				  unsigned int	CanEntrySM(eCANNUM	CanNum);
				  unsigned int 	CanQuitSM(eCANNUM	CanNum);
				  void			CanSendCmd(eCANNUM CanNum,UINT32 Cmd,UINT32 TxBuf);
				  unsigned int	WriteCanTxBuf(eCANNUM CanNum,UINT32 TxBufNum,UINT32 TPM,P_stcTxBUF Buf) ;
				  void			ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf);
***************************************************************************************************/
#include "\inc\system.h"






/**************************************************************************************************
  Function:       // void HwRstCAN (eCANNUM CanNum)
  Description:    // close can to save power
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
  Output:         // none
  Return:         // void
  Others:         // none
***************************************************************************************************/
void HwRstCAN(eCANNUM CanNum)
{
	PCONP &= ~((unsigned int)0x01 << (13+CanNum));								//close can
}
//=================================================================================================



/**************************************************************************************************
  Function:       // void HwEnCAN (eCANNUM CanNum)
  Description:    // open can
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
  Output:         // none
  Return:         // void
  Others:         // none
***************************************************************************************************/
void HwEnCAN(eCANNUM CanNum)
{
	regCANAFMR.Bits.AccBP_BIT =1;
	PCONP |= ((unsigned int)0x01 << (13+CanNum));								//open can
}
//=================================================================================================



/**************************************************************************************************
  Function:       // unsigned int SoftRstCAN(eCANNUM CanNum)
  Description:    // for software reset can controller 
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
  Output:         // none
  Return:         // 0-->reset success; other-->error;
  Others:         // none
***************************************************************************************************/
unsigned int SoftRstCAN(eCANNUM CanNum)
{
	regCANMOD(CanNum).Bits.RM_BIT =1;											//reset can
	
	return(!regCANMOD(CanNum).Bits.RM_BIT );
}
//=================================================================================================



/**************************************************************************************************
  Function:       // unsigned int SoftEnCAN (eCANNUM CanNum)
  Description:    // for software enable can controller 
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
  Output:         // none
  Return:         // 0-->reset success; other-->error;
  Others:         // none
***************************************************************************************************/
unsigned int SoftEnCAN(eCANNUM CanNum)
{
	regCANMOD(CanNum).Bits.RM_BIT =0;											//normalize can
	
	return(regCANMOD(CanNum).Bits.RM_BIT );
}
//=================================================================================================



/**************************************************************************************************
  Function:       // unsigned int CanEntrySM(CanNum) 
  Description:    // set can controller to sleep mode
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
  Output:         // none
  Return:         // 0-->success to sleep; other-->error
  Others:         // none
***************************************************************************************************/
unsigned int CanEntrySM(eCANNUM	CanNum)
{
	regCANMOD(CanNum).Bits.SM_BIT = 1;											//normal mode
	
	return(!regCANMOD(CanNum).Bits.SM_BIT);
}
//=================================================================================================



/**************************************************************************************************
  Function:       // unsigned int CanQuitSM(eCANNUM	CanNum)
  Description:    // set can controller out sleep mode
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
  Output:         // none
  Return:         // 0-->success out sleep; other-->error
  Others:         // none
***************************************************************************************************/
unsigned int CanQuitSM(eCANNUM	CanNum)	
{
	uCANMod		i;
	
	i=regCANMOD(CanNum);
	regCANMOD(CanNum).Bits.RM_BIT=1; 											//reset can
	regCANMOD(CanNum).Bits.SM_BIT = 0;											//sleep mode	
	regCANMOD(CanNum).Bits.RM_BIT=i.Bits.RM_BIT; 
	
	return(regCANMOD(CanNum).Bits.SM_BIT);
}
//=================================================================================================



/**************************************************************************************************
  Function:       // void CanSendCmd(eCANNUM CanNum,unsigned int Cmd,unsigned int TxBuf)
  Description:    // can send command
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
					 Cmd   -->command word
					 TxBuf -->send buffer
  Output:         // none
  Return:         // void
  Others:         // none
***************************************************************************************************/
void CanSendCmd(eCANNUM CanNum,unsigned int Cmd,unsigned int TxBuf)
{
	uCANCMR Temp;
	
	Temp.Word =0;
	Temp.Bits.STB1_BIT = TxBuf & 0x00000001;
	Temp.Bits.STB2_BIT = (TxBuf & 0x00000002)>>1;
	Temp.Bits.STB3_BIT = (TxBuf & 0x00000004)>>2;
	switch(Cmd)
	{
		case 1:
			Temp.Bits.AT_BIT =1;												//cancel all sending data
			Temp.Bits.TR_BIT =1;												//send request
			break;
		case 2:
		case 3:																	
			if(regCANMOD(CanNum).Bits.STM_BIT ==0)								//send infor must be answered
			{
				regCANMOD(CanNum).Word =1;										//only RM=1
				regCANMOD(CanNum).Bits.STM_BIT =1;								//self test mode 
				regCANMOD(CanNum).Bits.RM_BIT =0;								//can normal work
			}
			Temp.Bits.SRR_BIT =1;
			if(Cmd == 3)														//self receive request
			{
				Temp.Bits.AT_BIT =1;											//cancel all sending data
			}
			break;
		case 	0:
		default:																
			Temp.Bits.TR_BIT =1;												//send request
			break;
	}
	regCANCMR(CanNum) = Temp;													//write can command reg
}
//=================================================================================================



/**************************************************************************************************
  Function:       // unsigned int	WriteCanTxBuf(eCANNUM CanNum,unsigned int TxBufNum,unsigned int TPM,P_stcTxBUF Buf)
  Description:    // write data to buffer"TxBUF"
  Calls:          // none
  Called By:      // none
  Table Accessed: // none
  Table Updated:  // none
  Input:          // CanNum  -->the can controller channel,must be <=CAN_MAX_NUM
					 TxBufNum-->to be writed send buffer channel
				     TPM	 -->send priority mode
				     Buf	 -->data to be sended to buffer
  Output:         // none
  Return:         // 0-->write success; other-->error
  Others:         // none
***************************************************************************************************/
unsigned int WriteCanTxBuf(eCANNUM CanNum,unsigned int TxBufNum,unsigned int TPM,P_stcTxBUF Buf)
{
	unsigned int	status=0;
	
	switch(TxBufNum)
	{
		case	SEND_TX_BUF1:
			if((0==regCANSR(CanNum).Bits.TS1_BIT)&&(0 != regCANSR(CanNum).Bits.TBS1_BIT))
			{
				regCANTFI1(CanNum)=Buf->TxFrameInfo;
				regCANTID1(CanNum)=Buf->TxCANID;
				regCANTDA1(CanNum)=Buf->CANTDA;
				regCANTDB1(CanNum)=Buf->CANTDB;
			}
			else
			{
				status = 0x01;
			}
			break;
		case	SEND_TX_BUF2:
			if((0== regCANSR(CanNum).Bits.TS2_BIT)&&(0 !=regCANSR(CanNum).Bits.TBS2_BIT))
			{
				regCANTFI2(CanNum)=Buf->TxFrameInfo;
				regCANTID2(CanNum)=Buf->TxCANID;
				regCANTDA3(CanNum)=Buf->CANTDA;
				regCANTDB2(CanNum)=Buf->CANTDB;
			}
			else
			{
				status = 0x01;
			}
			break;
		case	SEND_TX_BUF3:
			if((0== regCANSR(CanNum).Bits.TS3_BIT)&&(0 != regCANSR(CanNum).Bits.TBS3_BIT))
			{
				regCANTFI3(CanNum)=Buf->TxFrameInfo;
				regCANTID3(CanNum)=Buf->TxCANID;
				regCANTDA3(CanNum)=Buf->CANTDA;
				regCANTDB3(CanNum)=Buf->CANTDB;
			}
			else
			{
				status = 0x01;
			}
			break;
		default:
			status = 0x01;
			break;
	}
	if(TPM == 1)
	{
		regCANMOD(CanNum).Bits.TPM_BIT =1;
	}
	return(status);
}
//=================================================================================================



/**************************************************************************************************
  Function:       // void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf) 
  Description:    // read data from buffer"RxBuf"
  Calls:          // none
  Called By:      // none
  Table Accessed: // CanNum-->the can controller channel,must be <=CAN_MAX_NUM
				     Buf   -->receive buffre data
  Table Updated:  // none
  Input:          // none
  Output:         // none
  Return:         // void
  Others:         // none
***************************************************************************************************/
void ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
{
	Buf->CANRcvFS 	=regCANRFS(CanNum);
	Buf->RxCANID 	=regCANRID(CanNum);
	Buf->CANRDA		=regCANRDA(CanNum);
	Buf->CANRDB		=regCANRDB(CanNum);
}
//=================================================================================================



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -