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

📄 canfunc.c

📁 LPC2119 CAN中断及示范
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        产品一部 
**                                 http://www.zlgmcu.com
**-----------------------------------------------------------文件信息--------------------------------------------------------------------------------
**	文   件  	名:	CANFUNC.C
** 	版  		本:	v1.0
** 	日		期:	2004年2月23日
**	描		述:	CAN模块功能操作函数说明文件
********************************************************************************************************/
#define	_CANFUNC_GLOBAL_
#include "INCLUDES.H"
/*
***********************************************************************************************************
**函数原型	:  	void	HwRstCAN (eCANNUM CanNum)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
**返回值		:	无	
**说	明		:	本函数用于硬件复位CAN控制器,主要是CAN模块掉电,用于省电处理
************************************************************************************************************/
void		HwRstCAN(eCANNUM CanNum)
{
	PCONP &= ~((INT32U)0x01 << (13+CanNum));
}
/*
***********************************************************************************************************
**函数原型	:  	void	HwEnCAN (eCANNUM CanNum)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
**返回值		:	无	
**说	明		:	本函数用于硬件使能CAN控制器
************************************************************************************************************/
void		HwEnCAN(eCANNUM CanNum)
{
	CANAFMR.Bits.AccBP_BIT =1;
	PCONP |= ((INT32U)0x01 << (13+CanNum));
	switch(CanNum)
	{
		
		case	CAN1:
			PINSEL1 &=  ~((INT32U)0x03 << 18);
			PINSEL1 |=  ((INT32U)0x01 << 18);
			break;
		case	CAN2:
			PINSEL1 &=  ~((INT32U)0x0F << 14);
			PINSEL1 |=  ((INT32U)0x05 << 14);
			break;
		/////////////////////////////////////////	
		#if	(CAN_MAX_NUM == 4)
			case	CAN3:
				PINSEL1 &=  ~((INT32U)0x0F << 10);
				PINSEL1 |=  ((INT32U)0x06 << 10);
				break;
			case	CAN4:
				PINSEL1 |=  ((INT32U)0x0F << 24);
				break;
		#endif
		/////////////////////////////////////////
		default:
			break;	
	}
}
/*
***********************************************************************************************************
**函数原型	:  	INT32U	SoftRstCAN (eCANNUM CanNum)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
**返回值		:	=0,表示复位成功; !=0,复位不成功;	
**说	明		:	本函数用于软件复位CAN控制器
************************************************************************************************************/
INT32U		SoftRstCAN(eCANNUM CanNum)
{
	CANMOD(CanNum).Bits.RM_BIT =1;
	return(!CANMOD(CanNum).Bits.RM_BIT );
}
/*
***********************************************************************************************************
**函数原型	:  	INT32U	SoftEnCAN (eCANNUM CanNum)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
**返回值		:	=0,表示成功使CAN控制器进入工作模式; !=0,不成功;	
**说	明		:	本函数用于软件使能CAN控制器
************************************************************************************************************/
INT32U		SoftEnCAN(eCANNUM CanNum)
{
	CANMOD(CanNum).Bits.RM_BIT =0;
	return(CANMOD(CanNum).Bits.RM_BIT );
}
/*
***********************************************************************************************************
**函数原型	:  	void	CanSendCmd(eCANNUM CanNum,INT32U Cmd,INT32U TxBuf)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
				Cmd			à> 发送命令字
				TxBuf		à>	选择发送缓冲区
**返回值		:		
**说	明		:	本函数用于发送命令处理
************************************************************************************************************/
void	CanSendCmd(eCANNUM CanNum,INT32U Cmd,INT32U 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;					//单次发送
			Temp.Bits.TR_BIT =1;
			break;
		case	2:
		case	3:
			if(CANMOD(CanNum).Bits.STM_BIT == 0)	//自发自收
			{
				CANMOD(CanNum).Word =1;
				CANMOD(CanNum).Bits.STM_BIT =1;
				CANMOD(CanNum).Bits.RM_BIT =0;
			}
			Temp.Bits.SRR_BIT =1;
			if(Cmd == 3)							//单次自发自收
			{
				Temp.Bits.AT_BIT =1;
			}
			break;
		case 	0:
		default:									//正常发送
			Temp.Bits.TR_BIT =1;
			break;
	}
	CANCMR(CanNum) = Temp;
}
/*
***********************************************************************************************************
**函数原型	:  	INT32U	WriteCanTxBuf(eCANNUM CanNum,INT32U TxBufNum,
										INT32U TPM,P_stcTxBUF Buf) ;
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
				TxBufNum		à>	选择发送缓冲区
				TPM			à>	发送优先级模式
				Buf			à>	发送到总线的数据
**返回值		:	=0;成功将数据写入发送缓冲区
				!=0;写发送缓冲区操作失败	
**说	明		:	本函数用于向CAN发送缓冲区TxBUF写入发送数据
***********************************************************************************************************
*/
INT32U	WriteCanTxBuf(eCANNUM CanNum,INT32U TxBufNum,INT32U TPM,P_stcTxBUF Buf)
{
	INT32U	status=0;
	switch(TxBufNum)
	{

		case	SEND_TX_BUF1:
			//判断发送缓冲区是否被锁定或者正在发送信息
			if((0== CANSR(CanNum).Bits.TS1_BIT)&&(0 != CANSR(CanNum).Bits.TBS1_BIT))
			{
				CANTFI1(CanNum)=Buf->TxFrameInfo;	//写入帧信息
				CANTID1(CanNum)=Buf->TxCANID;		//写入帧ID
				CANTDA1(CanNum)=Buf->CANTDA;		//写入前1-4字节
				CANTDB1(CanNum)=Buf->CANTDB;		//写入后5-8字节
			}
			else
			{
				status = 0x01;
			}
			break;
		case	SEND_TX_BUF2:
			if((0== CANSR(CanNum).Bits.TS2_BIT)&&(0 !=CANSR(CanNum).Bits.TBS2_BIT))
			{
				CANTFI2(CanNum)=Buf->TxFrameInfo;
				CANTID2(CanNum)=Buf->TxCANID;
				CANTDA3(CanNum)=Buf->CANTDA;
				CANTDB2(CanNum)=Buf->CANTDB;
			}
			else
			{
				status = 0x01;
			}
			break;
		case	SEND_TX_BUF3:
			if((0== CANSR(CanNum).Bits.TS3_BIT)&&(0 != CANSR(CanNum).Bits.TBS3_BIT))
			{
				CANTFI3(CanNum)=Buf->TxFrameInfo;
				CANTID3(CanNum)=Buf->TxCANID;
				CANTDA3(CanNum)=Buf->CANTDA;
				CANTDB3(CanNum)=Buf->CANTDB;
			}
			else
			{
				status = 0x01;
			}
			break;
		default:
			status = 0x01;
			break;
	}
	if(TPM == 1)
	{
		CANMOD(CanNum).Bits.TPM_BIT =1;	//发送优先级由帧的优先级域决定
	}
	return(status);
}
/*
***********************************************************************************************************
**函数原型	:  	void	ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
				Buf			à>	接收CAN总线数据
**返回值		:	
**说	明		:	本函数用于从CAN控制器RxBuf中读取数据
***********************************************************************************************************
*/
void	ReadCanRxBuf(eCANNUM CanNum,P_stcRxBUF Buf)
{
	Buf->CANRcvFS 	=CANRFS(CanNum);
	Buf->RxCANID 	=CANRID(CanNum);
	Buf->CANRDA	=CANRDA(CanNum);
	Buf->CANRDB	=CANRDB(CanNum);
}
/*
***********************************************************************************************************
**函数原型	:  	INT32U 	CanEntrySM(CanNum)
**参数说明	:  	CanNum	-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
**返回值		:	=0;成功进入睡眠状态;
				!=0;不能进入睡眠状态;	
**说	明		:	本函数用于使CAN控制器进入休眠模式
***********************************************************************************************************
*/
INT32U	CanEntrySM(eCANNUM	CanNum)
{
	CANMOD(CanNum).Bits.SM_BIT = 1;	
	return(!CANMOD(CanNum).Bits.SM_BIT);
}
/*
***********************************************************************************************************
**函数原型	:  	INT32U CanQuitSM(eCANNUM	CanNum)
**参数说明	:  	CanNum		-->>	CAN控制器,值不能大于CAN_MAX_NUM 规定的值
**返回值		:	=0;成功退出睡眠状态;
				!=0;不能退出睡眠状态;	
**说	明		:	本函数用于使CAN控制器退出休眠模式
***********************************************************************************************************
*/
INT32U CanQuitSM(eCANNUM	CanNum)	
{
	uCANMod		i;
	i=CANMOD(CanNum);
	CANMOD(CanNum).Bits.RM_BIT=1; 
	CANMOD(CanNum).Bits.SM_BIT = 0;	
	CANMOD(CanNum).Bits.RM_BIT=i.Bits.RM_BIT; 
	return(CANMOD(CanNum).Bits.SM_BIT);
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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