@@ -461,14 +461,83 @@ void CAN3_SCE_IRQHandler() { can_sce(CAN3); }
461
461
462
462
#endif
463
463
464
+ void set_bitbanged_gmlan (int val ) {
465
+ if (val ) {
466
+ GPIOB -> ODR |= (1 << 13 );
467
+ } else {
468
+ GPIOB -> ODR &= ~(1 << 13 );
469
+ }
470
+ }
471
+
472
+ void bitbang_gmlan (CAN_FIFOMailBox_TypeDef * to_bang ) {
473
+ puts ("called bitbang_gmlan\n" );
474
+ puth (can_num_lookup [3 ]);
475
+ puts ("\n" );
476
+ char test_pkt [] = \
477
+ {0 , // SOF
478
+ 0 ,0 ,0 ,0 , // ID10-ID7
479
+ 1 , // bitstuff
480
+ 0 ,0 ,1 ,0 ,1 ,0 ,0 , // ID6-ID0
481
+ 0 , // RTR
482
+ 0 , // IDE
483
+ 0 , // reserved
484
+ 1 , // bitstuff
485
+ 0 ,0 ,0 ,1 , // len
486
+ 0 ,0 ,0 ,0 ,0 , // 1st byte 7-3
487
+ 1 , // bitstuff
488
+ 0 ,0 ,1 , // 1st byte 2-0
489
+
490
+ // start CRC
491
+ 0 ,1 ,0 ,0 ,0 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,
492
+ 1 , // bitstuff
493
+ 0 ,0 , // CRC field
494
+ 1 , // CRC delimiter
495
+
496
+ 1 , // ACK
497
+ 1 , // ACK delimiter
498
+ 1 ,1 ,1 ,1 ,1 ,1 ,1 , // EOF
499
+ 1 ,1 ,1 , // IFS
500
+ };
501
+ /*char test_pkt[] = {
502
+ 0,1,0,1, 0,1,0,1, 0,1,0,1,
503
+ 1,1,1,1,
504
+ 0,1,0,1, 0,1,0,1, 0,1,0,1,
505
+ 0,0,0,0,0,0,0,0,
506
+ 0,1,0,1, 0,1,0,1, 0,1,0,1,
507
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
508
+ 0,1,0,1, 0,1,0,1, 0,1,0,1,};*/
509
+
510
+ #define SPEEED 30
511
+
512
+ // bitbang loop
513
+ set_bitbanged_gmlan (1 ); // recessive
514
+ set_gpio_mode (GPIOB , 13 , MODE_OUTPUT );
515
+ enter_critical_section ();
516
+ int init = TIM2 -> CNT ;
517
+ for (int i = 0 ; i < sizeof (test_pkt ); i ++ ) {
518
+ while ((TIM2 -> CNT - init ) < (SPEEED * i ));
519
+ set_bitbanged_gmlan (test_pkt [i ]);
520
+ }
521
+ exit_critical_section ();
522
+ set_gpio_mode (GPIOB , 13 , MODE_INPUT );
523
+
524
+ puts ("bitbang done\n" );
525
+ }
526
+
464
527
void can_send (CAN_FIFOMailBox_TypeDef * to_push , uint8_t bus_number ) {
465
528
if (safety_tx_hook (to_push ) && !can_autobaud_enabled [bus_number ]) {
466
- if (bus_number < BUS_MAX ) {
467
- // add CAN packet to send queue
468
- // bus number isn't passed through
469
- to_push -> RDTR &= 0xF ;
470
- can_push (can_queues [bus_number ], to_push );
471
- process_can (CAN_NUM_FROM_BUS_NUM (bus_number ));
529
+ //if (bus_number == 3) { //&& can_num_lookup[3] == -1) {
530
+ // TODO: why uint8 bro? only int8?
531
+ if (bus_number == 3 && can_num_lookup [3 ] == 0xFF ) {
532
+ bitbang_gmlan (to_push );
533
+ } else {
534
+ if (bus_number < BUS_MAX ) {
535
+ // add CAN packet to send queue
536
+ // bus number isn't passed through
537
+ to_push -> RDTR &= 0xF ;
538
+ can_push (can_queues [bus_number ], to_push );
539
+ process_can (CAN_NUM_FROM_BUS_NUM (bus_number ));
540
+ }
472
541
}
473
542
}
474
543
}
0 commit comments