⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlg_can.c

📁 LPC11C14 CAN 代码
💻 C
📖 第 1 页 / 共 4 页
字号:
            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 + -