📄 zlg_can.c
字号:
MSG_OBJ_USE_DIR_FILTER); /* Dir参与滤波 */
bUseExtendedID = true; /* 是扩展帧 */
break;
}
case STD_EXT_FILTER: { /* 只对接收报文对象有意义 */
tMsgObj.ulFlags = (MSG_OBJ_RX_INT_ENABLE | /* 允许接收中断 */
MSG_OBJ_USE_ID_FILTER | /* 使用报文ID滤波 */
MSG_OBJ_USE_DIR_FILTER); /* Dir参与滤波 */
ulFrameIDMsk = 0x00000000UL; /* 不对ID进行接收滤波 */
bUseExtendedID = false; /* 不是扩展帧(这里没影响) */
break;
}
default: {
return;
}
}
tMsgObj.pucMsgData = ucDataBuf; /* 指向数据存储空间 */
tMsgObj.ulMsgLen = 8; /* 设置数据域长度 */
while(__canRegRead((unsigned long)&ptCanBase->IF1_CMDREQ) & CAN_IF1CRQ_BUSY) {;}
/* 等待报文处理器空闲 */
usCmdMaskReg = CAN_IF1CMSK_WRNRD | /* 写数据到报文对象存储器 */
CAN_IF1CMSK_DATAA | /* 传输数据字节 0~3 */
CAN_IF1CMSK_DATAB | /* 传输数据字节 4~7 */
CAN_IF1CMSK_CONTROL | /* 传输控制位 */
CAN_IF1CMSK_ARB; /* 传输ID+Dir+Xtd+MsgVal到MsgObj*/
usArbReg[0] = 0;
usMsgCtrl = 0;
usMaskReg[0] = 0;
usMaskReg[1] = 0;
switch(ucMsgType) { /* 报文对象类型处理 */
case MSG_OBJ_TYPE_RX: { /* 接收数据帧类型 */
usArbReg[1] = 0;
break;
}
case MSG_OBJ_TYPE_RX_REMOTE: { /* 接收远程帧类型 */
usArbReg[1] = CAN_IF1ARB2_DIR; /* 置位报文方向位,发送方向 */
usMsgCtrl = CAN_IF1MCTL_UMASK; /* Msk、MXtd、MDir用于接收滤波 */
usMaskReg[0] = 0xffff;
usMaskReg[1] = 0x1fff;
usCmdMaskReg |= CAN_IF1CMSK_MASK;
break;
}
default: {
return;
}
}
if(tMsgObj.ulFlags & MSG_OBJ_USE_ID_FILTER) { /* 使用报文ID滤波 */
if(bUseExtendedID) { /* 扩展帧 */
usMaskReg[0] = ulFrameIDMsk & CAN_IF1MSK1_IDMSK_M;
usMaskReg[1] = (ulFrameIDMsk >> 16) & CAN_IF1MSK2_IDMSK_M;
} else { /* 标准帧 */
usMaskReg[0] = 0; /* 低十六位MSK[15:0]为0 */
usMaskReg[1] = (ulFrameIDMsk << 2) & CAN_IF1MSK2_IDMSK_M; /* MSK[28:18]为标准帧ID MSK */
}
}
if((tMsgObj.ulFlags & MSG_OBJ_USE_EXT_FILTER) == MSG_OBJ_USE_EXT_FILTER) {
usMaskReg[1] |= CAN_IF1MSK2_MXTD; /* 扩展标识符Xtd参与验收滤波 */
}
if((tMsgObj.ulFlags & MSG_OBJ_USE_DIR_FILTER) == MSG_OBJ_USE_DIR_FILTER) {
usMaskReg[1] |= CAN_IF1MSK2_MDIR; /* 报文方向Dir参与验收滤波 */
}
if(tMsgObj.ulFlags & (MSG_OBJ_USE_ID_FILTER | MSG_OBJ_USE_DIR_FILTER | MSG_OBJ_USE_EXT_FILTER)) {
usMsgCtrl |= CAN_IF1MCTL_UMASK; /* Msk、MXtd、MDir用于接收滤波 */
usCmdMaskReg |= CAN_IF1CMSK_MASK; /* 传输IDMask+Dir+Mxtd 到MsgObj */
}
if(bUseExtendedID) { /* 扩展帧验收ID */
usArbReg[0] |= ulFrameID & CAN_IF1ARB1_ID_M;
usArbReg[1] |= (ulFrameID >> 16) & CAN_IF1ARB2_ID_M;
usArbReg[1] |= CAN_IF1ARB2_MSGVAL | CAN_IF1ARB2_XTD;
} else { /* 标准帧验收ID */
usArbReg[0] = 0;
usArbReg[1] |= (ulFrameID << 2) & CAN_IF1ARB2_ID_M;
usArbReg[1] |= CAN_IF1ARB2_MSGVAL;
}
usMsgCtrl |= (tMsgObj.ulMsgLen & CAN_IF1MCTL_DLC_M) | CAN_IF1MCTL_EOB;
/* Eob = 1 */
if(tMsgObj.ulFlags & MSG_OBJ_RX_INT_ENABLE) {
usMsgCtrl |= CAN_IF1MCTL_RXIE; /* 使能接收中断 */
}
__canRegWrite((unsigned long)&ptCanBase->IF1_CMDMSK, usCmdMaskReg);
__canRegWrite((unsigned long)&ptCanBase->IF1_MSK1, usMaskReg[0]);
__canRegWrite((unsigned long)&ptCanBase->IF1_MSK2, usMaskReg[1]);
__canRegWrite((unsigned long)&ptCanBase->IF1_ARB1, usArbReg[0]);
__canRegWrite((unsigned long)&ptCanBase->IF1_ARB2, usArbReg[1]);
__canRegWrite((unsigned long)&ptCanBase->IF1_MCTRL, usMsgCtrl);
bEob = false;
for (i = 0; i < 32; i++){
if (ulMsgObjMask & 0x80000000) {
if (bEob == false) {
__canRegWrite((unsigned long)&ptCanBase->IF1_MCTRL, (usMsgCtrl | CAN_IF1MCTL_EOB));
bEob = true; /* End of the FIFO */
} else {
__canRegWrite((unsigned long)&ptCanBase->IF1_MCTRL, (usMsgCtrl & (~CAN_IF1MCTL_EOB)));
}
__canRegWrite((unsigned long)&ptCanBase->IF1_CMDREQ, ((32 - i) & CAN_IF1CRQ_MNUM_M));
/* 更新到报文对象 */
while(__canRegRead((unsigned long)&ptCanBase->IF1_CMDREQ) & CAN_IF1CRQ_BUSY) {
; /* 等待报文处理器空闲 */
}
}
ulMsgObjMask = ulMsgObjMask << 1; /* 更形报文对象屏蔽选择 */
if (ulMsgObjMask == 0) {
break; /* 提前退出循环 */
}
}
return;
}
/*********************************************************************************************************
** Function name: canAcceptFilterSet
** Descriptions: 验收滤波设置
** input parameters: ptCanNode 指向节点的指针
** ulFrameID 接收帧ID
** ulFrameIDMsk 接收帧ID屏蔽码
** ucFramType STD_ID_FILTER 过滤接收标准格式的报文
** EXT_ID_FILTER 过滤接收扩展格式的报文
** STD_EXT_FILTER 过滤接收标准及扩展格式的报文,不使用ID掩码
** output parameters: 无
** Returned value: 无
** Created By: 张展威
** Created date: 2008.08.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canAcceptFilterSet(CANNODEINFO *ptCanNode, unsigned long ulFrameID, unsigned long ulFrameIDMsk,
unsigned char ucFramType)
{
if (ptCanNode == 0) { /* 检查节点的有效性 */
return;
}
canReMsgObjSet(ptCanNode, ptCanNode->ulDaReObjMsk,
ulFrameID, ulFrameIDMsk, ucFramType, MSG_OBJ_TYPE_RX);
/* 配置数据帧接收报文对象 */
canReMsgObjSet(ptCanNode, ptCanNode->ulRmReObjMsk,
ulFrameID, ulFrameIDMsk, ucFramType, MSG_OBJ_TYPE_RX_REMOTE);
/* 配置远程帧接收报文对象 */
}
/*********************************************************************************************************
** Function name: canIntEnable
** Descriptions: 使能CAN中断
** input parameters: pCAN 指向节点的指针
** output parameters: 无
** Returned value: 无
** Created By: 张展威
** Created date: 2009.11.10
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canIntEnable (CANNODEINFO *ptCanNode)
{
unsigned long ulIntNum;
if(ptCanNode == 0) { /* 节点有效性判断 */
return ;
}
if (ptCanNode->pfIsrHandler) { /* 中断服务函数存在则注册ISR */
CANIntRegister(ptCanNode->ulBaseAddr, ptCanNode->pfIsrHandler);
} else {
ulIntNum = __canIntNumberGet(ptCanNode->ulBaseAddr);
IntEnable(ulIntNum); /* 使能CAN节点中断(to CPU) */
}
CANIntEnable(ptCanNode->ulBaseAddr, CAN_INT_MASTER | CAN_INT_ERROR);
/* 允许挂起中断及错误中断并使能 */
/* CAN 控制器中断源 */
}
/*********************************************************************************************************
** Function name: canApplyInit
** Descriptions: CAN应用初始化(设置中断服务函数及初始化CAN控制器,设定波特率及验收滤波条件等)
** input parameters: ptCanNode 指向软件CAN节点结构体变量的指针
** ulFrameID 报文的验收ID
** ulFrameIDMsk 报文验收ID屏蔽码(对应位为1时,表示验收ID的对应位参与验收滤波)
** ucFramType 验收的帧类型:
** STD_ID_FILTER 过滤接收标准格式的报文
** EXT_ID_FILTER 过滤接收扩展格式的报文
** STD_EXT_FILTER 过滤接收标准及扩展格式的报文,使用此类型
** 时ulFrameID及ulFrameIDMsk的配置为无效,即接收所有格式的报文
** pfun 指向中断服务函数的函数指针
** output parameters: 无
** Returned value: 无
** Created By: 曾维勇
** Created date: 2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by: Ni Likao 倪力考
** Modified date: 2007.11.02
**--------------------------------------------------------------------------------------------------------
** Modified by: 张展威
** Modified date: 2008.11.11
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
INT8U canApplyInit(CANNODEINFO *ptCanNode, unsigned long ulFrameID, unsigned long ulFrameIDMsk, unsigned char ucFramType)
{
if (ptCanNode == 0) { /* 检查节点的有效性 */
return CAN_ERROR;
}
// 硬件初始化
LPC_SYSCON->PRESETCTRL |= (0x1<<3); /* Peripheral reset control */
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<17); /* System AHB clock control */
LPC_CAN->CLKDIV = 0x00; /* Divided by 6 */
CANInit(ptCanNode->ulBaseAddr); /* 初始化CAN控制器 */
CANBitTimingSet(ptCanNode->ulBaseAddr, (CAN_BIT_CLK_PARM *)(&CANBitClkSettings[ptCanNode->ucBaudIndex]));
/* 设定节点波特率 */
CANEnable(ptCanNode->ulBaseAddr); /* 退出初始化模式,启动CAN节点 */
// 验收滤波设置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -