?? 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 + -