📄 can.c
字号:
PECC1 = 0x0000; // load PECC1 control register
/// SRN2 service request node configuration:
/// - SRN2 interrupt priority level (ILVL) = 12
/// - SRN2 interrupt group level (GLVL) = 0
/// - SRN2 group priority extension (GPX) = 0
CAN_2IC = 0x0070;
/// SRN3 service request node configuration:
/// - SRN3 interrupt priority level (ILVL) = 13
/// - SRN3 interrupt group level (GLVL) = 1
/// - SRN3 group priority extension (GPX) = 0
CAN_3IC = 0x0075;
/// SRN4 service request node configuration:
/// - SRN4 interrupt priority level (ILVL) = 11
/// - SRN4 interrupt group level (GLVL) = 1
/// - SRN4 group priority extension (GPX) = 0
CAN_4IC = 0x006D;
// USER CODE BEGIN (Init,3)
// USER CODE END
CAN_PISEL = 0x0008; // load port input select register
// -----------------------------------------------------------------------
// Start the CAN Nodes:
// -----------------------------------------------------------------------
CAN_BCR &= ~(uword)0x0041; // reset INIT and CCE
// USER CODE BEGIN (Init,4)
// USER CODE END
} // End of function CAN_vInit
//****************************************************************************
// @Function void CAN_vGetMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj)
//
//----------------------------------------------------------------------------
// @Description This function fills the forwarded SW message object with
// the content of the chosen HW message object.
//
// The structure of the SW message object is defined in the
// header file CAN.H (see TCAN_SWObj).
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object to be read (0-31)
// @Parameters *pstObj:
// Pointer on a message object to be filled by this function
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (GetMsgObj,1)
// USER CODE END
void CAN_vGetMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj)
{
ubyte i;
for(i = 0; i < (CAN_HWOBJ[ubObjNr].uwMSGCFG & 0x00f0) >> 4; i++)
{
pstObj->ubData[i] = CAN_HWOBJ[ubObjNr].ubData[i];
}
if(CAN_HWOBJ[ubObjNr].uwMSGCFG & 0x04) // extended identifier
{
pstObj->ulID = CAN_HWOBJ[ubObjNr].ulCANAR;
pstObj->ulMask = CAN_HWOBJ[ubObjNr].ulCANAMR;
}
else // standard identifier
{
pstObj->ulID = CAN_HWOBJ[ubObjNr].ulCANAR >> 18;
pstObj->ulMask = CAN_HWOBJ[ubObjNr].ulCANAMR >> 18;
}
pstObj->uwCounter = CAN_HWOBJ[ubObjNr].uwCounter;
pstObj->uwMsgCfg = CAN_HWOBJ[ubObjNr].uwMSGCFG;
} // End of function CAN_vGetMsgObj
//****************************************************************************
// @Function ubyte CAN_ubRequestMsgObj(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description If a TRANSMIT OBJECT is to be reconfigured it must first be
// accessed. The access to the transmit object is exclusive.
// This function checks whether the choosen message object is
// still executing a transmit request, or if the object can be
// accessed exclusively.
// After the message object is reserved, it can be
// reconfigured by using the function CAN_vConfigMsgObj or
// CAN_vLoadData.
// Both functions enable access to the object for the CAN
// controller.
// By calling the function CAN_vTransmit transfering of data
// is started.
//
//----------------------------------------------------------------------------
// @Returnvalue 0 message object is busy (a transfer is active), else 1
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (RequestMsgObj,1)
// USER CODE END
ubyte CAN_ubRequestMsgObj(ubyte ubObjNr)
{
ubyte ubReturn;
ubReturn = 0;
if((CAN_HWOBJ[ubObjNr].uwMSGCTR & 0x3000) == 0x1000) // if reset TXRQ
{
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xfbff; // set CPUUPD
ubReturn = 1;
}
return(ubReturn);
} // End of function CAN_ubRequestMsgObj
//****************************************************************************
// @Function ubyte CAN_ubNewData(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description This function checks whether the selected RECEIVE OBJECT
// has received a new message. If so the function returns the
// value '1'.
//
//----------------------------------------------------------------------------
// @Returnvalue 1 the message object has received a new message, else 0
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (NewData,1)
// USER CODE END
ubyte CAN_ubNewData(ubyte ubObjNr)
{
ubyte ubReturn;
ubReturn = 0;
if((CAN_HWOBJ[ubObjNr].uwMSGCTR & 0x0300) == 0x0200) // if NEWDAT
{
ubReturn = 1;
}
return(ubReturn);
} // End of function CAN_ubNewData
//****************************************************************************
// @Function void CAN_vTransmit(ubyte ubObjNr)
//
//----------------------------------------------------------------------------
// @Description This function triggers the CAN controller to send the
// selected message.
// If the selected message object is a TRANSMIT OBJECT then
// this function triggers the sending of a data frame. If
// however the selected message object is a RECEIVE OBJECT
// this function triggers the sending of a remote frame.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object (0-31)
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (Transmit,1)
// USER CODE END
void CAN_vTransmit(ubyte ubObjNr)
{
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xe7ff; // set TXRQ, reset CPUUPD
} // End of function CAN_vTransmit
//****************************************************************************
// @Function void CAN_vConfigMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj)
//
//----------------------------------------------------------------------------
// @Description This function sets up the message objects. This includes
// the 8 data bytes, the identifier (11- or 29-bit), the
// acceptance mask (11- or 29-bit), the data number (0-8
// bytes), the frame counter value and the XTD-bit (standard
// or extended identifier). The direction bit (DIR), the NODE
// bit and the RMM (remote monitoring) bit can not be changed.
// The message is not sent; for this the function
// CAN_vTransmit must be called.
//
// The structure of the SW message object is defined in the
// header file CAN.H (see TCAN_SWObj).
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object to be configured (0-31)
// @Parameters *pstObj:
// Pointer on a message object
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (ConfigMsgObj,1)
// USER CODE END
void CAN_vConfigMsgObj(ubyte ubObjNr, TCAN_SWObj *pstObj)
{
ubyte i;
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xfb7f; // set CPUUPD, reset MSGVAL
if(pstObj->uwMsgCfg & 0x0004) // extended identifier
{
CAN_HWOBJ[ubObjNr].uwMSGCFG |= 0x0004;
CAN_HWOBJ[ubObjNr].ulCANAR = pstObj->ulID ;
CAN_HWOBJ[ubObjNr].ulCANAMR = pstObj->ulMask ;
}
else // standard identifier
{
CAN_HWOBJ[ubObjNr].uwMSGCFG &= ~(uword)0x0004;
CAN_HWOBJ[ubObjNr].ulCANAR = pstObj->ulID << 18;
CAN_HWOBJ[ubObjNr].ulCANAMR = pstObj->ulMask << 18;
}
CAN_HWOBJ[ubObjNr].uwCounter = pstObj->uwCounter;
CAN_HWOBJ[ubObjNr].uwMSGCFG = (CAN_HWOBJ[ubObjNr].uwMSGCFG & 0x000f) | (pstObj->uwMsgCfg & 0x00f0);
if(CAN_HWOBJ[ubObjNr].uwMSGCFG & 0x0008) // if transmit direction
{
for(i = 0; i < (pstObj->uwMsgCfg & 0x00f0) >> 4; i++)
{
CAN_HWOBJ[ubObjNr].ubData[i] = pstObj->ubData[i];
}
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf6bf; // set NEWDAT, reset CPUUPD,
} // set MSGVAL
else // if receive direction
{
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf7bf; // reset CPUUPD, set MSGVAL
}
} // End of function CAN_vConfigMsgObj
//****************************************************************************
// @Function void CAN_vLoadData(ubyte ubObjNr, ubyte *pubData)
//
//----------------------------------------------------------------------------
// @Description If a hardware TRANSMIT OBJECT has to be loaded with data
// but not with a new identifier, this function may be used
// instead of the function CAN_vConfigMsgObj. The message
// object should be accessed by calling the function
// CAN_ubRequestMsgObj before calling this function. This
// prevents the CAN controller from working with invalid data.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters ubObjNr:
// Number of the message object to be configured (0-31)
// @Parameters *pubData:
// Pointer on a data buffer
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (LoadData,1)
// USER CODE END
void CAN_vLoadData(ubyte ubObjNr, ubyte *pubData)
{
ubyte i;
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xfaff; // set CPUUPD and NEWDAT
for(i = 0; i < (CAN_HWOBJ[ubObjNr].uwMSGCFG & 0xf0) >> 4; i++)
{
CAN_HWOBJ[ubObjNr].ubData[i] = *(pubData++);
}
CAN_HWOBJ[ubObjNr].uwMSGCTR = 0xf7ff; // reset CPUUPD
} // End of function CAN_vLoadData
//****************************************************************************
// @Function void CAN_viSRN0(void)
//
//----------------------------------------------------------------------------
// @Description This is the interrupt service routine for the Service
// Request Node 0 of the TwinCAN module.
//
//----------------------------------------------------------------------------
// @Returnvalue None
//
//----------------------------------------------------------------------------
// @Parameters None
//
//----------------------------------------------------------------------------
// @Date 2006-12-10
//
//****************************************************************************
// USER CODE BEGIN (SRN0,1)
// USER CODE END
void CAN_viSRN0(void) interrupt CAN_SRN0INT
{
uword uwStatusB;
// USER CODE BEGIN (SRN0,2)
// USER CODE END
while((CAN_BSR & 0x0018))
{
// status change interrupt of node B
uwStatusB = CAN_BSR;
if (uwStatusB & 0x0008) // if TXOK
{
// Indicates that a message has been transmitted successfully
// (error free and acknowledged by at least one other node).
uwStatusB &= 0xfff7;
CAN_BSR = uwStatusB; // reset TXOK
// USER CODE BEGIN (SRN0_NODEB,3)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -