📄 canapp.c
字号:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
** http://www.zlgmcu.com
**-----------------------------------------------------------文件信息--------------------------------------------------------------------------------
** 文 件 名: CANAPP.C
** 版 本: v1.0
** 日 期: 2004年2月23日
** 描 述: CAN模块应用接口函数说明文件。该文件中的函数,如果用户有特别的需要,可以进行修改。
********************************************************************************************************/
#define _CANAPP_GLOBAL_
#include "config.h"
/*
***********************************************************************************************************
**函数原型 : 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);
}
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 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[4] =
{
USE_MODE_CAN1,
USE_MODE_CAN2,
USE_MODE_CAN3,
USE_MODE_CAN4
};
//使用波特率
const UINT32 USE_BTR_CAN[4] =
{
USE_BTR_CAN1,
USE_BTR_CAN2,
USE_BTR_CAN3,
USE_BTR_CAN4
};
//使用发送缓冲区发送优先级模式选择
const UINT32 USE_TPM_CAN[4] =
{
USE_TPM_CAN1,
USE_TPM_CAN2,
USE_BTR_CAN3,
USE_BTR_CAN4
};
//应用中断
const UINT32 USE_INT_CAN[4] =
{
USE_INT_CAN1,
USE_INT_CAN2,
USE_INT_CAN3,
USE_INT_CAN4
};
//应用报警限制
const UINT32 USE_EWL_CAN[4] =
{
USE_EWL_CAN1,
USE_EWL_CAN2,
USE_EWL_CAN3,
USE_EWL_CAN4
};
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -