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

📄 af_set.c

📁 lpc2368关于can模块的代码 对于从事此方面的兄弟有一定帮助
💻 C
字号:
/****************************************Copyright (c)**************************************************
***文件名称:CAN验收滤波测试程序
***作者:张利刚
***单位:中科院微系统所嘉兴分中心网络组
***时间:2008年7月17日
********************************************************************************************************/



#include	"config.h"
#include	"AF_SET.h"
#include	"LPC2300CAN.h"
/*********************************************************************************************************
**函数原型		:  	unsigned long AF_Build_LUT(unsigned long FCAN_ncell,
											   unsigned long SFF_INIV_ncell,
											   unsigned long SFF_GRP_ncell,
											   unsigned long EFF_INIV_ncell,
											   unsigned long EFF_GRP_ncell);
**参数说明		:  	各个表的大小
**返回值		:	枚举类型定义
**说	明		:	定义并初始化LOOK UP TABLE
**作者:	张利刚
**时间:	2008年7月17日
*********************************************************************************************************/
unsigned long AF_Build_LUT(unsigned long FCAN_nCell,unsigned long SFF_INIV_nCell,unsigned long SFF_GRP_nCell,unsigned long EFF_INIV_nCell,unsigned long EFF_GRP_nCell)
{
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	
	//定义临时变量
	unsigned long tmpREGSFF_sa,tmpREGSFF_GRP_sa,tmpREGEFF_sa;
	unsigned long tmpREGEFF_GRP_sa,tmpREGENDofTable;
	
	_CANAFMR	afmr;
	
	unsigned int i;
	unsigned long *pUINT32 = (unsigned long *)(&REGAFRAM);
	
	if(4*(FCAN_nCell + SFF_INIV_nCell + SFF_GRP_nCell+ EFF_INIV_nCell + EFF_GRP_nCell) > 0x800)
	{
		return TOTAL_SIZE_TOO_LARGE;
	}//定义cell表格个数太多
	
	if((EFF_GRP_nCell % 2) !=0)
	{
		return EFF_GRP_SIZE_INVALID;
	}//如果扩展帧范围标识符表格不为偶数个,表明创建扩展帧表格时错误
	
	
	//定义各个表格的大小
	tmpREGSFF_sa		=FCAN_nCell * 4;
	tmpREGSFF_GRP_sa	=tmpREGSFF_sa + (SFF_INIV_nCell * 4);
	tmpREGEFF_sa		=tmpREGSFF_GRP_sa + (SFF_GRP_nCell * 4);
	tmpREGEFF_GRP_sa	=tmpREGEFF_sa + (EFF_INIV_nCell * 4);
	tmpREGENDofTable	=tmpREGEFF_GRP_sa + (EFF_GRP_nCell * 4);
	
	if((0x800 - tmpREGSFF_sa * 6) < tmpREGENDofTable)
	{
		return FCAN_STORE_SIZE_INVALID;
	}
	

	afmr.value = 0;
	afmr.Bits.AccBP = 1;		//初始化LOOK UP TABLE 之前必须先置位旁路为,关闭验收滤波
	regaddr = (unsigned long)(&CAN_AFMR);
	RGE(regaddr)=afmr.value;
	

	for(i =0;i <(tmpREGENDofTable / 4);i++)
	{
		*(pUINT32 + i) = -1;//禁能所有AF Cell
	}
	
	for(i=(tmpREGENDofTable / 4);i<0x800;i++)
	{
		*(pUINT32 + i) = 0;//清除所有FULLCAN 自动存储RAM
	}
	
	regaddr = (unsigned long)(&CAN_SFF_SA);
	RGE(regaddr)=tmpREGSFF_sa;
	
	
	regaddr = (unsigned long)(&CAN_SFF_GRP_SA);
	RGE(regaddr)=tmpREGSFF_GRP_sa;
	
	regaddr = (unsigned long)(&CAN_EFF_SA);
	RGE(regaddr)=tmpREGEFF_sa;
	
	regaddr = (unsigned long)(&CAN_EFF_GRP_SA);
	RGE(regaddr)=tmpREGEFF_GRP_sa;
	
	regaddr = (unsigned long)(&CAN_EOT);
	RGE(regaddr)=tmpREGENDofTable;
	
	return LUT_SETTING_OK;
}


/**************************************************************************
**函数原型		:  	void AF_SetMode(unsigned long mode);
**参数说明		:  	模式:1、旁路模式,所有的CAN报文将被接收
						  2、正常接收滤波模式
						  3、FullCAN模式
						  0或者其他,所有的CAN总线的报文将被忽略
**返回值		:	无
**说	明		:	CAN控制器设置各种模式
**作者:	张利刚
**时间:	2008年7月17日
*****************************************************************************/
void AF_SetMode(unsigned long mode)
{	
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	_CANAFMR afmr;
	afmr.value = 0;
	
	switch(mode)
	{
		case 1:
			afmr.Bits.AccBP = 1;//Bypass mode
			break;
		
		case 2:
			break;
		
		case 3:
			afmr.Bits.eFCAN =1;
			break;
		default:
			afmr.Bits.AccBP =0;
			afmr.Bits.AccOff =1;
			break;
	}
	regaddr = (unsigned long)(&CAN_AFMR);
	RGE(regaddr)=afmr.value;
	
}


/******************************************************
***函数原型:unsigned long AFInitFCANTab(_AF_SFF_CELL *pTab,unsigned long nCell);
***功能:	初始化FullCAN表格
***参数:	pTab表格地址,
***			nCell表格占用CELL的个数
***
***返回值:	参看枚举类型定义
**作者:	张利刚
**时间:	2008年7月17日
********************************************************/
unsigned long AFInitFCANTab(_AF_SFF_CELL *pTab,unsigned long nCell)
{
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	unsigned int i;
	unsigned long backupAfmr;
	
	_CANAFMR afmr;	
	
	_AF_SFF_CELL *pUINT32 = (_AF_SFF_CELL *)&REGAFRAM;
	_AF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
	
	if(nCell > (CAN_SFF_SA /4))
	{
		return TABLE_CELL_TOO_LARGE;
	}
	
	for(i = 0;i < nCell;i++)
	{
		if(pTab->LoCh !=pTab->UpCh || pTab->LoId >= pTab->UpId)
		{
			return CELL_CONTENT_INVALID;
		}
	} 
	
	

	regaddr = (unsigned long)(&CAN_AFMR);
	afmr.value = RGE(regaddr);
	backupAfmr = afmr.value;
	afmr.Bits.AccBP = 1;
	RGE(regaddr) = afmr.value;
	
	
	for(i = 0;i<(CAN_SFF_SA / 4);i++)
	{
		*(pUINT32 + i) = mask;//禁能所有AF cell
	}
	
	
	for(i = 0;i<nCell;i++)
	{
		*(pUINT32 + i) = *(pTab + i);//设置 cell
	}
	
	RGE(regaddr) = backupAfmr;
	
	return LUT_SETTING_OK;
}						   


/******************************************************
***函数原型:AFInitSFFInivTab(_AF_SFF_CELL *pTab,unsigned long nCell);
***功能:	初始化独立标准帧表格
***参数:	pTab表格地址,
***			nCell表格占用CELL的个数
***
***返回值:	参看枚举类型定义
**作者:	张利刚
**时间:	2008年7月17日
********************************************************/
unsigned long AFInitSFFInivTab(_AF_SFF_CELL *pTab,unsigned long nCell)
{
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	unsigned int i;
	unsigned long backupAfmr;
	
	_CANAFMR afmr;
	
	//定义指针,用以指向要初始化和开辟的首地址
	_AF_SFF_CELL *pUINT32 = (_AF_SFF_CELL *)((unsigned long)&REGAFRAM + (unsigned long)(CAN_SFF_SA));
	_AF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
	
	if(nCell > ((CAN_SFF_GRP_SA - CAN_SFF_SA)/4))
	{
		return TABLE_CELL_TOO_LARGE;
	}
	
	
	regaddr = (unsigned long)(&CAN_AFMR);
	afmr.value = RGE(regaddr);
	backupAfmr = afmr.value;
	afmr.Bits.AccBP = 1;
	RGE(regaddr) = afmr.value;
	
	
	
	
	for(i = 0;i<((CAN_SFF_GRP_SA - CAN_SFF_SA) / 4);i++)
	{
		*(pUINT32 + i) = mask;//禁能所有AF cell
	}
	
	for(i = 0;i<nCell;i++)
	{
		*(pUINT32 + i) = *(pTab + i);//设置滤波cell
	}
	
	RGE(regaddr) = backupAfmr;
	
	return LUT_SETTING_OK;
	
}


/******************************************************
***函数原型:AFInitGrpTab(_AF_SFF_CELL *pTab,unsigned long nCell);
***功能:	初始化标准帧范围表格
***参数:	pTab表格地址,
***			nCell表格占用CELL的个数
***
***返回值:	参看枚举类型定义
**作者:	张利刚
**时间:	2008年7月17日
********************************************************/
unsigned long AFInitSFFGrpTab(_AF_SFF_CELL *pTab,unsigned long nCell)
{
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	unsigned int i;
	unsigned long backupAfmr;
	
	_CANAFMR afmr;
	
	
	//定义指针,用以指向要初始化和开辟的首地址
	_AF_SFF_CELL *pUINT32 = (_AF_SFF_CELL *)((unsigned long)&REGAFRAM + (unsigned long)(CAN_SFF_GRP_SA));
	_AF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
	
	
	if(nCell > ((CAN_EFF_SA - CAN_SFF_GRP_SA)/4))
	{
		return TABLE_CELL_TOO_LARGE;
	}
	
	
	regaddr = (unsigned long)(&CAN_AFMR);
	afmr.value = RGE(regaddr);
	backupAfmr = afmr.value;
	afmr.Bits.AccBP = 1;
	RGE(regaddr) = afmr.value;
	
	
	
	
	for(i = 0;i<((CAN_EFF_SA - CAN_SFF_GRP_SA) / 4);i++)
	{
		*(pUINT32 + i) = mask;//禁能所有AF cell
	}
	
	for(i = 0;i<nCell;i++)
	{
		*(pUINT32 + i) = *(pTab + i);//设置滤波cell
	}
	
	RGE(regaddr) = backupAfmr;
	
	return LUT_SETTING_OK;
	
}


/******************************************************
***函数原型:AFInitEFFInivTab(_AF_SFF_CELL *pTab,unsigned long nCell);
***功能:	初始化独立扩展帧标识符范围表格
***参数:	pTab表格地址,
***			nCell表格占用CELL的个数
***
***返回值:	参看枚举类型定义
**作者:	张利刚
**时间:	2008年7月17日
********************************************************/
unsigned long AFInitEFFInivTab(_AF_EFF_CELL *pTab,unsigned long nCell)
{
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	unsigned int i;
	unsigned long backupAfmr;
	
	_CANAFMR afmr;
	
	//定义指针,用以指向要初始化和开辟的首地址
	_AF_EFF_CELL *pUINT32 = (_AF_EFF_CELL *)((unsigned long)&REGAFRAM + (unsigned long)(CAN_EFF_SA));
	_AF_EFF_CELL mask = {-1,-1};
	
	
	if(nCell > ((CAN_EFF_GRP_SA - CAN_EFF_SA)/4))
	{
		return TABLE_CELL_TOO_LARGE;
	}
	
	
	regaddr = (unsigned long)(&CAN_AFMR);
	afmr.value = RGE(regaddr);
	backupAfmr = afmr.value;
	afmr.Bits.AccBP = 1;
	RGE(regaddr) = afmr.value;

	
	
	for(i = 0;i<((CAN_EFF_GRP_SA - CAN_EFF_SA) / 4);i++)
	{
		*(pUINT32 + i) = mask;//禁能所有AF cell
	}
	
	for(i = 0;i<nCell;i++)
	{
		*(pUINT32 + i) = *(pTab + i);//设置滤波cell
	}
	
	RGE(regaddr) = backupAfmr;
	
	
	return LUT_SETTING_OK;
	
}


/******************************************************
***函数原型:AFInitEFFGrpTab(_AF_SFF_CELL *pTab,unsigned long nCell);
***功能:	初始化扩展帧标识符范围表格
***参数:	pTab表格地址,
***			nCell表格占用CELL的个数
***
***返回值:	参看枚举类型定义
**作者:	张利刚
**时间:	2008年7月17日
********************************************************/
unsigned long AFInitEFFGrpTab(_AF_EFF_CELL *pTab,unsigned long nCell)
{
	//定义临时变量,方便存取和修改寄存器内容
	unsigned long regaddr;
	unsigned int i;
	unsigned long backupAfmr;
	
	_CANAFMR afmr;
	
	
	//定义指针,用以指向要初始化和开辟的首地址
	_AF_EFF_CELL *pUINT32 = (_AF_EFF_CELL *)((unsigned long)&REGAFRAM + (unsigned long)(CAN_EFF_GRP_SA));
	_AF_EFF_CELL mask = {-1,-1};
	
	
	if(nCell % 2 != 0)
	{
		return CELL_NUM_INVALID;
	}
	
	
	if(nCell > ((CAN_EOT - CAN_EFF_GRP_SA)/4))
	{
		return TABLE_CELL_TOO_LARGE;
	}
	
	
	regaddr = (unsigned long)(&CAN_AFMR);
	afmr.value = RGE(regaddr);
	backupAfmr = afmr.value;
	afmr.Bits.AccBP = 1;
	RGE(regaddr) = afmr.value;
	
	
	
	for(i = 0;i<((CAN_EOT - CAN_EFF_GRP_SA) / 4);i++)
	{
		*(pUINT32 + i) = mask;//禁能所有AF cell
	}
	
	for(i = 0;i<nCell;i++)
	{
		*(pUINT32 + i) = *(pTab + i);//设置滤波cell
	}
	
	RGE(regaddr) = backupAfmr;
	
	return LUT_SETTING_OK;
	
}


					   

⌨️ 快捷键说明

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