?? canapp.c
字號:
/****************************************Copyright (c)**************************************************
** 河南恩湃電力技術有限公司
** 測 控 部
**
**
**-----------------------------------------------------------文件信息--------------------------------------------------------------------------------
** 文 件 名: CANAPP.C
** 版 本:
** 日 期:
** 描 述: CAN模塊應用接口函數說明文件。該文件中的函數,如果用戶有特別的需要,可以進行修改。
********************************************************************************************************/
#define _CANAPP_GLOBAL_
#include "config.h"
extern void AFSetMode(UINT32 mode);
extern 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);
extern UINT32 AFInitSFFIndvTab(stcAF_SFF_CELL *pTab,UINT32 nCell);
extern uint8 Locoal_Addr;
//#define SFF_INDV_nCell 1
#define SFF_GRP_nCell 1
/*
**************************************************************************************
** 定義并初始化驗收過濾ID數組
**************************************************************************************
*/
#if AF_REG_ENABLE
#if SFF_INDV_nCell
stcAF_SFF_CELL sffIndvTab[] = {56,0,0,1,56,0,0,1};
#endif
#if SFF_GRP_nCell
stcAF_SFF_CELL sffGrpTab[] = {56,0,0,1,56,0,0,1};
#endif
#if EFF_INDV_nCell
stcAF_EFF_CELL effIndvTab[]= {};
#endif
#if EFF_GRP_nCell
stcAF_EFF_CELL effGrpTab[] = {};
#endif
#endif
/*
***********************************************************************************************************
**函數原型 : void CANIntPrg(void)
**參數說明 : 無
**返回值 : 無
**說 明 : CAN控制器中斷處理函數
************************************************************************************************************/
__irq void CANIntPrg(void)
{
UINT32 j;
uCANICR k;
if(CANLUTerr.Word != 0 ) //LUT Error Program
{
//add or modify code
j=CANLUTerrAd.Word;
}
for(j=0;j<CAN_MAX_NUM;j++)
{
k=CANICR(j);
if(k.Bits.RI_BIT != 0)
{
//add code
WriteCANRcvCyBuf(j);
//UART1_SendByte(0x08);
}
if(k.Bits.TI1_BIT != 0)
{
//add code
}
if(k.Bits.TI2_BIT != 0)
{
//add code
}
if(k.Bits.TI3_BIT != 0)
{
//add code
}
if(k.Bits.BEI_BIT != 0)
{
//add code
CanBufOffLinePrg(j);
}
if(k.Bits.ALI_BIT != 0)
{
//add code
}
if(k.Bits.EPI_BIT != 0)
{
//add code
}
if(k.Bits.WUI_BIT != 0)
{
//add code
}
if(k.Bits.DOI_BIT != 0)
{
//add code
ClrCanDataOver(j);
}
}
VICVectAddr = 0;
}
/*
***********************************************************************************************************
**函數原型 : void ConfigAFReg ()
**參數說明 :
**返回值 :
**說 明 : 本函數用于配置驗收過濾器
************************************************************************************************************
*/
void ConfigAFReg (void)
{
//配置驗收過濾器
#if AF_REG_ENABLE
UINT32 state;
//初始化表格地址
//stcAF_SFF_CELL sffIndvTab[]={{56,0,0,0,1,0,0,0},{88,0,0,0,33,0,0,0}};
//stcAF_SFF_CELL sffIndvTab[]={56,0,0,0,57,0,0,0};
AFBuildLUT(0,0,5,0,0);
/*初始化標準幀獨立表格*/
#if SFF_INDV_nCell
state = AFInitSFFIndvTab(sffIndvTab,sizeof(sffIndvTab)/sizeof(stcAF_SFF_CELL));
/*添加用戶代碼*/
#endif
/*初始化標準幀范圍表格*/
#if SFF_GRP_nCell
sffGrpTab[0].UpId=Locoal_Addr<<3;
sffGrpTab[0].LoId=Locoal_Addr<<3;
state = AFInitSFFGrpTab(sffGrpTab,sizeof(sffGrpTab)/sizeof(stcAF_SFF_CELL));
/*添加用戶代碼*/
#endif
/*初始化擴展幀獨立表格*/
#if EFF_INDV_nCell
state = AFInitEFFIndvTab(effIndvTab,sizeof(effIndvTab)/sizeof(stcAF_EFF_CELL));
/*添加用戶代碼*/
#endif
/*初始化擴展幀范圍表格*/
#if EFF_GRP_nCell
state = AFInitEFFGrpTab(effGrpTab,sizeof(effGrpTab)/sizeof(stcAF_EFF_CELL));
/*添加用戶代碼*/
#endif
/*設置驗收過濾模式*/
AFSetMode(Normal);
#else
AFSetMode (Bypass);
#endif
}
/*
***********************************************************************************************************
**函數原型 : void InitCAN(eCANNUM CanNum)
**參數說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
**返回值 : 無
**說 明 ; 本函數用于初始化CAN控制器
************************************************************************************************************/
void InitCAN(eCANNUM CanNum)
{
HwEnCAN(CanNum);
SoftRstCAN(CanNum);
CANEWL(CanNum).Bits.EWL_BIT = USE_EWL_CAN[CanNum];
//初始化波特率
CANBTR(CanNum).Word = USE_BTR_CAN[CanNum];
//初始化中斷為非向量中斷
VICDefVectAddr =(UINT32)CANIntPrg;
VICIntEnable |=(1<<19)|(1<<(20+ CanNum))|(1<<(26+ CanNum));
CANIER(CanNum).Word= USE_INT_CAN[CanNum];
//配置驗收濾波器(旁路狀態)
CANAFMR.Bits.AccBP_BIT =1;
//初始化模式
CANMOD(CanNum).Bits.TPM_BIT = USE_TPM_CAN[CanNum];
CANMOD(CanNum).Bits. LOM_BIT = USE_MOD_CAN[CanNum];
//初始化接收環形緩沖區
CANRcvBufApp.FullFlag1=CANRcvBufApp.FullFlag2=CANRcvBufApp.FullFlag3=CANRcvBufApp.FullFlag4=0;
CANRcvBufApp.ReadPoint1=CANRcvBufApp.ReadPoint2=CANRcvBufApp.ReadPoint3=CANRcvBufApp.ReadPoint4=0;
CANRcvBufApp.WritePoint1=CANRcvBufApp.WritePoint2=CANRcvBufApp.WritePoint3=CANRcvBufApp.WritePoint4=0;
//啟動CAN
SoftEnCAN(CanNum);
}
/*
***********************************************************************************************************
**函數原型 : UINT32 CANSendData(eCANNUM CanNum,UINT32 Cmd,P_stcTxBUF Buf)
**參數說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
Cmd --> 發送命令字
Buf --> 要發送的數據
**返回值 : 無
**說 明 : 本函數用于將數據發送到CAN總線
************************************************************************************************************/
UINT32 CANSendData(eCANNUM CanNum,UINT32 Cmd,P_stcTxBUF Buf)
{
UINT32 i,status=0;
if(0 != CANSR(CanNum).Bits.TBS1_BIT)
{
i=SEND_TX_BUF1;
}
else if(0 != CANSR(CanNum).Bits.TBS2_BIT)
{
i=SEND_TX_BUF2;
}
else if(0 != CANSR(CanNum).Bits.TBS3_BIT)
{
i=SEND_TX_BUF3;
}
else
{
i=0xFF;
}
status=WriteCanTxBuf(CanNum,i, USE_TPM_CAN[CanNum], Buf);
if(status == 0)
{
#if 1
if(CANMOD(CanNum).Bits.SM_BIT != 0)
{
CanQuitSM(CanNum);
}
#endif
CanSendCmd(CanNum,Cmd,i);
}
return (status);
}
/*
***********************************************************************************************************
**函數原型 : UINT32 ReadCANRcvCyBuf(eCANNUM CanNum,stcRxBUF *Buf)
**參數說明 : CanNum --> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
Buf --> 使用驅動接收到的緩沖區數據
**返回值 : =0,驅動接收到數據。
!=0,驅動沒接收到數據。
**說 明 : 本函數用于用戶調用使用CAN驅動接收到的數據。
************************************************************************************************************/
UINT32 ReadCANRcvCyBuf(eCANNUM CanNum,stcRxBUF *Buf)
{
UINT32 status=0;
switch(CanNum)
{
case CAN1:
if((0 != CANRcvBufApp.FullFlag1) ||
(CANRcvBufApp.ReadPoint1 != CANRcvBufApp.WritePoint1))
{
*Buf=CANRcvBufApp.RcvBuf[CAN1][CANRcvBufApp.ReadPoint1];
if(++CANRcvBufApp.ReadPoint1 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.ReadPoint1 =0;
}
CANRcvBufApp.FullFlag1=0;
}
else
{
status=1;
}
break;
case CAN2:
if((0 != CANRcvBufApp.FullFlag2) ||
(CANRcvBufApp.ReadPoint2 != CANRcvBufApp.WritePoint2))
{
*Buf=CANRcvBufApp.RcvBuf[CAN2][CANRcvBufApp.ReadPoint2];
if(++CANRcvBufApp.ReadPoint2 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.ReadPoint2 =0;
}
CANRcvBufApp.FullFlag2=0;
}
/*case CAN3:
if((0 != CANRcvBufApp.FullFlag3) ||
(CANRcvBufApp.ReadPoint3 != CANRcvBufApp.WritePoint3))
{
*Buf=CANRcvBufApp.RcvBuf[CAN3][CANRcvBufApp.ReadPoint3];
if(++CANRcvBufApp.ReadPoint3 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.ReadPoint3 =0;
}
CANRcvBufApp.FullFlag3=0;
}
else
{
status=1;
}
break;
case CAN4:
if((0 != CANRcvBufApp.FullFlag4) ||
(CANRcvBufApp.ReadPoint4 != CANRcvBufApp.WritePoint4))
{
*Buf=CANRcvBufApp.RcvBuf[CAN4][CANRcvBufApp.ReadPoint4];
if(++CANRcvBufApp.ReadPoint4 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.ReadPoint4 =0;
}
CANRcvBufApp.FullFlag4=0;
}*/
else
{
status=1;
}
//break;
break;
default:
status=1;
break;
}
return status;
}
/*
***********************************************************************************************************
**函數原型 : void WriteCANRcvCyBuf(eCANNUM CanNum)
**參數說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
**返回值 :
**說 明 : 本函數用于驅動將收到的CAN數據寫入環形緩沖區
************************************************************************************************************/
void WriteCANRcvCyBuf(eCANNUM CanNum)
{
switch(CanNum)
{
case CAN1:
if((0 == CANRcvBufApp.FullFlag1))
{
CANRcvBufApp.RcvBuf[CAN1][CANRcvBufApp.WritePoint1] = RxBUF(CAN1);
if(++CANRcvBufApp.WritePoint1 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.WritePoint1=0;
}
if(CANRcvBufApp.WritePoint1 == CANRcvBufApp.ReadPoint1)
{
CANRcvBufApp.FullFlag1 =1;
}
}
break;
case CAN2:
if((0 == CANRcvBufApp.FullFlag2))
{
CANRcvBufApp.RcvBuf[CAN2][CANRcvBufApp.WritePoint2] = RxBUF(CAN2);
if(++CANRcvBufApp.WritePoint2 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.WritePoint2=0;
}
if(CANRcvBufApp.WritePoint2 == CANRcvBufApp.ReadPoint2)
{
CANRcvBufApp.FullFlag2 =1;
}
}
break;
default:
break;
}
RelCanRecBuf(CanNum);
}
//應用常量定義
//使用工作模式
const UINT32 USE_MOD_CAN[2] =
{
USE_MODE_CAN1,
USE_MODE_CAN2,
};
//使用波特率
const UINT32 USE_BTR_CAN[2] =
{
USE_BTR_CAN1,
USE_BTR_CAN2,
};
//使用發送緩沖區發送優先級模式選擇
const UINT32 USE_TPM_CAN[2] =
{
USE_TPM_CAN1,
USE_TPM_CAN2,
};
//應用中斷
const UINT32 USE_INT_CAN[2] =
{
USE_INT_CAN1,
USE_INT_CAN2,
};
//應用報警限制
const UINT32 USE_EWL_CAN[2] =
{
USE_EWL_CAN1,
USE_EWL_CAN2,
};
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -