Skip to content

Commit 2b9b964

Browse files
committedSep 2, 2021
Add: CAN1 peripheral
1 parent fb6c3fa commit 2b9b964

File tree

1 file changed

+173
-34
lines changed

1 file changed

+173
-34
lines changed
 

‎src/Driver_CAN.c

+173-34
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,27 @@ static int32_t
114114
ARM_CAN0_Initialize(ARM_CAN_SignalUnitEvent_t cb_unit_event,
115115
ARM_CAN_SignalObjectEvent_t cb_object_event);
116116
static int32_t
117+
ARM_CAN1_Initialize(ARM_CAN_SignalUnitEvent_t cb_unit_event,
118+
ARM_CAN_SignalObjectEvent_t cb_object_event);
119+
static int32_t
117120
ARM_CAN_Initialize(uint8_t CANIdx,
118121
ARM_CAN_SignalUnitEvent_t cb_unit_event,
119122
ARM_CAN_SignalObjectEvent_t cb_object_event);
123+
static int32_t ARM_CAN0_Uninitialize (void);
124+
static int32_t ARM_CAN1_Uninitialize (void);
125+
static int32_t ARM_CAN_Uninitialize (volatile CanHandle_t* CAN);
126+
120127
uint8_t Can_GetControllerIdx(volatile CanHandle_t* CAN);
121128
static int32_t
122129
ARM_CAN0_MessageRead(uint32_t ObjIdx,
123130
ARM_CAN_MSG_INFO *MsgInfo,
124131
uint8_t *Data,
125132
uint8_t Size);
133+
static int32_t
134+
ARM_CAN1_MessageRead(uint32_t ObjIdx,
135+
ARM_CAN_MSG_INFO *MsgInfo,
136+
uint8_t *Data,
137+
uint8_t Size);
126138

127139
static int32_t
128140
ARM_CAN_MessageRead(volatile CanHandle_t* CAN,
@@ -131,10 +143,26 @@ ARM_CAN_MessageRead(volatile CanHandle_t* CAN,
131143
uint8_t *Data,
132144
uint8_t Size);
133145
static int32_t ARM_CAN0_Control(uint32_t control, uint32_t arg);
146+
static int32_t ARM_CAN1_Control(uint32_t control, uint32_t arg);
134147
static int32_t ARM_CAN_Control (volatile CanHandle_t* CAN, uint32_t control, uint32_t arg);
135148

136149
static ARM_CAN_STATUS ARM_CAN0_GetStatus (void);
150+
static ARM_CAN_STATUS ARM_CAN1_GetStatus (void);
137151
static ARM_CAN_STATUS ARM_CAN_GetStatus (volatile CanHandle_t* CAN);
152+
153+
static int32_t
154+
ARM_CAN0_SetBitrate (ARM_CAN_BITRATE_SELECT select,
155+
uint32_t bitrate,
156+
uint32_t bit_segments);
157+
static int32_t
158+
ARM_CAN1_SetBitrate (ARM_CAN_BITRATE_SELECT select,
159+
uint32_t bitrate,
160+
uint32_t bit_segments);
161+
static int32_t
162+
ARM_CAN_SetBitrate (volatile CanHandle_t* CAN,
163+
ARM_CAN_BITRATE_SELECT select,
164+
uint32_t bitrate,
165+
uint32_t bit_segments);
138166
// module variable definitons
139167

140168
//driver version
@@ -166,8 +194,8 @@ static const ARM_CAN_OBJ_CAPABILITIES can_object_capabilities = {
166194
0U // Reserved (must be zero)
167195
};
168196

169-
static uint8_t can_driver_powered = 0U;
170-
static uint8_t can_driver_initialized = 0U;
197+
static uint8_t can_driver_powered[MAX_CAN_CONTROLLERS];
198+
static uint8_t can_driver_initialized[MAX_CAN_CONTROLLERS];
171199
static ARM_CAN_SignalUnitEvent_t CAN_SignalUnitEvent[MAX_CAN_CONTROLLERS];
172200
static ARM_CAN_SignalObjectEvent_t CAN_SignalObjectEvent[MAX_CAN_CONTROLLERS];
173201
static CanFilter_t gFilters[MAX_CAN_CONTROLLERS][MAX_OBJ_NUM];
@@ -193,26 +221,45 @@ ARM_CAN0_Initialize(ARM_CAN_SignalUnitEvent_t cb_unit_event,
193221
ARM_CAN_SignalObjectEvent_t cb_object_event)
194222
{
195223
return ARM_CAN_Initialize(0, cb_unit_event, cb_object_event);
224+
}
225+
226+
static int32_t
227+
ARM_CAN1_Initialize(ARM_CAN_SignalUnitEvent_t cb_unit_event,
228+
ARM_CAN_SignalObjectEvent_t cb_object_event)
229+
{
230+
return ARM_CAN_Initialize(1, cb_unit_event, cb_object_event);
196231
}
197232

198233
static int32_t
199234
ARM_CAN_Initialize(uint8_t CANIdx,
200235
ARM_CAN_SignalUnitEvent_t cb_unit_event,
201236
ARM_CAN_SignalObjectEvent_t cb_object_event)
202237
{
203-
204-
if (can_driver_initialized != 0U) return ARM_DRIVER_OK;
238+
if (can_driver_initialized[CANIdx] != 0U) return ARM_DRIVER_OK;
205239

206240
CAN_SignalUnitEvent[CANIdx] = cb_unit_event;
207241
CAN_SignalObjectEvent[CANIdx] = cb_object_event;
208242

209-
can_driver_initialized = 1U;
243+
can_driver_initialized[CANIdx] = 1U;
210244

211245
return ARM_DRIVER_OK;
212246
}
213247

214-
static int32_t ARM_CAN_Uninitialize (void) {
215-
can_driver_initialized = 0U;
248+
static int32_t
249+
ARM_CAN0_Uninitialize (void)
250+
{
251+
return ARM_CAN_Uninitialize(CAN0);
252+
}
253+
static int32_t
254+
ARM_CAN1_Uninitialize (void)
255+
{
256+
return ARM_CAN_Uninitialize(CAN1);
257+
}
258+
static int32_t
259+
ARM_CAN_Uninitialize (volatile CanHandle_t* CAN)
260+
{
261+
uint8_t CANIdx = Can_GetControllerIdx(CAN);
262+
can_driver_initialized[CANIdx] = 0U;
216263

217264
return ARM_DRIVER_OK;
218265
}
@@ -222,6 +269,11 @@ ARM_CAN0_PowerControl (ARM_POWER_STATE state)
222269
{
223270
return ARM_CAN_PowerControl(CAN0, state);
224271
}
272+
static int32_t
273+
ARM_CAN1_PowerControl (ARM_POWER_STATE state)
274+
{
275+
return ARM_CAN_PowerControl(CAN1, state);
276+
}
225277

226278
static int32_t
227279
ARM_CAN_PowerControl (volatile CanHandle_t* CAN,
@@ -231,21 +283,21 @@ ARM_CAN_PowerControl (volatile CanHandle_t* CAN,
231283

232284
switch (state) {
233285
case ARM_POWER_OFF:
234-
can_driver_powered = 0U;
286+
can_driver_powered[CANIdx] = 0U;
235287
// Add code to disable interrupts and put peripheral into reset mode,
236288
// and if possible disable clock
237289
// ..
238-
SRCAN |= 1 << SRCAN_CAN0; //reset
239-
Can_SetTimeout(&PRCAN, PRCAN_CAN0, CAN_FLAG_SET, 0xFFFF);
240-
SRCAN &= ~(1 << SRCAN_CAN0);
290+
SRCAN |= 1 << CANIdx; //reset
291+
Can_SetTimeout(&PRCAN, CANIdx, CAN_FLAG_SET, 0xFFFF);
292+
SRCAN &= ~(1 << CANIdx);
241293

242-
RCGCCAN &= ~(1 << RCGCCAN_CAN0); //disable clock
243-
Can_SetTimeout(&PRCAN, PRCAN_CAN0, CAN_FLAG_CLEAR, 0xFFFF);
294+
RCGCCAN &= ~(1 << CANIdx); //disable clock
295+
Can_SetTimeout(&PRCAN, CANIdx, CAN_FLAG_CLEAR, 0xFFFF);
244296
break;
245297

246298
case ARM_POWER_FULL:
247-
if (can_driver_initialized == 0U) { return ARM_DRIVER_ERROR; }
248-
if (can_driver_powered != 0U) { return ARM_DRIVER_OK; }
299+
if (can_driver_initialized[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
300+
if (can_driver_powered[CANIdx] != 0U) { return ARM_DRIVER_OK; }
249301

250302
uint8_t i;
251303
// Add code to enable clocks, reset variables enable interrupts
@@ -259,8 +311,8 @@ ARM_CAN_PowerControl (volatile CanHandle_t* CAN,
259311
//enable interrupt in NVIC
260312
NVICEN1 |= 1 << (NVICEN1_CAN0 + CANIdx);
261313

262-
can_driver_powered = 1U;
263-
can_driver_initialized = 0U;
314+
can_driver_powered[CANIdx] = 1U;
315+
can_driver_initialized[CANIdx] = 0U;
264316
for(i = 0; i < MAX_OBJ_NUM; i++)
265317
{
266318
gFilters[CANIdx][i].Valid = INVALID_FILTER;
@@ -281,19 +333,36 @@ static uint32_t ARM_CAN_GetClock (void) {
281333
return 0;
282334
}
283335

284-
static int32_t ARM_CAN_SetBitrate (ARM_CAN_BITRATE_SELECT select, uint32_t bitrate, uint32_t bit_segments) {
285-
286-
if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; }
336+
static int32_t
337+
ARM_CAN0_SetBitrate (ARM_CAN_BITRATE_SELECT select,
338+
uint32_t bitrate,
339+
uint32_t bit_segments)
340+
{
341+
return ARM_CAN_SetBitrate(CAN0, select, bitrate, bit_segments);
342+
}
343+
static int32_t
344+
ARM_CAN1_SetBitrate (ARM_CAN_BITRATE_SELECT select,
345+
uint32_t bitrate,
346+
uint32_t bit_segments)
347+
{
348+
return ARM_CAN_SetBitrate(CAN1, select, bitrate, bit_segments);
349+
}
287350

288-
// Add code to setup peripheral parameters to generate specified bitrate
289-
// with specified bit segments
290-
// ..
351+
static int32_t
352+
ARM_CAN_SetBitrate (volatile CanHandle_t* CAN,
353+
ARM_CAN_BITRATE_SELECT select,
354+
uint32_t bitrate,
355+
uint32_t bit_segments)
356+
{
291357
uint32_t BRP;
292358
uint32_t Phase1;
293359
uint32_t Phase2;
294360
uint32_t Prop;
295361
uint32_t SJW;
296362
uint32_t N;
363+
uint8_t CANIdx = Can_GetControllerIdx(CAN);
364+
365+
if (can_driver_powered[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
297366

298367
if(bitrate == 0 || bitrate > (2000000UL))
299368
{
@@ -348,10 +417,16 @@ ARM_CAN0_SetMode(ARM_CAN_MODE mode)
348417
{
349418
return ARM_CAN_SetMode(CAN0, mode);
350419
}
420+
static int32_t
421+
ARM_CAN1_SetMode(ARM_CAN_MODE mode)
422+
{
423+
return ARM_CAN_SetMode(CAN1, mode);
424+
}
351425

352426
static int32_t ARM_CAN_SetMode (volatile CanHandle_t* CAN, ARM_CAN_MODE mode) {
427+
uint8_t CANIdx = Can_GetControllerIdx(CAN);
353428

354-
if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; }
429+
if (can_driver_powered[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
355430

356431
switch (mode) {
357432
case ARM_CAN_MODE_INITIALIZATION:
@@ -403,6 +478,14 @@ ARM_CAN0_ObjectSetFilter(uint32_t ObjIdx,
403478
{
404479
return ARM_CAN_ObjectSetFilter(CAN0, ObjIdx, operation, id, arg);
405480
}
481+
static int32_t
482+
ARM_CAN1_ObjectSetFilter(uint32_t ObjIdx,
483+
ARM_CAN_FILTER_OPERATION operation,
484+
uint32_t id,
485+
uint32_t arg)
486+
{
487+
return ARM_CAN_ObjectSetFilter(CAN1, ObjIdx, operation, id, arg);
488+
}
406489

407490
static int32_t
408491
ARM_CAN_ObjectSetFilter(volatile CanHandle_t* CAN,
@@ -411,7 +494,8 @@ ARM_CAN_ObjectSetFilter(volatile CanHandle_t* CAN,
411494
uint32_t id,
412495
uint32_t arg)
413496
{
414-
if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; }
497+
uint8_t CANIdx = Can_GetControllerIdx(CAN);
498+
if (can_driver_powered[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
415499

416500
switch (operation) {
417501
case ARM_CAN_FILTER_ID_EXACT_ADD:
@@ -434,13 +518,20 @@ ARM_CAN0_ObjectConfigure (uint32_t ObjIdx,
434518
return ARM_CAN_ObjectConfigure(CAN0, ObjIdx, ObjCfg);
435519
}
436520
static int32_t
521+
ARM_CAN1_ObjectConfigure (uint32_t ObjIdx,
522+
ARM_CAN_OBJ_CONFIG ObjCfg)
523+
{
524+
return ARM_CAN_ObjectConfigure(CAN1, ObjIdx, ObjCfg);
525+
}
526+
static int32_t
437527
ARM_CAN_ObjectConfigure (volatile CanHandle_t* CAN,
438528
uint32_t ObjIdx,
439529
ARM_CAN_OBJ_CONFIG ObjCfg)
440530
{
441531
int32_t state;
442-
uint8_t CANIdx;
443-
if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; }
532+
uint8_t CANIdx = Can_GetControllerIdx(CAN);
533+
534+
if (can_driver_powered[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
444535

445536
//stop the message by marking it as invalid
446537
state = Can_WriteReadMsgObj(CAN, MSG_OBJ_R, ObjIdx,
@@ -502,6 +593,14 @@ ARM_CAN0_MessageSend(uint32_t ObjIdx,
502593
{
503594
return ARM_CAN_MessageSend(CAN0, ObjIdx, MsgInfo, Data, Size);
504595
}
596+
static int32_t
597+
ARM_CAN1_MessageSend(uint32_t ObjIdx,
598+
ARM_CAN_MSG_INFO *MsgInfo,
599+
const uint8_t *Data,
600+
uint8_t Size)
601+
{
602+
return ARM_CAN_MessageSend(CAN1, ObjIdx, MsgInfo, Data, Size);
603+
}
505604

506605
static int32_t
507606
ARM_CAN_MessageSend(volatile CanHandle_t* CAN,
@@ -513,7 +612,7 @@ ARM_CAN_MessageSend(volatile CanHandle_t* CAN,
513612
int32_t state;
514613
uint8_t CANIdx = Can_GetControllerIdx(CAN);
515614

516-
if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; }
615+
if (can_driver_powered[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
517616

518617
if(
519618
(gObjCfgs[CANIdx][ObjIdx] != ARM_CAN_OBJ_TX_RTR_RX_DATA &&
@@ -598,6 +697,14 @@ ARM_CAN0_MessageRead(uint32_t ObjIdx,
598697
{
599698
return ARM_CAN_MessageRead(CAN0, ObjIdx, MsgInfo, Data, Size);
600699
}
700+
static int32_t
701+
ARM_CAN1_MessageRead(uint32_t ObjIdx,
702+
ARM_CAN_MSG_INFO *MsgInfo,
703+
uint8_t *Data,
704+
uint8_t Size)
705+
{
706+
return ARM_CAN_MessageRead(CAN1, ObjIdx, MsgInfo, Data, Size);
707+
}
601708

602709
static int32_t
603710
ARM_CAN_MessageRead(volatile CanHandle_t* CAN,
@@ -610,7 +717,7 @@ ARM_CAN_MessageRead(volatile CanHandle_t* CAN,
610717
uint8_t dlc;
611718
uint8_t CANIdx = Can_GetControllerIdx(CAN);
612719

613-
if (can_driver_powered == 0U) return ARM_DRIVER_ERROR;
720+
if (can_driver_powered[CANIdx] == 0U) return ARM_DRIVER_ERROR;
614721

615722
if(
616723
(gObjCfgs[CANIdx][ObjIdx] != ARM_CAN_OBJ_TX_RTR_RX_DATA &&
@@ -647,13 +754,20 @@ ARM_CAN_MessageRead(volatile CanHandle_t* CAN,
647754
static int32_t
648755
ARM_CAN0_Control(uint32_t control, uint32_t arg)
649756
{
650-
ARM_CAN_Control(CAN0, control, arg);
757+
return ARM_CAN_Control(CAN0, control, arg);
758+
}
759+
static int32_t
760+
ARM_CAN1_Control(uint32_t control, uint32_t arg)
761+
{
762+
return ARM_CAN_Control(CAN1, control, arg);
651763
}
652764
static int32_t
653765
ARM_CAN_Control (volatile CanHandle_t* CAN, uint32_t control, uint32_t arg)
654766
{
655767
int32_t state;
656-
if (can_driver_powered == 0U) { return ARM_DRIVER_ERROR; }
768+
uint8_t CANIdx = Can_GetControllerIdx(CAN);
769+
770+
if (can_driver_powered[CANIdx] == 0U) { return ARM_DRIVER_ERROR; }
657771

658772
switch (control & ARM_CAN_CONTROL_Msk) {
659773
case ARM_CAN_ABORT_MESSAGE_SEND:
@@ -686,6 +800,11 @@ ARM_CAN0_GetStatus (void)
686800
{
687801
return ARM_CAN_GetStatus(CAN0);
688802
}
803+
static ARM_CAN_STATUS
804+
ARM_CAN1_GetStatus (void)
805+
{
806+
return ARM_CAN_GetStatus(CAN1);
807+
}
689808

690809
static ARM_CAN_STATUS
691810
ARM_CAN_GetStatus (volatile CanHandle_t* CAN)
@@ -1074,7 +1193,7 @@ CAN_Handler(volatile CanHandle_t* CAN)
10741193
uint32_t UnitSource;
10751194
uint32_t ObjIdx;
10761195
uint8_t CANIdx = Can_GetControllerIdx(CAN);
1077-
if (can_driver_powered == 0U) return;
1196+
if (can_driver_powered[CANIdx] == 0U) return;
10781197
if(CAN_SignalObjectEvent[CANIdx] == NULL || CAN_SignalUnitEvent[CANIdx] == NULL) return;
10791198

10801199
IntSource = CAN->CTL.INT;
@@ -1139,10 +1258,10 @@ ARM_DRIVER_CAN Driver_CAN0 = {
11391258
ARM_CAN_GetVersion,
11401259
ARM_CAN_GetCapabilities,
11411260
ARM_CAN0_Initialize,
1142-
ARM_CAN_Uninitialize,
1261+
ARM_CAN0_Uninitialize,
11431262
ARM_CAN0_PowerControl,
11441263
ARM_CAN_GetClock,
1145-
ARM_CAN_SetBitrate,
1264+
ARM_CAN0_SetBitrate,
11461265
ARM_CAN0_SetMode,
11471266
ARM_CAN_ObjectGetCapabilities,
11481267
ARM_CAN0_ObjectSetFilter,
@@ -1153,3 +1272,23 @@ ARM_DRIVER_CAN Driver_CAN0 = {
11531272
ARM_CAN0_GetStatus
11541273
};
11551274

1275+
extern \
1276+
ARM_DRIVER_CAN Driver_CAN1;
1277+
ARM_DRIVER_CAN Driver_CAN1 = {
1278+
ARM_CAN_GetVersion,
1279+
ARM_CAN_GetCapabilities,
1280+
ARM_CAN1_Initialize,
1281+
ARM_CAN1_Uninitialize,
1282+
ARM_CAN1_PowerControl,
1283+
ARM_CAN_GetClock,
1284+
ARM_CAN1_SetBitrate,
1285+
ARM_CAN1_SetMode,
1286+
ARM_CAN_ObjectGetCapabilities,
1287+
ARM_CAN1_ObjectSetFilter,
1288+
ARM_CAN1_ObjectConfigure,
1289+
ARM_CAN1_MessageSend,
1290+
ARM_CAN1_MessageRead,
1291+
ARM_CAN1_Control,
1292+
ARM_CAN1_GetStatus
1293+
};
1294+

0 commit comments

Comments
 (0)
Please sign in to comment.