?? canapp.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** 產品一部
** http://www.zlgmcu.com
**-----------------------------------------------------------文件信息--------------------------------------------------------------------------------
** 文 件 名: CANAPP.C
** 版 本: v1.0
** 日 期: 2004年2月23日
** 描 述: CAN模塊應用接口函數說明文件。該文件中的函數,如果用戶有特別的需要,可以進行修改。
********************************************************************************************************/
#define _CANAPP_GLOBAL_
#include "INCLUDES.H"
/*
***********************************************************************************************************
**函數原型 : void CANIntPrg(void)
**參數說明 : 無
**返回值 : 無
**說 明 : CAN控制器中斷處理函數
************************************************************************************************************/
void CANIntPrg(void)
{
INT32U 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); //接收中斷處理
}
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); //數據溢出中斷處理
}
}
}
/*
***********************************************************************************************************
**函數原型 : void InitCAN(eCANNUM CanNum)
**參數說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
**返回值 : 無
**說 明 : 本函數用于初始化CAN控制器
************************************************************************************************************/
void InitCAN(eCANNUM CanNum)
{
// INT32U *p;
HwEnCAN(CanNum);
SoftRstCAN(CanNum);
CANEWL(CanNum).Bits.EWL_BIT = USE_EWL_CAN[CanNum];
//初始化波特率
CANBTR(CanNum).Word = USE_BTR_CAN[CanNum];
//初始化中斷為非向量中斷
//VICDefVectAddr =(INT32U)CANIntPrg;
VICVectAddr8 = (INT32U)CANIntPrg; //中斷服務程序CANIntPrg
VICVectCntl8 = (0x20|26); //26通道中斷位向量IRQ
VICIntEnable |=(1<<(26+ CanNum)); //使能26通道中斷
CANIER(CanNum).Word= 0x01; //只開放接收中斷
//配置驗收濾波器
CANAFMR.Bits.AccBP_BIT =1;
#if USE_eFCAN_MODE
CANAFMR.Bits.eFCAN_BIT =1;
CANSFF_sa.Bits. SADR_BIT= USE_SFF_sa_VAL;
CANSFF_GRP_sa.Bits. SADR_BIT=USE_SFF_GRP_sa_VAL;
CANEFF_sa.Bits. SADR_BIT= USE_EFF_sa_VAL;
CANEFF_GRP_sa.Bits. SADR_BIT=USE_EFF_GRP_sa_VAL;
CANENDofTable.Bits. SADR_BIT=USE_ENDoffable_VAL;
//請根據實際需要來填寫下面的驗收濾波器的表格
//p=(INT32U *)( CANAFRAM_GADR + USE_EFF_GRP_sa_VAL);
//*p=0x20000000;
//*(p+1)=0x20000006;
#endif
//初始化模式
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);
//睡眠模式
//CANMOD(CanNum).Bits.SM_BIT = USE_CAN_SLEEP_MOD;
}
/*
***********************************************************************************************************
**函數原型 : INT32U CANSendData(eCANNUM CanNum,INT32U Cmd,P_stcTxBUF Buf)
**參數說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
Cmd à> 發送命令字
Buf à> 要發送的數據
**返回值 : 無
**說 明 : 本函數用于將數據發送到CAN總線
************************************************************************************************************/
INT32U CANSendData(eCANNUM CanNum,INT32U Cmd,P_stcTxBUF Buf)
{
INT32U 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);
//CANMOD(CanNum).Bits.SM_BIT = USE_CAN_SLEEP_MOD;
}
return (status);
}
/*
***********************************************************************************************************
**函數原型 : INT32U ReadCANRcvCyBuf(eCANNUM CanNum,stcRxBUF *Buf)
**參數說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規定的值
Buf à> 使用驅動接收到的緩沖區數據
**返回值 : =0,驅動接收到數據。
!=0,驅動沒接收到數據。
**說 明 : 本函數用于用戶調用使用CAN驅動接收到的數據。
************************************************************************************************************/
INT32U ReadCANRcvCyBuf(eCANNUM CanNum,stcRxBUF *Buf)
{
INT32U 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;
}
else
{
status=1;
}
break;
/////////////////////////////////////////////////////////////////////
#if (CAN_MAX_NUM == 4)
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;
#endif
///////////////////////////////////////////////////////////////////////////
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;
//////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
#if (CAN_MAX_NUM == 4)
case CAN3:
if((0 == CANRcvBufApp.FullFlag3))
{
CANRcvBufApp.RcvBuf[CAN3][CANRcvBufApp.WritePoint3] = RxBUF(CAN3);
if(++CANRcvBufApp.WritePoint3 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.WritePoint3=0;
}
if(CANRcvBufApp.WritePoint3 == CANRcvBufApp.ReadPoint3)
{
CANRcvBufApp.FullFlag3 =1;
}
}
break;
case CAN4:
if((0 == CANRcvBufApp.FullFlag4))
{
CANRcvBufApp.RcvBuf[CAN4][CANRcvBufApp.WritePoint4] = RxBUF(CAN4);
if(++CANRcvBufApp.WritePoint4 >= USE_CAN_RCV_BUF_SIZE)
{
CANRcvBufApp.WritePoint4=0;
}
if(CANRcvBufApp.WritePoint4 == CANRcvBufApp.ReadPoint4)
{
CANRcvBufApp.FullFlag4 =1;
}
}
break;
#endif
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
default:
break;
}
RelCanRecBuf(CanNum);
}
//應用常量定義
//使用工作模式
const INT32U USE_MOD_CAN[2] =
{
USE_MODE_CAN1,
USE_MODE_CAN2,
#if (CAN_MAX_NUM == 4)
USE_MODE_CAN3,
USE_MODE_CAN4,
#endif
};
//使用睡眠模式
const INT32U USE_SLP_MOD_CAN[2] =
{
USE_SLP_MOD_CAN1,
USE_SLP_MOD_CAN2,
#if (CAN_MAX_NUM == 4)
USE_SLP_MOD_CAN3,
USE_SLP_MOD_CAN4,
#endif
};
//使用波特率
const INT32U USE_BTR_CAN[2] =
{
USE_BTR_CAN1,
USE_BTR_CAN2,
#if (CAN_MAX_NUM == 4)
USE_BTR_CAN3,
USE_BTR_CAN4,
#endif
};
//使用發送緩沖區發送優先級模式選擇
const INT32U USE_TPM_CAN[2] =
{
USE_TPM_CAN1,
USE_TPM_CAN2,
#if (CAN_MAX_NUM == 4)
USE_TPM_CAN3,
USE_TPM_CAN4,
#endif
};
//應用中斷
const INT32U USE_INT_CAN[2] =
{
USE_INT_CAN1,
USE_INT_CAN2,
#if (CAN_MAX_NUM == 4)
USE_INT_CAN3,
USE_INT_CAN4,
#endif
};
//應用報警限制
const INT32U USE_EWL_CAN[2] =
{
USE_EWL_CAN1,
USE_EWL_CAN2,
#if (CAN_MAX_NUM == 4)
USE_EWL_CAN3,
USE_EWL_CAN4,
#endif
};
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -