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

📄 iar-

📁 IAR_example_EasyARM8962.zip
💻
📖 第 1 页 / 共 2 页
字号:
** Function name:           CANAcceptFilterSet
** Descriptions:            设置节点接收验收过滤
** input parameters:        *pCAN           指向节点的空指针
**                          ulFrameID       接收帧ID
**                          ulFrameIDMask   接收帧屏蔽码
**                          ucReceMode      ID_FILTER     根据MsgObj ID 过滤(标准帧或扩展帧)
**                                     	    EXT_FILTER    过滤接收扩展帧
** output parameters:       无
** Returned value:          无
** Created By:              曾维勇
** Created date:            2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by:             Ni Likao 倪力考
** Modified date:           2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void CANAcceptFilterSet (void  *pCAN, unsigned long  ulFrameID, unsigned long  ulFrameIDMask, unsigned char  ucReceMode)
{
    tCANMsgObject MsgObjectRx;
	tCANNodeInfo *pCAN_Info;
	unsigned char ucBufferIn[8];

	pCAN_Info = (tCANNodeInfo *)pCAN;

    ASSERT((pCAN_Info->ulChNr == pCAN_Info->ulChNr)||
                     (pCAN_Info->ulChNr == CAN1_BASE));			   

	switch (ucReceMode) {
    /*
     *  验收过滤标准帧
     */
    case STD_ID_FILTER:  
        MsgObjectRx.ulFlags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_EXTENDED_ID | MSG_OBJ_USE_ID_FILTER);
        MsgObjectRx.ulMsgID = ((ulFrameID & 0x7ff) << 18);                         
        MsgObjectRx.ulMsgIDMask = ((ulFrameIDMask & 0x7ff) << 18);
        break;
    /*
	 *  验收过滤扩展帧
     */
    case EXT_ID_FILTER:  
        MsgObjectRx.ulFlags = (MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_EXTENDED_ID | MSG_OBJ_USE_EXT_FILTER);
        MsgObjectRx.ulMsgID = ulFrameID;
        MsgObjectRx.ulMsgIDMask = ulFrameIDMask;
        break;
    default:
        break;
	}

    MsgObjectRx.ulMsgLen = 8;
    MsgObjectRx.pucMsgData = ucBufferIn;
	/*
	 *  MsgObj 1 接收帧
     */ 
    CANMessageSet(pCAN_Info->ulChNr, pCAN_Info->ulRxMsgObjNr, &MsgObjectRx, MSG_OBJ_TYPE_RX); 
	
	return; 
}

/*********************************************************************************************************
** Function name:           EnableCANInt
** Descriptions:            使能CAN中断
** input parameters:        *pCAN           指向节点的空指针
** output parameters:       无
** Returned value:          无
** Created By:              曾维勇
** Created date:            2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by:             Ni Likao 倪力考
** Modified date:           2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EnableCANInt (void  *pCAN)
{
    unsigned long ulIntNum;
    tCANNodeInfo *pCAN_Info;

	pCAN_Info = (tCANNodeInfo *)pCAN;
	CANIntEnable(pCAN_Info->ulChNr, CAN_INT_MASTER | CAN_INT_STATUS);   /*  使能CAN控制器中断           */
	ulIntNum = CANGetIntNumber(pCAN_Info->ulChNr);
	IntEnable(ulIntNum);                                                /*  使能CAN节点中断             */
    IntMasterEnable();                                                  /*  使能中断总开关              */   
}

/*********************************************************************************************************
** Function name:           InitCANController
** Descriptions:            初始化CAN控制器,设定波特率
** input parameters:        *pCAN           指向节点的空指针
** output parameters:       无
** Returned value:          无
** Created By:              曾维勇
** Created date:            2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by:             Ni Likao 倪力考
** Modified date:           2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void InitCANController (void  *pCAN)
{   
    tCANNodeInfo *pCAN_Info;

	pCAN_Info = (tCANNodeInfo *)pCAN;
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);                        /*  使能GPIOD系统外设           */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0);                         /*  使能CAN控制器系统外设       */
    GPIOPinTypeCAN(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    CANInit(pCAN_Info->ulChNr);                                         /*  初始化CAN节点               */
    CANSetBitTiming(pCAN_Info->ulChNr, &CANBitClkSettings[pCAN_Info->ucBADVal]);
                                                                        /*  设置节点波特率              */
    CANEnable(pCAN_Info->ulChNr);                                       /*  启动CAN节点                 */   
}

/*********************************************************************************************************
** Function name:           ClearIntFlag
** Descriptions:            清除报文对象中断标志
** input parameters:        *pCAN_Info->ulChNr      节点号
**                          ulObjID                 报文对象标号
** output parameters:       无
** Returned value:          无
** Created By:              曾维勇
** Created date:            2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by:             Ni Likao 倪力考
** Modified date:           2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void ClearIntFlag (void  *pCAN, unsigned long  ulObjID)
{
    tCANNodeInfo *pCAN_Info;

	pCAN_Info = (tCANNodeInfo *)pCAN;   
    CANWriteReg(pCAN_Info->ulChNr + CAN_O_IF2CMSK, CAN_IFCMSK_CLRINTPND);
                                                                        /*  Set up the request for data */ 
                                                                        /*  from the message object.    */
    CANWriteReg(pCAN_Info->ulChNr + CAN_O_IF2CRQ, ulObjID & CAN_IFCRQ_MNUM_MSK);
                                                                        /*  Transfer the message object */ 
                                                                        /*  to the message object       */
                                                                        /*  specifiec by ulObjID.       */
    while (CANReadReg(pCAN_Info->ulChNr + CAN_O_IF2CRQ) & CAN_IFCRQ_BUSY) {
        ;                                                               /*  Wait for busy bit to clear  */
    }
    return;
}

/*********************************************************************************************************
** Function name:           ISR_CAN0Handler
** Descriptions:            实现中断接收一帧CAN报文中断服务
** input parameters:        无
** output parameters:       无
** Returned value:          无
** Created By:              曾维勇
** Created date:            2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by:             Ni Likao 倪力考
** Modified date:           2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void ISR_CAN0Handler (void)
{
	tCANFrame       CANFrame;
	tCANMsgObject MsgObjectBuf;
	unsigned long   ulMsgObjID;

	ulMsgObjID = CANIntStatus(pCAN_Node_Info->ulChNr, CAN_INT_STS_OBJECT);

	if (ulMsgObjID) {   
		/*
         *  中断接收数据
         */
        if ((ulMsgObjID & (0x00000001 << (pCAN_Node_Info->ulRxMsgObjNr - 1))) == (0x00000001 << (pCAN_Node_Info->ulRxMsgObjNr - 1))) {
            MsgObjectBuf.pucMsgData = CANFrame.ucDatBuf;
            CANMessageGet(pCAN_Node_Info->ulChNr, pCAN_Node_Info->ulRxMsgObjNr, &MsgObjectBuf, 1);
		    if (pReceFrameBuff->ucBufFull != FULL) { 
                /*	 	       
                 *  扩展帧
		         */
                if (MsgObjectBuf.ulFlags & MSG_OBJ_EXTENDED_ID) { 
                    CANFrame.ucXID = 1;
			        CANFrame.ulID = (MsgObjectBuf.ulMsgID & 0x1FFFFFFF);
                } else {
                    CANFrame.ucXID = 0;
                    CANFrame.ulID = (MsgObjectBuf.ulMsgID & 0x000007FF);
                }
            CANFrame.ucDLC = MsgObjectBuf.ulMsgLen;
		    CAN_ucWriteBuffer(pReceFrameBuff, &CANFrame);               /*  把接收的数据写入指定的接收
                                                                            缓存                        */
		    }
		}
		/*
		 *  中断发送数据
		 */
		if ((ulMsgObjID & (0x00000001 << (pCAN_Node_Info->ulTxMsgObjNr - 1))) == (0x00000001 << (pCAN_Node_Info->ulTxMsgObjNr - 1))) {   
		    /*
			 *  清除发送中断标志
			 */
            ClearIntFlag(pCAN_Node_Info, pCAN_Node_Info->ulTxMsgObjNr);

            if (CAN_ucReadBuffer(pReceFrameBuff, &CANFrame) != EMPTY) {
                SendCANFrame(pCAN_Node_Info, &CANFrame);
	        } 
		}
	}

    CANIntClear(pCAN_Node_Info->ulChNr, 0x00008000);
}

/*********************************************************************************************************
** Function name:           SendBuffToBus
** Descriptions:            发送缓冲区数据至外部总线
** input parameters:        *pCAN       指向节点结构的空指针
** output parameters:       无
** Returned value:          1           发送缓冲区不空,有可数据发送
**                          0           发送缓冲区为空,无可发数据
** Created By:              曾维勇
** Created date:            2007.09.16
**--------------------------------------------------------------------------------------------------------
** Modified by:             Ni Likao 倪力考
** Modified date:           2007.11.02
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
unsigned char SendBuffToBus (void  *pCAN)
{
    tCANFrame  CANFrame;
	tCANNodeInfo *pCAN_Info;

	pCAN_Info = (tCANNodeInfo *)pCAN;
	
	if (CAN_ucReadBuffer(pCAN_Info->pSendFrameBuff, &CANFrame) != EMPTY) {
       SendCANFrame(pCAN_Info, &CANFrame);
	   return 1;
	}  
	/*
     *  发送一帧数据,启动缓冲区数据发送服务程序 
	 */
	return 0; 
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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