@@ -137,7 +137,27 @@ void comm_can_init(void) {
137
137
PAL_STM32_OTYPE_PUSHPULL |
138
138
PAL_STM32_OSPEED_MID1 );
139
139
140
+ #ifdef HW_CAN2_DEV
141
+ palSetPadMode (HW_CAN2_RX_PORT , HW_CAN2_RX_PIN ,
142
+ PAL_MODE_ALTERNATE (HW_CAN2_GPIO_AF ) |
143
+ PAL_STM32_OTYPE_PUSHPULL |
144
+ PAL_STM32_OSPEED_MID1 );
145
+ palSetPadMode (HW_CAN2_TX_PORT , HW_CAN2_TX_PIN ,
146
+ PAL_MODE_ALTERNATE (HW_CAN2_GPIO_AF ) |
147
+ PAL_STM32_OTYPE_PUSHPULL |
148
+ PAL_STM32_OSPEED_MID1 );
149
+
150
+ canStart (& CAND1 , & cancfg );
151
+ canStart (& CAND2 , & cancfg );
152
+ #else
153
+ // CAND1 must be running for CAND2 to work
154
+ CANDriver * cand = & HW_CAN_DEV ;
155
+ if (cand == & CAND2 ) {
156
+ canStart (& CAND1 , & cancfg );
157
+ }
158
+
140
159
canStart (& HW_CAN_DEV , & cancfg );
160
+ #endif
141
161
142
162
canard_driver_init ();
143
163
@@ -220,7 +240,18 @@ void comm_can_transmit_eid_replace(uint32_t id, const uint8_t *data, uint8_t len
220
240
memcpy (txmsg .data8 , data , len );
221
241
222
242
chMtxLock (& can_mtx );
243
+ #ifdef HW_CAN2_DEV
244
+ for (int i = 0 ;i < 10 ;i ++ ) {
245
+ msg_t ok = canTransmit (& HW_CAN_DEV , CAN_ANY_MAILBOX , & txmsg , TIME_IMMEDIATE );
246
+ msg_t ok2 = canTransmit (& HW_CAN2_DEV , CAN_ANY_MAILBOX , & txmsg , TIME_IMMEDIATE );
247
+ if (ok == MSG_OK || ok2 == MSG_OK ) {
248
+ break ;
249
+ }
250
+ chThdSleepMicroseconds (500 );
251
+ }
252
+ #else
223
253
canTransmit (& HW_CAN_DEV , CAN_ANY_MAILBOX , & txmsg , MS2ST (5 ));
254
+ #endif
224
255
chMtxUnlock (& can_mtx );
225
256
#else
226
257
(void )id ;
@@ -252,7 +283,18 @@ void comm_can_transmit_sid(uint32_t id, uint8_t *data, uint8_t len) {
252
283
memcpy (txmsg .data8 , data , len );
253
284
254
285
chMtxLock (& can_mtx );
286
+ #ifdef HW_CAN2_DEV
287
+ for (int i = 0 ;i < 10 ;i ++ ) {
288
+ msg_t ok = canTransmit (& HW_CAN_DEV , CAN_ANY_MAILBOX , & txmsg , TIME_IMMEDIATE );
289
+ msg_t ok2 = canTransmit (& HW_CAN2_DEV , CAN_ANY_MAILBOX , & txmsg , TIME_IMMEDIATE );
290
+ if (ok == MSG_OK || ok2 == MSG_OK ) {
291
+ break ;
292
+ }
293
+ chThdSleepMicroseconds (500 );
294
+ }
295
+ #else
255
296
canTransmit (& HW_CAN_DEV , CAN_ANY_MAILBOX , & txmsg , MS2ST (5 ));
297
+ #endif
256
298
chMtxUnlock (& can_mtx );
257
299
#else
258
300
(void )id ;
@@ -1073,6 +1115,10 @@ static THD_FUNCTION(cancom_read_thread, arg) {
1073
1115
CANRxFrame rxmsg ;
1074
1116
1075
1117
chEvtRegister (& HW_CAN_DEV .rxfull_event , & el , 0 );
1118
+ #ifdef HW_CAN2_DEV
1119
+ event_listener_t el2 ;
1120
+ chEvtRegister (& HW_CAN2_DEV .rxfull_event , & el2 , 0 );
1121
+ #endif
1076
1122
1077
1123
while (!chThdShouldTerminateX ()) {
1078
1124
// Feed watchdog
@@ -1096,9 +1142,29 @@ static THD_FUNCTION(cancom_read_thread, arg) {
1096
1142
1097
1143
result = canReceive (& HW_CAN_DEV , CAN_ANY_MAILBOX , & rxmsg , TIME_IMMEDIATE );
1098
1144
}
1145
+
1146
+ #ifdef HW_CAN2_DEV
1147
+ result = canReceive (& HW_CAN2_DEV , CAN_ANY_MAILBOX , & rxmsg , TIME_IMMEDIATE );
1148
+
1149
+ while (result == MSG_OK ) {
1150
+ chMtxLock (& can_rx_mtx );
1151
+ rx_frames [rx_frame_write ++ ] = rxmsg ;
1152
+ if (rx_frame_write == RX_FRAMES_SIZE ) {
1153
+ rx_frame_write = 0 ;
1154
+ }
1155
+ chMtxUnlock (& can_rx_mtx );
1156
+
1157
+ chEvtSignal (process_tp , (eventmask_t ) 1 );
1158
+
1159
+ result = canReceive (& HW_CAN2_DEV , CAN_ANY_MAILBOX , & rxmsg , TIME_IMMEDIATE );
1160
+ }
1161
+ #endif
1099
1162
}
1100
1163
1101
1164
chEvtUnregister (& HW_CAN_DEV .rxfull_event , & el );
1165
+ #ifdef HW_CAN2_DEV
1166
+ chEvtUnregister (& HW_CAN2_DEV .rxfull_event , & el2 );
1167
+ #endif
1102
1168
}
1103
1169
1104
1170
static THD_FUNCTION (cancom_process_thread , arg ) {
@@ -1823,6 +1889,13 @@ static void set_timing(int brp, int ts1, int ts2) {
1823
1889
cancfg .btr = CAN_BTR_SJW (3 ) | CAN_BTR_TS2 (ts2 ) |
1824
1890
CAN_BTR_TS1 (ts1 ) | CAN_BTR_BRP (brp );
1825
1891
1892
+ #ifdef HW_CAN2_DEV
1893
+ canStop (& CAND1 );
1894
+ canStart (& CAND1 , & cancfg );
1895
+ canStop (& CAND2 );
1896
+ canStart (& CAND2 , & cancfg );
1897
+ #else
1826
1898
canStop (& HW_CAN_DEV );
1827
1899
canStart (& HW_CAN_DEV , & cancfg );
1900
+ #endif
1828
1901
}
0 commit comments