65 #define CAN_MAX_11BIT_MSG_ID 0x7ff
72 #define CAN_MAX_BIT_DIVISOR 19
79 #define CAN_MIN_BIT_DIVISOR 4
86 #define CAN_MAX_PRE_DIVISOR 1024
93 #define CAN_MIN_PRE_DIVISOR 1
101 #define CAN_BIT_VALUE(seg1, seg2, sjw) \
102 ((((seg1 - 1) << CAN_BIT_TSEG1_S) & \
104 (((seg2 - 1) << CAN_BIT_TSEG2_S) & \
106 (((sjw - 1) << CAN_BIT_SJW_S) & \
150 _CANBaseValid(uint32_t ui32Base)
231 uint32_t ui32Idx, ui32Value;
236 for(ui32Idx = 0; ui32Idx < ui32Size; )
242 ui32Value = pui8Data[ui32Idx++];
247 if(ui32Idx < ui32Size)
249 ui32Value |= (pui8Data[ui32Idx++] << 8);
252 HWREG(pui32Register++) = ui32Value;
280 uint32_t ui32Idx, ui32Value;
285 for(ui32Idx = 0; ui32Idx < ui32Size; )
291 ui32Value =
HWREG(pui32Register++);
296 pui8Data[ui32Idx++] = (uint8_t)ui32Value;
301 if(ui32Idx < ui32Size)
303 pui8Data[ui32Idx++] = (uint8_t)(ui32Value >> 8);
332 ASSERT(_CANBaseValid(ui32Base));
361 for(ui32Msg = 1; ui32Msg <= 32; ui32Msg++)
386 for(ui32Msg = 1; ui32Msg <= 32; ui32Msg++)
429 ASSERT(_CANBaseValid(ui32Base));
458 ASSERT(_CANBaseValid(ui32Base));
490 ASSERT(_CANBaseValid(ui32Base));
555 uint32_t ui32BitRate)
557 uint32_t ui32DesiredRatio;
558 uint32_t ui32CANBits;
559 uint32_t ui32PreDivide;
560 uint32_t ui32RegValue;
566 ASSERT(_CANBaseValid(ui32Base));
573 ui32DesiredRatio = ui32SourceClock / ui32BitRate;
586 if((ui32SourceClock / ui32DesiredRatio) > ui32BitRate)
588 ui32DesiredRatio += 1;
599 for(ui32CANBits = CAN_MAX_BIT_DIVISOR;
605 ui32PreDivide = ui32DesiredRatio / ui32CANBits;
611 if((ui32PreDivide * ui32CANBits) == ui32DesiredRatio)
655 return(ui32SourceClock / (ui32PreDivide * ui32CANBits));
715 uint32_t ui32BitReg, ui32SavedInit;
720 ASSERT(_CANBaseValid(ui32Base));
781 ui32SavedInit &= ~CAN_CTL_INIT;
815 uint_fast8_t ui8IntNumber;
820 ASSERT(_CANBaseValid(ui32Base));
826 ASSERT(ui8IntNumber != 0);
857 uint_fast8_t ui8IntNumber;
862 ASSERT(_CANBaseValid(ui32Base));
868 ASSERT(ui8IntNumber != 0);
917 ASSERT(_CANBaseValid(ui32Base));
949 ASSERT(_CANBaseValid(ui32Base));
1002 ASSERT(_CANBaseValid(ui32Base));
1089 ASSERT(_CANBaseValid(ui32Base));
1091 ((ui32IntClr >= 1) && (ui32IntClr <= 32)));
1146 uint32_t ui32CtlReg;
1151 ASSERT(_CANBaseValid(ui32Base));
1198 ASSERT(_CANBaseValid(ui32Base));
1278 uint32_t ui32Status;
1283 ASSERT(_CANBaseValid(ui32Base));
1365 uint32_t *pui32TxCount)
1367 uint32_t ui32CANError;
1372 ASSERT(_CANBaseValid(ui32Base));
1480 uint16_t ui16CmdMaskReg;
1481 uint16_t ui16MaskReg0, ui16MaskReg1;
1482 uint16_t ui16ArbReg0, ui16ArbReg1;
1483 uint16_t ui16MsgCtrl;
1485 bool bUseExtendedID;
1492 ASSERT(_CANBaseValid(ui32Base));
1493 ASSERT((ui32ObjID <= 32) && (ui32ObjID != 0));
1603 ui16MaskReg0 = 0xffff;
1604 ui16MaskReg1 = 0x1fff;
1841 uint16_t ui16CmdMaskReg;
1842 uint16_t ui16MaskReg0, ui16MaskReg1;
1843 uint16_t ui16ArbReg0, ui16ArbReg1;
1844 uint16_t ui16MsgCtrl;
1849 ASSERT(_CANBaseValid(ui32Base));
1850 ASSERT((ui32ObjID <= 32) && (ui32ObjID != 0));
1902 ((ui16MsgCtrl & CAN_IF1MCTL_TXRQST) &&
1903 (!(ui16ArbReg1 & CAN_IF1ARB2_DIR))))
1943 if(ui16ArbReg1 & CAN_IF1ARB2_XTD)
2088 ASSERT(_CANBaseValid(ui32Base));
2089 ASSERT((ui32ObjID >= 1) && (ui32ObjID <= 32));
void CANEnable(uint32_t ui32Base)
void CANIntDisable(uint32_t ui32Base, uint32_t ui32IntFlags)
#define MSG_OBJ_RX_INT_ENABLE
This indicates that receive interrupts are enabled.
#define CAN_MAX_PRE_DIVISOR
bool CANRetryGet(uint32_t ui32Base)
uint32_t ui32MsgLen
This value is the number of bytes of data in the message object.
#define MSG_OBJ_EXTENDED_ID
This indicates that a message object is using an extended identifier.
static const uint16_t g_ui16CANBitValues[]
void CANMessageGet(uint32_t ui32Base, uint32_t ui32ObjID, tCANMsgObject *psMsgObject, bool bClrPendingInt)
uint32_t ui32MsgID
The CAN message identifier used for 11 or 29 bit identifiers.
uint32_t ui32SyncPropPhase1Seg
void CANInit(uint32_t ui32Base)
uint8_t * pui8MsgData
This is a pointer to the message object's data.
#define MSG_OBJ_USE_EXT_FILTER
void CANBitTimingGet(uint32_t ui32Base, tCANBitClkParms *psClkParms)
#define CAN_IF1MCTL_DLC_M
#define CAN_IF1CMSK_NEWDAT
#define CAN_BIT_VALUE(seg1, seg2, sjw)
#define MSG_OBJ_REMOTE_FRAME
This indicates that a message object is a remote frame.
void CANIntUnregister(uint32_t ui32Base)
#define CAN_IF1CMSK_DATAB
uint32_t ui32QuantumPrescaler
#define CAN_MSG1INT_INTPND_M
#define CAN_IF1CRQ_MNUM_M
void CANBitTimingSet(uint32_t ui32Base, tCANBitClkParms *psClkParms)
#define CAN_IF1MCTL_MSGLST
#define CAN_IF1CMSK_CLRINTPND
#define CAN_IF1MSK1_IDMSK_M
#define MSG_OBJ_TX_INT_ENABLE
This indicates that transmit interrupts are enabled.
uint32_t ui32MsgIDMask
The message identifier mask used when identifier filtering is enabled.
static uint_fast8_t _CANIntNumberGet(uint32_t ui32Base)
#define CAN_IF1ARB2_MSGVAL
Transmit remote request message object.
void CANDisable(uint32_t ui32Base)
#define MSG_OBJ_NEW_DATA
This indicates that new data was available in the message object.
#define CAN_IF1MCTL_NEWDAT
bool CANErrCntrGet(uint32_t ui32Base, uint32_t *pui32RxCount, uint32_t *pui32TxCount)
uint32_t CANStatusGet(uint32_t ui32Base, tCANStsReg eStatusReg)
void CANMessageSet(uint32_t ui32Base, uint32_t ui32ObjID, tCANMsgObject *psMsgObject, tMsgObjType eMsgType)
void CANIntRegister(uint32_t ui32Base, void(*pfnHandler)(void))
#define CAN_IF1CMSK_DATAA
#define CAN_MIN_BIT_DIVISOR
#define MSG_OBJ_USE_DIR_FILTER
#define CAN_IF1MCTL_UMASK
#define CAN_MAX_BIT_DIVISOR
uint32_t CANBitRateSet(uint32_t ui32Base, uint32_t ui32SourceClock, uint32_t ui32BitRate)
#define MSG_OBJ_NO_FLAGS
This indicates that a message object has no flags set.
#define CAN_IF1MCTL_RMTEN
#define CAN_IF1CMSK_CONTROL
#define CAN_MAX_11BIT_MSG_ID
#define MSG_OBJ_USE_ID_FILTER
void CANIntClear(uint32_t ui32Base, uint32_t ui32IntClr)
Read the full CAN controller status.
void CANRetrySet(uint32_t ui32Base, bool bAutoRetry)
#define CAN_MIN_PRE_DIVISOR
Read the CAN interrupt status information.
void IntUnregister(uint32_t ui32Interrupt)
Read the full 32-bit mask of message objects that are enabled.
Read a message object's interrupt status.
#define MSG_OBJ_DATA_LOST
#define CAN_IF1MSK2_IDMSK_M
#define CAN_IF1MCTL_TXRQST
uint32_t CANIntStatus(uint32_t ui32Base, tCANIntStsReg eIntStsReg)
Read the full 32-bit mask of message objects with new data available.
Receive remote request message object.
static void _CANDataRegRead(uint8_t *pui8Data, uint32_t *pui32Register, uint32_t ui32Size)
Remote frame receive remote, with auto-transmit message object.
void CANIntEnable(uint32_t ui32Base, uint32_t ui32IntFlags)
static void _CANDataRegWrite(uint8_t *pui8Data, uint32_t *pui32Register, uint32_t ui32Size)
#define CAN_INT_INTID_STATUS
#define CAN_IF1CMSK_WRNRD
void CANMessageClear(uint32_t ui32Base, uint32_t ui32ObjID)
void IntDisable(uint32_t ui32Interrupt)
void IntRegister(uint32_t ui32Interrupt, void(*pfnHandler)(void))
void IntEnable(uint32_t ui32Interrupt)