📄 iar-
字号:
** 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 + -