📄 canfunc.c
字号:
/*
*********************************************************************************************************
**函数原型 ; 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 + -