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

📄 canfunc.c

📁 CAN现场总线自发自收程序-lpc2290
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
**函数原型	;	void AFSetMode(INT32U mode)
**参数说明	;	mode -->> 验收过滤控制器的模式
**							Bypass =  1
**							normal =  2
**							fullCAN = 3
**							Ignored = 4
**返回值	:	
**
**说明		:	验收控制寄存器的设置函数						  
*********************************************************************************************************
*/
void AFSetMode(INT32U mode)
{
	uCANAFMR afmr;
	afmr.Word = 0;					// initial value!!!

	switch(mode)
	{
	case 1:
		afmr.Bits.AccBP = 1;	// Bypass mode
		break;
	case 2:
		//..						// normal filter
		break;
	case 3:
		afmr.Bits.eFCAN = 1;	// fullCAN mode
		break;
	default:
		afmr.Bits.AccBP = 0;
		afmr.Bits.AccOff = 1;	// all message on CAN buses are ignored
		break;
	}

	CANAFMR = afmr.Word;
}
/*
************************************************************************************************************
**函数原型	:	INT32U AFBuildLUT (INT32U FCAN_nCell,
**								   INT32U SFF_INDV_nCell,
**								   INT32U SFF_GRP_nCell,
**								   INT32U EFF_INDV_nCell,
**								   INT32U EFF_GRP_nCell)
**参数说明	:	FCAN_nCell_Num -->>	FullCAN标准帧滤波单元个数
**				SFF_INDV_nCell_Num -->>	单个标准帧滤波单元个数
**				SFF_GRP_nCell_Num -->>	标准帧范围滤波单元个数
**				EFF_INDV_nCell_Num -->> 单个扩展帧滤波单元个数
**				EFF_GRP_nCell_Num -->>	扩展帧范围滤波单元个数
**
**返回值	:   LUT_SETTING_OK 			= 0,
**				TOTAL_SIZE_TOO_LARGE 	= 1,
**				EFF_GRP_SIZE_INVALID	= 3,
**				FCAN_STORE_SIZE_INVALID = 4,
**
**说明		:	验收过滤寄存器的初始化函数
************************************************************************************************************
*/
INT32U AFBuildLUT( INT32U FCAN_nCell_Num,INT32U SFF_INDV_nCell_Num,
				   INT32U SFF_GRP_nCell_Num,INT32U EFF_INDV_nCell_Num,
				   INT32U EFF_GRP_nCell_Num)
{
	INT32U	i;
	uCANAFMR afmr;
	INT32U tmpREGSFF_sa,tmpREGSFF_GRP_sa,tmpREGEFF_sa;
	INT32U tmpREGEFF_GRP_sa,tmpREGENDofTable;
	INT32U *pU32 = (INT32U *)(CANAFRAM_BADR);
	
	if(4 * (FCAN_nCell_Num + SFF_INDV_nCell_Num + SFF_GRP_nCell_Num + EFF_INDV_nCell_Num + EFF_GRP_nCell_Num) > 0x800)
		return TOTAL_SIZE_TOO_LARGE;

	if((EFF_GRP_nCell_Num % 2) != 0)
		return EFF_GRP_SIZE_INVALID;
	
	tmpREGSFF_sa 		= FCAN_nCell_Num * 4; 
	tmpREGSFF_GRP_sa 	= tmpREGSFF_sa + (SFF_INDV_nCell_Num * 4);
	tmpREGEFF_sa 		= tmpREGSFF_GRP_sa + (SFF_GRP_nCell_Num * 4);
	tmpREGEFF_GRP_sa 	= tmpREGEFF_sa + (EFF_INDV_nCell_Num * 4);
	tmpREGENDofTable 	= tmpREGEFF_GRP_sa + (EFF_GRP_nCell_Num * 4);
	
	afmr.Word = 0;
	afmr.Bits.AccBP = 1;
	CANAFMR = afmr.Word;

	if((0x800 - tmpREGSFF_sa * 6) < tmpREGENDofTable)
	{
		return FCAN_STORE_SIZE_INVALID;
	}

	
	for(i=0;i<(0x800/4);i++)
	{
		*(pU32 + i) = -1;		// disable all AF cell
	}
	CANSFF_sa		= tmpREGSFF_sa;
	CANSFF_GRP_sa	= tmpREGSFF_GRP_sa;
	CANEFF_sa		= tmpREGEFF_sa;
	CANEFF_GRP_sa 	= tmpREGEFF_GRP_sa;
	CANENDofTable 	= tmpREGENDofTable;
	
	return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型	;	INT32U AFInitFCANTab(stcAF_SFF_CELL *pTab,INT32U nCell)
**参数说明	;	pTab -->>	FullCAN 标准帧ID结构数组
**			:	nCell -->>	Cell的个数
**
**返回值	:	LUT_SETTING_OK 	= 0,
**				TABLE_CELL_TOO_LARGE	= 5,
**
**说明		:	FullCAN标准帧表格的初始化
*********************************************************************************************************
*/
INT32U AFInitFCANTab(stcAF_SFF_CELL *pTab,INT32U nCell)
{
	uCANAFMR afmr;
	INT32U bakAfmr;
	INT32U i;
	
	stcAF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
	stcAF_SFF_CELL *pU32 = (stcAF_SFF_CELL *)(CANAFRAM_BADR);
	
	if(nCell > (CANSFF_sa / 4))
		return TABLE_CELL_TOO_LARGE;

	afmr.Word = CANAFMR;
	bakAfmr = afmr.Word;
	afmr.Bits.AccBP = 1;
	CANAFMR = afmr.Word;

	
	for(i=0;i<(CANSFF_GRP_sa/4);i++)
	{
		*(pU32 + i) = mask;			// disable all AF cell
	}

	for(i=0;i<nCell;i++)
	{
		*(pU32 + i) = *(pTab+i);	// set filter cell
	}
	
	CANAFMR = bakAfmr;
	
	return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型	;	INT32U AFInitSFFIndvTab(stcAF_SFF_CELL *pTab,INT32U nCell)
**参数说明	;	pTab -->>	标准帧ID结构数组
**			:	nCell -->>	Cell的个数
**
**返回值	:	LUT_SETTING_OK 	= 0,
**				TABLE_CELL_TOO_LARGE	= 5,
**
**说明		:	单独标准帧表格的初始化
*********************************************************************************************************
*/
INT32U AFInitSFFIndvTab(stcAF_SFF_CELL *pTab,INT32U nCell)
{
	INT32U i;
	uCANAFMR afmr;
	INT32U bakAfmr;
	stcAF_SFF_CELL *pU32 = (stcAF_SFF_CELL *)((INT32U)CANAFRAM_BADR + (INT32U)(CANSFF_sa));
	stcAF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
	
	if(nCell > ((CANSFF_GRP_sa-CANSFF_sa) / 4))
		return TABLE_CELL_TOO_LARGE;

	afmr.Word = CANAFMR;
	bakAfmr = afmr.Word;
	afmr.Bits.AccBP = 1;
	CANAFMR = afmr.Word;

	for(i=0;i<((CANSFF_GRP_sa-CANSFF_sa)/4);i++)
	{
		*(pU32 + i) = mask;			// disable all AF cell
	}

	for(i=0;i<nCell;i++)
	{
		*(pU32 + i) = *(pTab+i);	// set filter cell
	}
	
	CANAFMR = bakAfmr;
	
	return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型	;	INT32U AFInitSFFGrpTab(_AF_SFF_CELL *pTab,UINT32 nCell)
**参数说明	;	pTab -->>	标准帧ID结构数组
**			:	nCell -->>	Cell的个数
**
**返回值	:	LUT_SETTING_OK 	= 0,
**				TABLE_CELL_TOO_LARGE	= 5,
**
**说明		:	标准帧范围表格的初始化
*********************************************************************************************************
*/
INT32U AFInitSFFGrpTab(stcAF_SFF_CELL *pTab,INT32U nCell)
{
	INT32U	i;
	uCANAFMR afmr;
	INT32U bakAfmr;
	stcAF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
	stcAF_SFF_CELL *pU32 = (stcAF_SFF_CELL *)((INT32U)CANAFRAM_BADR + (INT32U)(CANSFF_GRP_sa));
	
	if(nCell > ((CANEFF_sa - CANSFF_GRP_sa) / 4))
		return TABLE_CELL_TOO_LARGE;

	afmr.Word = CANAFMR;
	bakAfmr = afmr.Word;
	afmr.Bits.AccBP = 1;
	CANAFMR = afmr.Word;

	for(i=0;i<((CANEFF_sa - CANSFF_GRP_sa)/4);i++)
	{
		*(pU32 + i) = mask;			// disable all AF cell
	}

	for(i=0;i<nCell;i++)
	{
		*(pU32 + i) = *(pTab+i);	// set filter cell
	}
	
	CANAFMR = bakAfmr;
	return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型	;	INT32U AFInitEFFIndvTab(stcAF_EFF_CELL *pTab,INT32U nCell)
**参数说明	;	pTab -->>	扩展帧ID结构数组
**			:	nCell -->>	Cell的个数
**
**返回值	:	LUT_SETTING_OK 	= 0,
**				TABLE_CELL_TOO_LARGE	= 5,
**
**说明		:	单独扩展帧表格的初始化
*********************************************************************************************************
*/
INT32U AFInitEFFIndvTab(stcAF_EFF_CELL *pTab,INT32U nCell)
{
	INT32U		i;
	uCANAFMR	afmr;
	INT32U		bakAfmr;
	stcAF_EFF_CELL mask = {-1,-1};
	stcAF_EFF_CELL *pU32 = (stcAF_EFF_CELL *)((INT32U)CANAFRAM_BADR + (INT32U)(CANEFF_sa));
	
	if(nCell > ((CANEFF_GRP_sa-CANEFF_sa) / 4))
		return TABLE_CELL_TOO_LARGE;
	afmr.Word = CANAFMR;
	bakAfmr = afmr.Word;
	afmr.Bits.AccBP = 1;
	CANAFMR = afmr.Word;

	for(i=0;i<((CANEFF_GRP_sa-CANEFF_sa)/4);i++)
	{
		*(pU32 + i) = mask;			// disable all AF cell
	}

	for(i=0;i<nCell;i++)
	{
		*(pU32 + i) = *(pTab+i);	// set filter cell
	}
	
	CANAFMR = bakAfmr;
	
	return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型	;	INT32U AFInitEFFGrpTab(stcAF_EFF_CELL *pTab,INT32U nCell)
**参数说明	;	pTab -->>	扩展帧ID结构数组
**			:	nCell -->>	Cell的个数
**
**返回值	:	LUT_SETTING_OK 	= 0,
**				TABLE_CELL_TOO_LARGE	= 5,
**				CELL_NUM_INVALID		= 6,
**
**说明		:	扩展帧范围表格的初始化
*********************************************************************************************************
*/
INT32U AFInitEFFGrpTab(stcAF_EFF_CELL *pTab,INT32U nCell)
{
	INT32U		i;
	uCANAFMR 	afmr;
	INT32U 		bakAfmr;
	stcAF_EFF_CELL mask = {-1,-1};
	stcAF_EFF_CELL *pU32 = (stcAF_EFF_CELL *)((INT32U)CANAFRAM_BADR + (INT32U)(CANEFF_GRP_sa));
	
	if((nCell % 2) != 0)
		return CELL_NUM_INVALID;
	if(nCell > ((CANENDofTable- CANEFF_GRP_sa) / 4))
		return TABLE_CELL_TOO_LARGE;
	afmr.Word = CANAFMR;
	bakAfmr = afmr.Word;
	afmr.Bits.AccBP = 1;
	CANAFMR = afmr.Word;
	
	for(i=0;i<((CANENDofTable- CANEFF_GRP_sa)/4);i++)
	{
		*(pU32 + i) = mask;			// disable all AF cell
	}

	for(i=0;i<nCell;i++)
	{
		*(pU32 + i) = *(pTab+i);	// set filter cell
	}
	
	CANAFMR = bakAfmr;
	
	return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型	;	INT32U AFReadFCANRxResurt(_AF_AUTOSTORE_MSG *pMsg,UINT32 IdIndex)
**参数说明	;	pMsg -->>	FullCAN中自动保存的信息的ID结构
**			:	nCell -->>	FullCAN自动接收完毕后生成的索引		  
*********************************************************************************************************
*/
INT32U AFReadFCANRxResurt(stcAF_AUTOSTORE_MSG *pMsg,INT32U IdIndex)
{
	INT32U state = -1;
	stcAF_AUTOSTORE_MSG *pTmp;
	pTmp = (stcAF_AUTOSTORE_MSG *)((INT32U)CANAFRAM_BADR + (INT32U)CANENDofTable + (INT32U)(IdIndex * 12));

	if(pTmp->Head.SEM == 0x03)		//SEM = 11(b)
	{
		pTmp->Head.SEM = 0x00;		// set flag to begin read message...
		*pMsg = *pTmp;
		if(pTmp->Head.SEM != 0x00)	// flag check...
			state = 1;	//update continue...
		else
			state = 2;	//get a correct message!
	}
	else
		state = 0;		//not any update after last access.
	return state;
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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