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

📄 zlg_can.c

📁 LPC11C14 CAN 代码
💻 C
📖 第 1 页 / 共 4 页
字号:



/*********************************************************************************************************
** Function name:           canCirBufWrite
** Descriptions:            往循环队列写一帧数据
** input parameters:        ptCanBuf   指向循环队列的指针
** output parameters:       ptFrame    数据输出指针
** Returned value:          CAN_OK    操作成功
**                          CAN_ERROR       操作失败
** Created By:              张展威
** Created date:            2008.09.02
**--------------------------------------------------------------------------------------------------------
** Modified by:             张展威
** Modified date:           2009.04.29
** Descriptions:            将帧类型格式的保存放到最后来操作,防止误读
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
INT8U canCirBufWrite(CANCIRBUF *ptCanCirBuf, CANFRAME *ptCanFrame)
{
    CANFRAME *ptCanFrameObject;
    INT8U i = 0;
    
    ptCanFrameObject = canCirBufMalloc(ptCanCirBuf);                    /* 从缓冲区申请一帧报文的存储   */
                                                                        /* 空间                         */
    if (ptCanFrameObject == (CANFRAME *)0) {                            /* 缓冲区未满,申请成功         */
        return CAN_ERROR;
    }
    ptCanFrameObject->ucDLC = ptCanFrame->ucDLC;                        /* 报文数据场长度               */
    ptCanFrameObject->ulID  = ptCanFrame->ulID;                         /* 报文ID(标志字符)           */
    for (i= 0; i < 8; i++) {
        ptCanFrameObject->ucDatBuf[i] = ptCanFrame->ucDatBuf[i];        /* 读出数据场内容               */
    }
    ptCanFrameObject->ucTtypeFormat = ptCanFrame->ucTtypeFormat;        /* 写报文类型,使这帧报文有效   */
    return CAN_OK;                                                      /* 返回操作成功                 */
}



/*********************************************************************************************************
** Function name:           canNodeCreate
** Descriptions:            初始化一个包含CAN节点信息的结构体变量
** input parameters:        ptCanNode:指向节点结构的指针
**                          ulBaseAddr:节点对应的CAN控制器基址
**                          ulBaudIn:节点通信波特率(波特率表的索引)
**                          ulDaReObjMsk:按位选通用于接收数据帧的报文对象
**                          ulRmReObjMsk:按位选通用于接收远程帧的报文对象
**                          ulTxMsgObjNr:发送的报文编号
**                          ptRecvList:指向本节点的接收"缓存"(链表结构)
**                          pfCanHandlerCallBack:指向canHandler()回调函数的指针
** output parameters:       *ptCanNode被初始化
** Returned value:          无
** Created By:              张展威
** Created date:            2009.10.23
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canNodeCreate(CANNODEINFO *ptCanNode, unsigned long ulBaseAddr, unsigned char ucBaudIndex,
                   unsigned long ulDaReObjMsk, unsigned long ulRmReObjMsk, unsigned long ulTxMsgObjNr,
				   CANCIRBUF *ptReCirBuf, void (*pfCanHandlerCallBack)(unsigned long ulMessage, long lParam1, long lParam2),
				   void (*pfIsrHandler)(void))
{
    if (ptCanNode == 0) {                                               /* 检查节点的有效性             */
        return;
    }
    // 软件环境初始化
    ptCanNode->ulBaseAddr    = ulBaseAddr;                              /* CAN控制器基地址              */
    ptCanNode->ucNodeState   = CAN_NO_ERROR;
    ptCanNode->ucBaudIndex   = ucBaudIndex;                             /* CAN控制器波特率索引          */
    ptCanNode->ulBofTimer    = 0;
    
    ptCanNode->ulDaReObjMsk  = ulDaReObjMsk;                            /* 接收数据帧报文对象           */
    ptCanNode->ulRmReObjMsk  = ulRmReObjMsk;
    ptCanNode->ulTxMsgObjNr  = ulTxMsgObjNr;                            /* 发送报文对象                 */
    
    ptCanNode->ptCanReCirBuf = ptReCirBuf;                              /* 指向接收数据链表             */
    ptCanNode->ptCanTxCirBuf = 0;                                       /* 清空发送数据链表             */
    
    ptCanNode->pfCanHandlerCallBack = pfCanHandlerCallBack;             /* 初始化回调函数               */
    ptCanNode->pfIsrHandler = pfIsrHandler;                             /* 中断服务函数                 */
}


/*********************************************************************************************************
** Function name:           canNodeCallBackSet
** Descriptions:            设置节点回调函数
** input parameters:        ptCanNode              指向节点结构的指针
**                          pfCanHandlerCallBack      指向回调函数的函数指针
** output parameters:       无
** Returned value:          无
** Created By:              张展威
** Created date:            2009.05.22
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canNodeCallBackSet(CANNODEINFO *ptCanNode, void (*pfCanHandlerCallBack)(unsigned long ulMessage, long lParam1, long lParam2))
{
    if (ptCanNode == 0) {                                               /* 检查节点的有效性             */
        return;
    }
    ptCanNode->pfCanHandlerCallBack = pfCanHandlerCallBack;
}
/*********************************************************************************************************
** Function name:           canFrameSend
** Descriptions:            发送一帧CAN报文至总线
** input parameters:        pCAN           指向发送报文结构体指针
**                          pFrame         数据块指针
** 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.07
** Descriptions:            增加远程帧发送功能
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canFrameSend(CANNODEINFO *ptCanNode, CANFRAME *ptCANFrame)
{
    CAN_MSG_OBJ tMsgObjectTx;
    unsigned char ucEnable = 0;
    if (ptCanNode == 0) {                                               /* 检查节点的有效性             */
        return;
    }
    
    ucEnable = __ENTER_CIRTICAL();                                      /* 进入临界区                   */
    tMsgObjectTx.ulMsgID = ptCANFrame->ulID;                            /* 取得报文标识符               */
    
    if ((ptCANFrame->ucTtypeFormat & XTD_MASK) != 0){
        tMsgObjectTx.ulFlags = MSG_OBJ_EXTENDED_ID;                     /* 扩展格式帧                   */
    } else {
        tMsgObjectTx.ulFlags = MSG_OBJ_NO_FLAGS;                        /* 标准格式帧                   */
    }
    
    tMsgObjectTx.ulFlags |= MSG_OBJ_TX_INT_ENABLE;                      /* 标记发送中断使能             */
    tMsgObjectTx.ulMsgLen = (unsigned long)ptCANFrame->ucDLC;           /* 标记数据域长度               */
    tMsgObjectTx.pucMsgData = ptCANFrame->ucDatBuf;                     /* 传递数据存放指针             */
    CANRetrySet(ptCanNode->ulBaseAddr, true);                           /* 启动发送失败重发             */
    
    if ((ptCANFrame->ucTtypeFormat & RMRQS_MASK) != 0) {
        CANMessageSet(ptCanNode->ulBaseAddr,                            /* CAN控制器基址                */
        ptCanNode->ulTxMsgObjNr,                                        /* 发送报文对象编号             */
        &tMsgObjectTx, MSG_OBJ_TYPE_TX_REMOTE);                         /* 配置远程帧发送报文对象       */
    } else {
        CANMessageSet(ptCanNode->ulBaseAddr,                            /* CAN控制器基址                */
        ptCanNode->ulTxMsgObjNr,                                        /* 发送报文对象编号             */
        &tMsgObjectTx, MSG_OBJ_TYPE_TX);                                /* 配置数据帧发送报文对象       */
    }
    __EXIT_CIRTICAL(ucEnable);                                          /* 退出临界区                   */
}

/*********************************************************************************************************
** Function name:        canReMsgObjSet
** Descriptions:         设置接收数据帧及远程帧的报文对象,若选通多个报文对象则将报文对象串连成FIFO缓冲器
** input parameters:     ulBaseAddr      CAN模块基址
**                       ulMsgObjMask    按位选通要设置的报文对象
**                       ulFrameID       接收帧ID
**                       ulFrameIDMsk   接收帧屏蔽码
**                       ucFramType      STD_ID_FILTER    过滤接收标准格式的报文
**                                       EXT_ID_FILTER    过滤接收扩展格式的报文
**                                       STD_EXT_FILTER   过滤接收标准及扩展格式的报文,不使用ID掩码
**                       ucMsgType       MSG_OBJ_TYPE_RX          接收报文对象
**                                       MSG_OBJ_TYPE_RX_REMOTE   接收远程帧报文对象
** output parameters:    无
** Returned value:       无
** Created By:           张展威
** Created date:         2008.08.28
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void canReMsgObjSet(CANNODEINFO *ptCanNode, unsigned long ulMsgObjMask, unsigned long ulFrameID,
                    unsigned long ulFrameIDMsk, unsigned char ucFramType, unsigned char ucMsgType)
{
    CAN_MSG_OBJ tMsgObj;
    
    //unsigned long ulBaseAddr;
    LPC_CAN_TypeDef *ptCanBase;
    unsigned char ucDataBuf[8];
    unsigned short usCmdMaskReg;
    unsigned short usMaskReg[2];
    unsigned short usArbReg[2];
    unsigned short usMsgCtrl;
    tBoolean bUseExtendedID = false;
    tBoolean bEob           = false;
    int i;
    
    
    if (ptCanNode == 0) {                                               /* 检查节点的有效性             */
        return;
    }
    
    ptCanBase   = (LPC_CAN_TypeDef *)(ptCanNode->ulBaseAddr);
    
    if (ulMsgObjMask == 0) {
        return;                                                         /* 没有选定报文对象             */
    }
    
    if (ucMsgType == MSG_OBJ_TYPE_RX) {                                 /* 数据帧接收报文对象           */
        ptCanNode->ulDaReObjMsk |= ulMsgObjMask;                        /* 按位标记接收报文对象         */
    } else if (ucMsgType == MSG_OBJ_TYPE_RX_REMOTE){                    /* 远程帧报文接收对象           */
        ptCanNode->ulRmReObjMsk |= ulMsgObjMask;                        /* 按位标记"发送"报文对象       */
    } else {
        return;                                                         /* 参数非法,直接退出此函数     */
    }
    
    tMsgObj.ulMsgID = ulFrameID;                                        /* 报文滤波ID                   */
    tMsgObj.ulMsgIDMask = ulFrameIDMsk;                                 /* ID掩码*/ /* 接收报文对象处理 */
    switch (ucFramType) {                                               /* 帧类型处理                   */
        case STD_ID_FILTER: {                                           /* 标准帧                       */
            tMsgObj.ulFlags = (MSG_OBJ_RX_INT_ENABLE |                  /* 允许接收中断                 */
            MSG_OBJ_USE_ID_FILTER |                                     /* 使用报文ID滤波               */
            MSG_OBJ_USE_EXT_FILTER |                                    /* Xtd参与滤波                  */
            MSG_OBJ_USE_DIR_FILTER);                                    /* Dir参与滤波                  */
            bUseExtendedID = false;                                     /* 不是扩展帧                   */
            break;
        }
        case EXT_ID_FILTER: {                                           /* 扩展帧                       */
            tMsgObj.ulFlags = (MSG_OBJ_RX_INT_ENABLE |                  /* 允许接收中断                 */
            MSG_OBJ_EXTENDED_ID |                                       /* 扩展ID                       */
            MSG_OBJ_USE_ID_FILTER |                                     /* 使用报文ID滤波               */
            MSG_OBJ_USE_EXT_FILTER |                                    /* Xtd参与滤波                  */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -