Skip to content

Commit d917386

Browse files
committed
bitbanging works
1 parent 74af441 commit d917386

File tree

3 files changed

+51
-26
lines changed

3 files changed

+51
-26
lines changed

board/drivers/canbitbang.h

+33-22
Original file line numberDiff line numberDiff line change
@@ -42,43 +42,54 @@ int append_crc(char *in, int in_len) {
4242
return in_len;
4343
}
4444

45-
int get_bit_message(char *out) {
46-
char test_pkt[MAX_BITS_CAN_PACKET];
47-
char test_pkt_src[] = {
48-
0, // SOF
49-
0,0,0,0, // ID10-ID7
50-
0,0,1,0,1,0,0, // ID6-ID0
51-
0, // RTR
52-
0, // IDE
53-
0, // reserved
54-
0,0,0,1, // len
55-
0,0,0,0,0, // 1st byte 7-3
56-
0,0,1, // 1st byte 2-0
57-
};
45+
int append_bits(char *in, int in_len, char *app, int app_len) {
46+
for (int i = 0; i < app_len; i++) {
47+
in[in_len++] = app[i];
48+
}
49+
return in_len;
50+
}
5851

52+
int append_int(char *in, int in_len, int val, int val_len) {
53+
for (int i = val_len-1; i >= 0; i--) {
54+
in[in_len++] = (val&(1<<i)) != 0;
55+
}
56+
return in_len;
57+
}
58+
59+
int get_bit_message(char *out, CAN_FIFOMailBox_TypeDef *to_bang) {
60+
char pkt[MAX_BITS_CAN_PACKET];
5961
char footer[] = {
6062
1, // CRC delimiter
61-
6263
1, // ACK
6364
1, // ACK delimiter
6465
1,1,1,1,1,1,1, // EOF
6566
1,1,1, // IFS
6667
};
6768
#define SPEEED 30
6869

69-
// copy packet
70-
for (int i = 0; i < sizeof(test_pkt_src); i++) test_pkt[i] = test_pkt_src[i];
70+
int len = 0;
71+
72+
// test packet
73+
int dlc_len = to_bang->RDTR & 0xF;
74+
len = append_int(pkt, len, 0, 1); // Start-of-frame
75+
len = append_int(pkt, len, to_bang->RIR >> 21, 11); // Identifier
76+
len = append_int(pkt, len, 0, 3); // RTR+IDE+reserved
77+
len = append_int(pkt, len, dlc_len, 4); // Data length code
78+
79+
// append data
80+
for (int i = 0; i < dlc_len; i++) {
81+
unsigned char dat = ((unsigned char *)(&(to_bang->RDLR)))[i];
82+
len = append_int(pkt, len, dat, 8);
83+
}
7184

7285
// append crc
73-
int len = append_crc(test_pkt, sizeof(test_pkt_src));
86+
len = append_crc(pkt, len);
7487

7588
// do bitstuffing
76-
len = do_bitstuff(out, test_pkt, len);
89+
len = do_bitstuff(out, pkt, len);
7790

7891
// append footer
79-
for (int i = 0; i < sizeof(footer); i++) {
80-
out[len++] = footer[i];
81-
}
92+
len = append_bits(out, len, footer, sizeof(footer));
8293
return len;
8394
}
8495

@@ -100,7 +111,7 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
100111
puts("\n");
101112

102113
char pkt_stuffed[MAX_BITS_CAN_PACKET];
103-
int len = get_bit_message(pkt_stuffed);
114+
int len = get_bit_message(pkt_stuffed, to_bang);
104115

105116
// actual bitbang loop
106117
set_bitbanged_gmlan(1); // recessive

tests/gmbitbang/test.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
# send w bitbang then without
2020
while 1:
2121
p1.set_gmlan(bus=None)
22-
p1.can_send(20, "\x01", bus=3)
22+
p1.can_send(123, "\x01\x02\x03\x04\x05\x06\x07\x08", bus=3)
2323
p1.set_gmlan(bus=2)
24-
p1.can_send(20, "\x01", bus=3)
24+
p1.can_send(123, "\x01\x02\x03\x04\x05\x06\x07\x08", bus=3)
2525
time.sleep(0.01)
2626
print p2.can_recv()
2727

tests/gmbitbang/test_packer.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
#include <stdio.h>
2+
#include <stdint.h>
3+
4+
typedef struct {
5+
uint32_t RIR; /*!< CAN receive FIFO mailbox identifier register */
6+
uint32_t RDTR; /*!< CAN receive FIFO mailbox data length control and time stamp register */
7+
uint32_t RDLR; /*!< CAN receive FIFO mailbox data low register */
8+
uint32_t RDHR; /*!< CAN receive FIFO mailbox data high register */
9+
} CAN_FIFOMailBox_TypeDef;
10+
211
#include "../../board/drivers/canbitbang.h"
312

413
int main() {
5-
char out[100];
6-
int len = get_bit_message(out);
14+
char out[300];
15+
CAN_FIFOMailBox_TypeDef to_bang = {0};
16+
to_bang.RIR = 20 << 21;
17+
to_bang.RDTR = 1;
18+
to_bang.RDLR = 1;
19+
20+
int len = get_bit_message(out, &to_bang);
721
printf("T:");
822
for (int i = 0; i < len; i++) {
923
printf("%d", out[i]);

0 commit comments

Comments
 (0)