@@ -107,8 +107,6 @@ void set_bitbanged_gmlan(int val) {
107
107
108
108
void bitbang_gmlan (CAN_FIFOMailBox_TypeDef * to_bang ) {
109
109
puts ("called bitbang_gmlan\n" );
110
- puth (can_num_lookup [3 ]);
111
- puts ("\n" );
112
110
113
111
char pkt_stuffed [MAX_BITS_CAN_PACKET ];
114
112
int len = get_bit_message (pkt_stuffed , to_bang );
@@ -117,13 +115,37 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
117
115
set_bitbanged_gmlan (1 ); // recessive
118
116
set_gpio_mode (GPIOB , 13 , MODE_OUTPUT );
119
117
enter_critical_section ();
120
- int init = TIM2 -> CNT ;
121
118
119
+ // wait for bus silent for 7 frames
120
+ int silent_count = 0 ;
121
+ while (silent_count < 7 ) {
122
+ int read = get_gpio_input (GPIOB , 12 );
123
+ silent_count ++ ;
124
+ if (read == 0 ) {
125
+ silent_count = 0 ;
126
+ }
127
+ int lwait = TIM2 -> CNT ;
128
+ while ((TIM2 -> CNT - lwait ) < SPEEED );
129
+ }
130
+
131
+ // send my message with optional failure
132
+ int last = 1 ;
133
+ int init = TIM2 -> CNT ;
122
134
for (int i = 0 ; i < len ; i ++ ) {
123
135
while ((TIM2 -> CNT - init ) < (SPEEED * i ));
136
+ int read = get_gpio_input (GPIOB , 12 );
137
+ if ((read == 0 && last == 1 ) && i != (len - 11 )) {
138
+ puts ("ERR: bus driven at " );
139
+ puth (i );
140
+ puts ("\n" );
141
+ goto fail ;
142
+ }
124
143
set_bitbanged_gmlan (pkt_stuffed [i ]);
144
+ last = pkt_stuffed [i ];
125
145
}
126
146
147
+ fail :
148
+ set_bitbanged_gmlan (1 ); // recessive
127
149
exit_critical_section ();
128
150
set_gpio_mode (GPIOB , 13 , MODE_INPUT );
129
151
0 commit comments