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

📄 canfunc.c

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