?? canapp.c
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機(jī)發(fā)展有限公司
** 研 究 所
** 產(chǎn)品一部
** http://www.zlgmcu.com
**-----------------------------------------------------------文件信息--------------------------------------------------------------------------------
** 文 件 名: CANAPP.C
** 版 本: v1.0
** 日 期: 2004年2月23日
** 描 述: CAN模塊應(yīng)用接口函數(shù)說明文件。該文件中的函數(shù),如果用戶有特別的需要,可以進(jìn)行修改。
********************************************************************************************************/
#define _CANAPP_GLOBAL_
#include "config.h"
#include "IncludeCan.H"
/*
**************************************************************************************
** 定義并初始化驗(yàn)收過濾ID數(shù)組
**************************************************************************************
*/
#if AF_REG_ENABLE
#if SFF_INDV_nCell
stcAF_SFF_CELL sffIndvTab[] = {};
#endif
#if SFF_GRP_nCell
stcAF_SFF_CELL sffGrpTab[] = {{0x7FF,0,0,1,0x400,0,0,1},{0x3FF,0,0,2,0x00,0,0,2}};
#endif
#if EFF_INDV_nCell
stcAF_EFF_CELL effIndvTab[]= {};
#endif
#if EFF_GRP_nCell
stcAF_EFF_CELL effGrpTab[] = {{0x800,1},{0x8FF,1},{0x900,2},{0x9FF,2}};
#endif
#endif
/*
********************************************************************************************
**函數(shù)原型 : void CANIntPrg(void)
**參數(shù)說明 : 無
**返回值 : 無
**說 明 : CAN控制器中斷處理函數(shù)
******************************************************************************************/
void CANIntPrg(void)
{
INT32U j;
uCANICR k;
if(_CANLUTerr.Word != 0 ) //驗(yàn)收濾波器遇到表格錯誤
{
//添加用戶代碼
j=_CANLUTerrAd.Word;
}
for(j=0;j<CAN_MAX_NUM;j++)
{
k=CANICR(j);
if(k.Bits.RI != 0) //接收中斷
{
ReadCanRxBuf(j,&CANRcvCyBufApp[j]);
}
if(k.Bits.TI1 != 0) //第一發(fā)送緩沖區(qū)發(fā)送完成中斷
{
//添加用戶代碼
}
if(k.Bits.TI2 != 0) //第二發(fā)送緩沖區(qū)發(fā)送完成中斷
{
//添加用戶代碼
}
if(k.Bits.TI3 != 0) //第三發(fā)送緩沖區(qū)發(fā)送完成中斷
{
//添加用戶代碼
}
if(k.Bits.BEI != 0) //總線錯誤中斷
{
//添加用戶代碼
CanBufOffLinePrg(j); //總線關(guān)閉處理
}
if(k.Bits.ALI != 0) //仲裁丟失中斷
{
//添加用戶代碼
}
if(k.Bits.EPI != 0) //錯誤認(rèn)可中斷
{
//添加用戶代碼
}
if(k.Bits.WUI != 0) //喚醒中斷
{
//添加用戶代碼
}
if(k.Bits.DOI != 0)
{
//添加用戶代碼
ClrCanDataOver(j); //釋放接收緩沖區(qū)
}
}
VICVectAddr = 0;
}
/*
***********************************************************************************************************
**函數(shù)原型 : void CANRxtoTxDataConvertion (void *desBuf, void *srcBuf )
**參數(shù)說明 : desBuf ->目的數(shù)據(jù)
srcBuf ->源數(shù)據(jù)
**返回值 :
**說 明 :
***********************************************************************************************************
*/
void CANRxtoTxDataConvertion (stcTxBUF *desBuf,const stcRxBUF *srcBuf )
{
desBuf->TxFrameInfo.Bits.DLC = srcBuf->CANRcvFS.Bits.DLC;
desBuf->TxFrameInfo.Bits.RTR = srcBuf->CANRcvFS.Bits.RTR;
desBuf->TxFrameInfo.Bits.FF = srcBuf->CANRcvFS.Bits.FF;
//讀取幀ID
desBuf->TxCANID.Bits.ID = srcBuf->RxCANID.Bits.ID;
//讀取幀數(shù)據(jù)
desBuf->TDA.Word = srcBuf->RDA.Word;
desBuf->TDB.Word = srcBuf->RDB.Word;
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U WriteCanTxBuf(eCANNUM CanNum,INT32U TxBufNum,
INT32U TPM,P_stcTxBUF Buf) ;
**參數(shù)說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
TxBufNum -->> 選擇發(fā)送緩沖區(qū)
TPM -->> 發(fā)送優(yōu)先級模式
Buf -->> 發(fā)送到總線的數(shù)據(jù)
**返回值 : =0;成功將數(shù)據(jù)寫入發(fā)送緩沖區(qū)
!=0;寫發(fā)送緩沖區(qū)操作失敗
**說 明 : 本函數(shù)用于向CAN發(fā)送緩沖區(qū)TxBUF寫入發(fā)送數(shù)據(jù)
***********************************************************************************************************
*/
void WriteCanTxBuf(eCANNUM CanNum,INT32U TxBufNum,INT32U TPM,stcTxBUF *Buf)
{
INT32U status=0;
switch(TxBufNum)
{
case TX_BUF1:
TxBUF1(CanNum) = *Buf;
break;
case TX_BUF2:
TxBUF2(CanNum) = *Buf;
break;
case TX_BUF3:
TxBUF3(CanNum) = *Buf;
break;
default:
status = 0x01;
break;
}
if(TPM == 1)
CANMOD(CanNum).Bits.TPM =1; //發(fā)送優(yōu)先級由幀的優(yōu)先級域決定
}
/*
***********************************************************************************************************
**函數(shù)原型 : void ReadCanRxBuf(eCANNUM CanNum,stcRcvCANCyBuf *RcvCyBuf)
**參數(shù)說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
** RcvCyBuf-->> 目標(biāo)環(huán)形緩沖區(qū)指針
**返回值 :
**說 明 : 本函數(shù)用于驅(qū)動將收到的CAN數(shù)據(jù)寫入環(huán)形緩沖區(qū)Buf->CANRcvFS =CANRFS(CanNum);
************************************************************************************************************/
INT32U ReadCanRxBuf(eCANNUM CanNum,stcRcvCANCyBuf *RcvCyBuf)
{
INT32U PointTemp = 0;
INT32U Statue = 0;
PointTemp = RcvCyBuf->WritePoint;
if((0 == RcvCyBuf->FullFlag))
{
RcvCyBuf->RcvBuf[PointTemp].CANRcvFS = RxBUF(CanNum).CANRcvFS;
RcvCyBuf->RcvBuf[PointTemp].RxCANID = RxBUF(CanNum).RxCANID;
RcvCyBuf->RcvBuf[PointTemp].RDA = RxBUF(CanNum).RDA;
RcvCyBuf->RcvBuf[PointTemp].RDB = RxBUF(CanNum).RDB;
if(++RcvCyBuf->WritePoint >= USE_CAN_cycRCV_BUF_SIZE)
RcvCyBuf->WritePoint=0;
if(RcvCyBuf->WritePoint == RcvCyBuf->ReadPoint)
RcvCyBuf->FullFlag =1;
}
else
Statue = 1;
RelCanRecBuf(CanNum);
return Statue;
}
/*
***********************************************************************************************************
**函數(shù)原型 : INT32U CANSendData(eCANNUM CanNum,INT32U Cmd,P_stcTxBUF Buf)
**參數(shù)說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
Cmd --> 發(fā)送命令字
Buf --> 要發(fā)送的數(shù)據(jù)
**返回值 : 無
**說 明 : 本函數(shù)用于將數(shù)據(jù)發(fā)送到CAN總線
************************************************************************************************************/
INT32U CANSendData(eCANNUM CanNum,INT32U Cmd, stcRxBUF *RxBuf)
{
INT32U TxBufNum,status =0;
stcTxBUF TxBuf ;
if((0== CANSR(CanNum).Bits.TS1)&&(0 != CANSR(CanNum).Bits.TBS1))
{
TxBufNum=TX_BUF1;
}
else if((0== CANSR(CanNum).Bits.TS2)&&(0 != CANSR(CanNum).Bits.TBS2))
{
TxBufNum=TX_BUF2;
}
else if((0== CANSR(CanNum).Bits.TS3)&&(0 != CANSR(CanNum).Bits.TBS3))
{
TxBufNum=TX_BUF3;
}
else
{
TxBufNum=0xFF;
status = 1;
}
if (0xFF != TxBufNum)
{
CANRxtoTxDataConvertion (&TxBuf, RxBuf);
WriteCanTxBuf(CanNum, TxBufNum , USE_TPM_CAN[CanNum], & TxBuf);
CanSendCmd(CanNum,Cmd,TxBufNum);
status = 0;
}
return status;
}
/*
***********************************************************************************************************
**函數(shù)原型 : void ConfigAFReg ()
**參數(shù)說明 :
**返回值 :
**說 明 : 本函數(shù)用于配置驗(yàn)收過濾器
************************************************************************************************************
*/
void ConfigAFReg (void)
{
//配置驗(yàn)收過濾器
#if AF_REG_ENABLE
INT32U state;
//初始化表格地址
AFBuildLUT(0,SFF_INDV_nCell,SFF_GRP_nCell,EFF_INDV_nCell,EFF_GRP_nCell);
/*初始化標(biāo)準(zhǔn)幀獨(dú)立表格*/
#if SFF_INDV_nCell
state = AFInitSFFIndvTab(sffIndvTab,sizeof(sffIndvTab)/sizeof(stcAF_SFF_CELL));
/*添加用戶代碼*/
#endif
/*初始化標(biāo)準(zhǔn)幀范圍表格*/
#if SFF_GRP_nCell
state = AFInitSFFGrpTab(sffGrpTab,sizeof(sffGrpTab)/sizeof(stcAF_SFF_CELL));
/*添加用戶代碼*/
#endif
/*初始化擴(kuò)展幀獨(dú)立表格*/
#if EFF_INDV_nCell
state = AFInitEFFIndvTab(effIndvTab,sizeof(effIndvTab)/sizeof(stcAF_EFF_CELL));
/*添加用戶代碼*/
#endif
/*初始化擴(kuò)展幀范圍表格*/
#if EFF_GRP_nCell
state = AFInitEFFGrpTab(effGrpTab,sizeof(effGrpTab)/sizeof(stcAF_EFF_CELL));
/*添加用戶代碼*/
#endif
/*設(shè)置驗(yàn)收過濾模式*/
AFSetMode(Normal);
#else
AFSetMode (Bypass);
#endif
}
/*
***********************************************************************************************************
**函數(shù)原型 : void InitCAN(eCANNUM CanNum)
**參數(shù)說明 : CanNum -->> CAN控制器,值不能大于CAN_MAX_NUM 規(guī)定的值
**返回值 : 無
**說 明 : 本函數(shù)用于初始化CAN控制器
************************************************************************************************************/
void InitCAN(eCANNUM CanNum)
{
/*硬件使能CAN控制器*/
HwEnCAN(CanNum);
/*軟件復(fù)位CAN控制器 */
while (SoftRstCAN(CanNum));
/*設(shè)置錯誤警告寄存器*/
while (SetErWarmVal (CanNum,USE_EWL_CAN[CanNum]));
//初始化波特率
while (SetCANBaudRate (CanNum,USE_BTR_CAN[CanNum]));
/*初始化中斷*/
VICDefVectAddr =(INT32U)CANIntPrg;
VICIntEnable |=(1<<19)|(1<<(20+ CanNum))|(1<<(26+ CanNum));
CANIER(CanNum).Word= USE_INT_CAN[CanNum];
/*初始化模式*/
while (SetTPMMOD(CanNum,USE_TPM_CAN[CanNum])); //設(shè)置發(fā)送優(yōu)先模式寄存器
while (SetLOMMOD(CanNum,USE_LOM_CAN[CanNum])); //設(shè)置只聽模式寄存器
/********* 添加用其他初始化代碼 ***********/
CANRcvCyBufApp[CanNum].FullFlag = 0; //初始化接收環(huán)形緩沖區(qū)
CANRcvCyBufApp[CanNum].ReadPoint = 0;
CANRcvCyBufApp[CanNum].WritePoint = 0;
/*軟件啟動CAN*/
SoftEnCAN(CanNum);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -