@@ -42,43 +42,54 @@ int append_crc(char *in, int in_len) {
42
42
return in_len ;
43
43
}
44
44
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
+ }
58
51
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 ];
59
61
char footer [] = {
60
62
1 , // CRC delimiter
61
-
62
63
1 , // ACK
63
64
1 , // ACK delimiter
64
65
1 ,1 ,1 ,1 ,1 ,1 ,1 , // EOF
65
66
1 ,1 ,1 , // IFS
66
67
};
67
68
#define SPEEED 30
68
69
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
+ }
71
84
72
85
// append crc
73
- int len = append_crc (test_pkt , sizeof ( test_pkt_src ) );
86
+ len = append_crc (pkt , len );
74
87
75
88
// do bitstuffing
76
- len = do_bitstuff (out , test_pkt , len );
89
+ len = do_bitstuff (out , pkt , len );
77
90
78
91
// 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 ));
82
93
return len ;
83
94
}
84
95
@@ -100,7 +111,7 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
100
111
puts ("\n" );
101
112
102
113
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 );
104
115
105
116
// actual bitbang loop
106
117
set_bitbanged_gmlan (1 ); // recessive
0 commit comments