📄 af_set.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 *)(®AFRAM);
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 *)®AFRAM;
_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)®AFRAM + (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)®AFRAM + (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)®AFRAM + (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)®AFRAM + (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 + -