📄 canfunc.c
字号:
** 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,
**
**说明 : 验收过滤寄存器的初始化函数
************************************************************************************************************
*/
UINT32 AFBuildLUT( UINT32 FCAN_nCell_Num,UINT32 SFF_INDV_nCell_Num,
UINT32 SFF_GRP_nCell_Num,UINT32 EFF_INDV_nCell_Num,
UINT32 EFF_GRP_nCell_Num)
{
UINT32 i;
uCANAFMR afmr;
UINT32 tmpREGSFF_sa,tmpREGSFF_GRP_sa,tmpREGEFF_sa;
UINT32 tmpREGEFF_GRP_sa,tmpREGENDofTable;
UINT32 *pU32 = (UINT32 *)(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_BIT = 1;
CANAFMR.Word = 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.Word = tmpREGSFF_sa;
CANSFF_GRP_sa.Word = tmpREGSFF_GRP_sa;
CANEFF_sa.Word = tmpREGEFF_sa;
CANEFF_GRP_sa.Word = tmpREGEFF_GRP_sa;
CANENDofTable.Word = 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标准帧表格的初始化
*********************************************************************************************************
*/
UINT32 AFInitFCANTab(stcAF_SFF_CELL *pTab,UINT32 nCell)
{
uCANAFMR afmr;
UINT32 bakAfmr;
UINT32 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.Word / 4))
return TABLE_CELL_TOO_LARGE;
afmr.Word = CANAFMR.Word;
bakAfmr = afmr.Word;
afmr.Bits.AccBP_BIT = 1;
CANAFMR.Word = afmr.Word;
for(i=0;i<(CANSFF_GRP_sa.Word/4);i++)
{
*(pU32 + i) = mask; // disable all AF cell
}
for(i=0;i<nCell;i++)
{
*(pU32 + i) = *(pTab+i); // set filter cell
}
CANAFMR.Word = 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,
**
**说明 : 单独标准帧表格的初始化
*********************************************************************************************************
*/
UINT32 AFInitSFFIndvTab(stcAF_SFF_CELL *pTab,UINT32 nCell)
{
UINT32 i;
uCANAFMR afmr;
UINT32 bakAfmr;
stcAF_SFF_CELL *pU32 = (stcAF_SFF_CELL *)((UINT32)CANAFRAM_BADR + (UINT32)(CANSFF_sa.Word));
stcAF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
if(nCell > ((CANSFF_GRP_sa.Word-CANSFF_sa.Word) / 4))
return TABLE_CELL_TOO_LARGE;
afmr.Word = CANAFMR.Word;
bakAfmr = afmr.Word;
afmr.Bits.AccBP_BIT = 1;
CANAFMR.Word = afmr.Word;
for(i=0;i<((CANSFF_GRP_sa.Word-CANSFF_sa.Word)/4);i++)
{
*(pU32 + i) = mask; // disable all AF cell
}
for(i=0;i<nCell;i++)
{
*(pU32 + i) = *(pTab+i); // set filter cell
}
CANAFMR.Word = 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,
**
**说明 : 标准帧范围表格的初始化
*********************************************************************************************************
*/
UINT32 AFInitSFFGrpTab(stcAF_SFF_CELL *pTab,UINT32 nCell)
{
UINT32 i;
uCANAFMR afmr;
UINT32 bakAfmr;
stcAF_SFF_CELL mask = {-1,-1,-1,-1,-1,-1,-1,-1};
stcAF_SFF_CELL *pU32 = (stcAF_SFF_CELL *)((UINT32)CANAFRAM_BADR + (UINT32)(CANSFF_GRP_sa.Word));
if(nCell > ((CANEFF_sa.Word - CANSFF_GRP_sa.Word) / 4))
return TABLE_CELL_TOO_LARGE;
afmr.Word = CANAFMR.Word;
bakAfmr = afmr.Word;
afmr.Bits.AccBP_BIT = 1;
CANAFMR.Word = afmr.Word;
for(i=0;i<((CANEFF_sa.Word - CANSFF_GRP_sa.Word)/4);i++)
{
*(pU32 + i) = mask; // disable all AF cell
}
for(i=0;i<nCell;i++)
{
*(pU32 + i) = *(pTab+i); // set filter cell
}
CANAFMR.Word = 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,
**
**说明 : 单独扩展帧表格的初始化
*********************************************************************************************************
*/
UINT32 AFInitEFFIndvTab(stcAF_EFF_CELL *pTab,UINT32 nCell)
{
UINT32 i;
uCANAFMR afmr;
UINT32 bakAfmr;
stcAF_EFF_CELL mask = {-1,-1};
stcAF_EFF_CELL *pU32 = (stcAF_EFF_CELL *)((UINT32)CANAFRAM_BADR + (UINT32)(CANEFF_sa.Word));
if(nCell > ((CANEFF_GRP_sa.Word-CANEFF_sa.Word) / 4))
return TABLE_CELL_TOO_LARGE;
afmr.Word = CANAFMR.Word;
bakAfmr = afmr.Word;
afmr.Bits.AccBP_BIT = 1;
CANAFMR.Word = afmr.Word;
for(i=0;i<((CANEFF_GRP_sa.Word-CANEFF_sa.Word)/4);i++)
{
*(pU32 + i) = mask; // disable all AF cell
}
for(i=0;i<nCell;i++)
{
*(pU32 + i) = *(pTab+i); // set filter cell
}
CANAFMR.Word = 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,
**
**说明 : 扩展帧范围表格的初始化
*********************************************************************************************************
*/
UINT32 AFInitEFFGrpTab(stcAF_EFF_CELL *pTab,UINT32 nCell)
{
UINT32 i;
uCANAFMR afmr;
UINT32 bakAfmr;
stcAF_EFF_CELL mask = {-1,-1};
stcAF_EFF_CELL *pU32 = (stcAF_EFF_CELL *)((UINT32)CANAFRAM_BADR + (UINT32)(CANEFF_GRP_sa.Word));
if((nCell % 2) != 0)
return CELL_NUM_INVALID;
if(nCell > ((CANENDofTable.Word- CANEFF_GRP_sa.Word) / 4))
return TABLE_CELL_TOO_LARGE;
afmr.Word = CANAFMR.Word;
bakAfmr = afmr.Word;
afmr.Bits.AccBP_BIT = 1;
CANAFMR.Word = afmr.Word;
for(i=0;i<((CANENDofTable.Word- CANEFF_GRP_sa.Word)/4);i++)
{
*(pU32 + i) = mask; // disable all AF cell
}
for(i=0;i<nCell;i++)
{
*(pU32 + i) = *(pTab+i); // set filter cell
}
CANAFMR.Word = bakAfmr;
return LUT_SETTING_OK;
}
/*
*********************************************************************************************************
**函数原型 ; INT32U AFReadFCANRxResurt(_AF_AUTOSTORE_MSG *pMsg,UINT32 IdIndex)
**参数说明 ; pMsg -->> FullCAN中自动保存的信息的ID结构
** : nCell -->> FullCAN自动接收完毕后生成的索引
*********************************************************************************************************
*/
UINT32 AFReadFCANRxResurt(stcAF_AUTOSTORE_MSG *pMsg,UINT32 IdIndex)
{
UINT32 state = -1;
stcAF_AUTOSTORE_MSG *pTmp;
pTmp = (stcAF_AUTOSTORE_MSG *)((UINT32)CANAFRAM_BADR + (UINT32)CANENDofTable.Word + (UINT32)(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 + -