Skip to content

Commit 932d727

Browse files
committed
bit stuffing support
1 parent be22522 commit 932d727

File tree

4 files changed

+135
-77
lines changed

4 files changed

+135
-77
lines changed

board/drivers/can.h

+9-75
Original file line numberDiff line numberDiff line change
@@ -461,84 +461,18 @@ void CAN3_SCE_IRQHandler() { can_sce(CAN3); }
461461

462462
#endif
463463

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-
495-
// CRC from real message
496-
1,1,1,0,1,1,1,0,1,0,1,0,0,1,1,1,
497-
498-
1, // CRC delimiter
499-
500-
1, // ACK
501-
1, // ACK delimiter
502-
1,1,1,1,1,1,1, // EOF
503-
1,1,1, // IFS
504-
};
505-
/*char test_pkt[] = {
506-
0,1,0,1, 0,1,0,1, 0,1,0,1,
507-
1,1,1,1,
508-
0,1,0,1, 0,1,0,1, 0,1,0,1,
509-
0,0,0,0,0,0,0,0,
510-
0,1,0,1, 0,1,0,1, 0,1,0,1,
511-
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
512-
0,1,0,1, 0,1,0,1, 0,1,0,1,};*/
513-
514-
#define SPEEED 30
515-
516-
// bitbang loop
517-
set_bitbanged_gmlan(1); // recessive
518-
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
519-
enter_critical_section();
520-
int init = TIM2->CNT;
521-
for (int i = 0; i < sizeof(test_pkt); i++) {
522-
while ((TIM2->CNT - init) < (SPEEED*i));
523-
set_bitbanged_gmlan(test_pkt[i]);
524-
}
525-
exit_critical_section();
526-
set_gpio_mode(GPIOB, 13, MODE_INPUT);
527-
528-
puts("bitbang done\n");
529-
}
464+
#include "canbitbang.h"
530465

531466
void can_send(CAN_FIFOMailBox_TypeDef *to_push, uint8_t bus_number) {
532467
if (safety_tx_hook(to_push) && !can_autobaud_enabled[bus_number]) {
533-
//if (bus_number == 3) { //&& can_num_lookup[3] == -1) {
534-
// TODO: why uint8 bro? only int8?
535-
if (bus_number == 3 && can_num_lookup[3] == 0xFF) {
536-
bitbang_gmlan(to_push);
537-
} else {
538-
if (bus_number < BUS_MAX) {
539-
// add CAN packet to send queue
540-
// bus number isn't passed through
541-
to_push->RDTR &= 0xF;
468+
if (bus_number < BUS_MAX) {
469+
// add CAN packet to send queue
470+
// bus number isn't passed through
471+
to_push->RDTR &= 0xF;
472+
if (bus_number == 3 && can_num_lookup[3] == 0xFF) {
473+
// TODO: why uint8 bro? only int8?
474+
bitbang_gmlan(to_push);
475+
} else {
542476
can_push(can_queues[bus_number], to_push);
543477
process_can(CAN_NUM_FROM_BUS_NUM(bus_number));
544478
}

board/drivers/canbitbang.h

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
2+
// returns out_len
3+
int do_bitstuff(char *out, char *in, int in_len) {
4+
int last_bit = -1;
5+
int bit_cnt = 0;
6+
int j = 0;
7+
for (int i = 0; i < in_len; i++) {
8+
char bit = in[i];
9+
out[j++] = bit;
10+
11+
// do the stuffing
12+
if (bit == last_bit) {
13+
bit_cnt++;
14+
if (bit_cnt == 5) {
15+
// 5 in a row the same, do stuff
16+
last_bit = !bit;
17+
out[j++] = last_bit;
18+
bit_cnt = 1;
19+
}
20+
} else {
21+
// this is a new bit
22+
last_bit = bit;
23+
bit_cnt = 1;
24+
}
25+
}
26+
return j;
27+
}
28+
29+
int get_bit_message(char *out) {
30+
char test_pkt[] = {
31+
0, // SOF
32+
0,0,0,0, // ID10-ID7
33+
//1, // bitstuff
34+
0,0,1,0,1,0,0, // ID6-ID0
35+
0, // RTR
36+
0, // IDE
37+
0, // reserved
38+
//1, // bitstuff
39+
0,0,0,1, // len
40+
0,0,0,0,0, // 1st byte 7-3
41+
//1, // bitstuff
42+
0,0,1, // 1st byte 2-0
43+
44+
// CRC from real message
45+
1,1,1,0,1,1,1,0,1,0,1,0,0,1,1,
46+
};
47+
char footer[] = {
48+
1, // CRC delimiter
49+
50+
1, // ACK
51+
1, // ACK delimiter
52+
1,1,1,1,1,1,1, // EOF
53+
1,1,1, // IFS
54+
};
55+
#define SPEEED 30
56+
57+
// testing
58+
//char *test_pkt_stuffed = test_pkt;
59+
//int len = sizeof(test_pkt);
60+
61+
// do bitstuffing
62+
int len = do_bitstuff(out, test_pkt, sizeof(test_pkt));
63+
64+
// append footer
65+
for (int i = 0; i < sizeof(footer); i++) {
66+
out[len++] = footer[i];
67+
}
68+
return len;
69+
}
70+
71+
// hardware stuff below this line
72+
73+
#ifdef PANDA
74+
75+
void set_bitbanged_gmlan(int val) {
76+
if (val) {
77+
GPIOB->ODR |= (1 << 13);
78+
} else {
79+
GPIOB->ODR &= ~(1 << 13);
80+
}
81+
}
82+
83+
void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
84+
puts("called bitbang_gmlan\n");
85+
puth(can_num_lookup[3]);
86+
puts("\n");
87+
88+
char pkt_stuffed[64+44+25];
89+
int len = get_bit_message(pkt_stuffed);
90+
91+
// actual bitbang loop
92+
set_bitbanged_gmlan(1); // recessive
93+
set_gpio_mode(GPIOB, 13, MODE_OUTPUT);
94+
enter_critical_section();
95+
int init = TIM2->CNT;
96+
97+
for (int i = 0; i < len; i++) {
98+
while ((TIM2->CNT - init) < (SPEEED*i));
99+
set_bitbanged_gmlan(pkt_stuffed[i]);
100+
}
101+
102+
exit_critical_section();
103+
set_gpio_mode(GPIOB, 13, MODE_INPUT);
104+
105+
puts("bitbang done\n");
106+
}
107+
108+
#endif
109+

tests/gmbitbang/rigol.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
data = np.frombuffer(rawdata, 'B')
2020
print data.shape
2121

22-
s1 = data[0:600]
23-
s2 = data[600:]
22+
s1 = data[0:650]
23+
s2 = data[650:]
2424
s1i = np.argmax(s1 > 100)
2525
s2i = np.argmax(s2 > 100)
2626
s1 = s1[s1i:]

tests/gmbitbang/test_packer.c

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include <stdio.h>
2+
#include "../../board/drivers/canbitbang.h"
3+
4+
int main() {
5+
char out[100];
6+
int len = get_bit_message(out);
7+
for (int i = 0; i < len; i++) {
8+
printf("%d", out[i]);
9+
}
10+
printf("\n");
11+
return 0;
12+
}
13+
14+
15+

0 commit comments

Comments
 (0)