#define Dem_ReportErrorStatus(...)\r
#endif\r
\r
+//static sint8 IfRegId = 0;\r
+\r
/* Macro for waiting until busy flag is 0 */\r
#define DCAN_WAIT_UNTIL_NOT_BUSY(ControllerId, IfRegId) \\r
{ \\r
/* Used to switch between IF1 and IF2 of DCAN */\r
static uint8 IfRegId = 0;\r
\r
+\r
/* Used to order Data Bytes according to hardware registers in DCAN */\r
static const uint8 ElementIndex[] = {3, 2, 1, 0, 7, 6, 5, 4};\r
\r
uint8 *SduPtr;\r
\r
/* Wait until Busy Flag is 0 */\r
- DCAN_WAIT_UNTIL_NOT_BUSY_NO_RV(controller, IfRegId);\r
+ DCAN_WAIT_UNTIL_NOT_BUSY(controller, IfRegId);\r
\r
// Read message control\r
uint32 mc = CanRegs[controller]->IFx[IfRegId].MC;\r
uint8 MsgNr;\r
uint32 ErrCounter;\r
uint32 Eob;\r
+ imask_t state;\r
\r
/* DET Error Check */\r
#if(CAN_DEV_ERROR_DETECT == STD_ON)\r
}\r
#endif \r
\r
- imask_t i_state = McuE_EnterCriticalSection();\r
+ Irq_Save(state);\r
\r
// TODO This should be used instead of other variables in the Can_Lcfg file.\r
CurConfig = Config;\r
CanRegs[Controller]->CTL = 0x02001641 | DCAN_IRQ_MASK | (CanControllerConfigData[Controller].Can_Arc_Loopback << 7);// | (CanControllerConfigData[Controller].CanWakeupProcessing >> 8) | (CanControllerConfigData[Controller].CanBusOffProcessing >> 7);\r
#else\r
CanRegs[Controller]->CTL = 0x00001641 | DCAN_IRQ_MASK | (CanControllerConfigData[Controller].Can_Arc_Loopback << 7);// | (CanControllerConfigData[Controller].CanWakeupProcessing >> 8) | (CanControllerConfigData[Controller].CanBusOffProcessing >> 7);\r
+\r
+ /* Parity Off */\r
+ CanRegs[Controller]->CTL = 0x00020043 | DCAN_IRQ_MASK | (CanControllerConfigData[Controller].Can_Arc_Loopback << 7);// | (CanControllerConfigData[Controller].CanWakeupProcessing >> 8);\r
#endif \r
/* LEC 7, TxOk, RxOk, PER */\r
CanRegs[Controller]->SR = 0x0000011F;\r
+ //CanRegs[Controller]->SR = 0x0000031F; // according to HalCoGen\r
\r
/* Test Mode only for Development time: Silent Loopback */\r
if (CanControllerConfigData[Controller].Can_Arc_Loopback) {\r
*(ControllerConfig[Controller].CancelPtr + MsgNr) = 0;\r
*(ControllerConfig[Controller].TxPtr + MsgNr) = 0;\r
\r
+ CanRegs[Controller]->ABOT = 0; // added manually according to HalCoGen, maybe delete???\r
+\r
DCAN_WAIT_UNTIL_NOT_BUSY_NO_RV(Controller, IfRegId);\r
\r
// Initialize all message objects for this controller to invalid state.\r
CanRegs[Controller]->IFx[IfRegId].ARB = 0x00000000;\r
/* Start writing Arbitration Bits */\r
CanRegs[Controller]->IFx[IfRegId].COM = 0x00A80000 | (MsgNr + 1);\r
+ // CanRegs[Controller]->IFx[IfRegId].COM = 0x00F80000 | (MsgNr + 1); maybe right, later it's used again??\r
\r
/* Use IFx[0] and IFx[1] alternating */\r
IfRegId ^= 1;\r
| (CanControllerConfigData[Controller].CanTxProcessing << 1) // Tx confirmation interrupt enabled\r
| (Eob & ~(hoh->CanObjectType >> 22)); // Eob, only for Rx.\r
\r
+ //CanRegs[Controller]->IFx[IfRegId].MC = 0x00001008;\r
+\r
//CanRegs[Controller]->IFx[IfRegId].MC = 0x00001008 | CanControllerConfigData[Controller].CanRxProcessing | (CanControllerConfigData[Controller].CanTxProcessing) | Eob & ~(hoh->CanObjectType >> 17);\r
\r
if(hoh->CanIdType == CAN_ID_TYPE_STANDARD) /* Standard Identifiers */\r
{\r
/* Only Standard-Ids are accepted, Set Mask */\r
+ // HalCoGen\r
CanRegs[Controller]->IFx[IfRegId].MASK = 0x80000000 | ((*(hoh->CanFilterMaskRef)) & 0x1FFFFFFF);\r
/* Message valid, Id, Direction */\r
CanRegs[Controller]->IFx[IfRegId].ARB = 0x80000000 | ((hoh->CanIdValue & 0x7FF) << 18) | hoh->CanObjectType;\r
else if(hoh->CanIdType == CAN_ID_TYPE_EXTENDED) /* Extended Identifiers */\r
{\r
/* Only Extended-Ids are accepted, Set Mask */\r
- CanRegs[Controller]->IFx[IfRegId].MASK = 0x80000000 | ((*(hoh->CanFilterMaskRef)) & 0x1FFFFFFF);\r
+ CanRegs[Controller]->IFx[IfRegId].MASK = 0xC0000000 | ((*(hoh->CanFilterMaskRef)) & 0x1FFFFFFF); // HalCoGen\r
+ // C = bit 30: The message direction bit (Dir) is used for acceptance filtering.\r
+ // CanRegs[Controller]->IFx[IfRegId].MASK = 0x80000000 | ((*(hoh->CanFilterMaskRef)) & 0x1FFFFFFF);\r
/* Message valid, Id, Direction */\r
CanRegs[Controller]->IFx[IfRegId].ARB = 0xC0000000 | (hoh->CanIdValue & 0x1FFFFFFF) | hoh->CanObjectType;\r
}\r
/* Set Bit Timing Register */\r
CanRegs[Controller]->BTR = Can_CalculateBTR(Controller);\r
\r
- /* Reset CCE Bit */\r
+ /* Reset CCE Bit, i.e. disable configuration change */\r
CanRegs[Controller]->CTL &= ~0x00000040;\r
\r
#if(CAN_DEV_ERROR_DETECT == STD_ON)\r
#endif\r
\r
// Install interrupt handlers\r
- TaskType tid;\r
if (CanControllerConfigData[Controller].CanControllerId == DCAN1) {\r
- tid = Os_Arc_CreateIsr(Can1_InterruptHandler, 2 ,"DCAN1Level0");\r
- Irq_AttachIsr2(tid, NULL, 16);\r
-\r
- tid = Os_Arc_CreateIsr(Can1_InterruptHandler, 2, "DCAN1Level1");\r
- Irq_AttachIsr2(tid, NULL, 29);\r
+ ISR_INSTALL_ISR2("DCAN1Level0",Can1_InterruptHandler,CAN1_LEVEL_0,2,0);\r
+ ISR_INSTALL_ISR2("DCAN1Level1",Can1_InterruptHandler,CAN1_LEVEL_1,2,0);\r
\r
} else if (CanControllerConfigData[Controller].CanControllerId == DCAN2) {\r
- tid = Os_Arc_CreateIsr(Can2_InterruptHandler, 2 ,"DCAN2Level0");\r
- Irq_AttachIsr2(tid, NULL, 35);\r
-\r
- tid = Os_Arc_CreateIsr(Can2_InterruptHandler, 2, "DCAN2Level1");\r
- Irq_AttachIsr2(tid, NULL, 42);\r
+ ISR_INSTALL_ISR2("DCAN2Level0",Can2_InterruptHandler,CAN2_LEVEL_0,2,0);\r
+ ISR_INSTALL_ISR2("DCAN2Level1",Can2_InterruptHandler,CAN2_LEVEL_1,2,0);\r
\r
} else if (CanControllerConfigData[Controller].CanControllerId == DCAN3) {\r
- tid = Os_Arc_CreateIsr(Can3_InterruptHandler, 2 ,"DCAN3Level0");\r
- Irq_AttachIsr2(tid, NULL, 45);\r
-\r
- tid = Os_Arc_CreateIsr(Can3_InterruptHandler, 2, "DCAN3Level1");\r
- Irq_AttachIsr2(tid, NULL, 55);\r
+ ISR_INSTALL_ISR2("DCAN3Level0",Can3_InterruptHandler,CAN3_LEVEL_0,2,0);\r
+ ISR_INSTALL_ISR2("DCAN3Level1",Can3_InterruptHandler,CAN3_LEVEL_1,2,0);\r
\r
}\r
\r
ModuleState = CAN_READY;\r
#endif\r
\r
- McuE_ExitCriticalSection(i_state);\r
+ Irq_Restore(state);\r
\r
}\r
\r
+// Unitialize the module\r
+void Can_DeInit()\r
+{\r
+\r
+ return;\r
+}\r
+\r
\r
\r
void Can_InitController(uint8 Controller, const Can_ControllerConfigType* Config)\r
{\r
uint8 MsgNr;\r
uint32 ErrCounter;\r
+ imask_t state;\r
\r
#if(CAN_DEV_ERROR_DETECT == STD_ON)\r
if(Config == NULL)\r
}\r
#endif \r
\r
- imask_t i_state = McuE_EnterCriticalSection();\r
+ Irq_Save(state);\r
\r
ErrCounter = CAN_TIMEOUT_DURATION;\r
\r
\r
DCAN_WAIT_UNTIL_NOT_BUSY_NO_RV(Controller, IfRegId);\r
\r
- /* Read actual MaskRegister value of MessageObject */\r
+ /* Read actual MaskRegister value of MessageObject; TxRqst/NewDat */\r
CanRegs[Controller]->IFx[IfRegId].COM = 0x004C0000 | (MsgNr);\r
\r
DCAN_WAIT_UNTIL_NOT_BUSY_NO_RV(Controller, IfRegId);\r
/* Set new Mask */\r
CanRegs[Controller]->IFx[IfRegId].MASK |= (*(hoh->CanFilterMaskRef)) & 0x1FFFFFFF;\r
/* Write new Mask to MaskRegister */\r
- CanRegs[Controller]->IFx[IfRegId].COM = 0x00C80000 | (MsgNr);\r
+ CanRegs[Controller]->IFx[IfRegId].COM = 0x00C80000 | (MsgNr); // E8??\r
\r
IfRegId ^= 1;\r
}\r
/* Clear CCE Bit */\r
CanRegs[Controller]->CTL &= ~0x00000040;\r
\r
- McuE_ExitCriticalSection(i_state);\r
+ Irq_Restore(state);\r
}\r
\r
\r
break;\r
\r
case CAN_T_SLEEP:\r
- /* Set PDR Bit */\r
+ /* Set PDR Bit - Local Power Down Mode requested */\r
CanRegs[Controller]->CTL |= 0x01000000;\r
/* Save actual Register status */\r
RegBuf = CanRegs[Controller]->CTL;\r
Can_PduType *CurPduArrayPtr;\r
uint8 *CurCancelRqstPtr;\r
uint8 *CurTxRqstPtr;\r
+ imask_t state;\r
\r
- CurSduPtr = PduInfo->sdu;\r
+ CurSduPtr = PduInfo->sdu; // e.g. ComArcIPduBuffer_TX_PDU\r
\r
\r
/* DET Error Check */\r
continue; // This message object is not part of this hoh.\r
}\r
/* Check if TxRqst Bit of MsgObject is set */\r
- if(CanRegs[ControllerId]->TRx[MsgNr >> 5] & (1 << (MsgNr & 0x1F)))\r
+ if(CanRegs[ControllerId]->TRx[MsgNr >> 5] & (1 << (MsgNr & 0x1F))) // (1 << (MsgNr & 0x1F)) - bitIndex\r
{\r
continue;\r
}\r
DCAN_WAIT_UNTIL_NOT_BUSY(ControllerId, IfRegId);\r
\r
// We cannot allow an interrupt or other task to play with the COM, MC and ARB registers here.\r
- imask_t i_state = McuE_EnterCriticalSection();\r
+ Irq_Save(state);\r
\r
\r
/* Set NewDat, TxIE (dep on ControllerConfig), TxRqst, EoB and DLC */\r
| (0x000F & PduInfo->length) // Set DLC\r
| (CanControllerConfigData[ControllerId].CanTxProcessing << 1); // Tx confirmation interrupt enabled\r
\r
-\r
/* Set ArbitrationRegister */\r
CanRegs[ControllerId]->IFx[IfRegId].ARB = ArbRegValue;\r
\r
+\r
/* Set Databytes */\r
for(DataByteIndex = 0; DataByteIndex < PduInfo->length; DataByteIndex++)\r
{\r
\r
IfRegId ^= 1;\r
\r
- McuE_ExitCriticalSection(i_state);\r
+ Irq_Restore(state);\r
return CAN_OK;\r
}\r
\r