@@ -116,29 +116,34 @@ void set_bitbanged_gmlan(int val) {
116
116
}
117
117
118
118
void bitbang_gmlan (CAN_FIFOMailBox_TypeDef * to_bang ) {
119
- puts ("called bitbang_gmlan\n" );
120
-
121
119
char pkt_stuffed [MAX_BITS_CAN_PACKET ];
122
120
int len = get_bit_message (pkt_stuffed , to_bang );
123
121
122
+ // TODO: interrupts are disabled for a long time...
123
+ enter_critical_section ();
124
+
124
125
// actual bitbang loop
125
126
set_bitbanged_gmlan (1 ); // recessive
126
127
set_gpio_mode (GPIOB , 13 , MODE_OUTPUT );
127
- enter_critical_section ();
128
128
129
129
// 33.3 kbps
130
130
#define SPEEED 30
131
131
132
132
// wait for bus silent for 7 frames
133
133
int silent_count = 0 ;
134
134
while (silent_count < 7 ) {
135
+ if (silent_count > 0 ) {
136
+ // bit time delay
137
+ int lwait = TIM2 -> CNT ;
138
+ while (get_ts_elapsed (TIM2 -> CNT , lwait ) < SPEEED );
139
+ }
140
+
141
+ // check for silent
135
142
int read = get_gpio_input (GPIOB , 12 );
136
143
silent_count ++ ;
137
144
if (read == 0 ) {
138
145
silent_count = 0 ;
139
146
}
140
- int lwait = TIM2 -> CNT ;
141
- while (get_ts_elapsed (TIM2 -> CNT , lwait ) < SPEEED );
142
147
}
143
148
144
149
// send my message with optional failure
@@ -159,10 +164,8 @@ void bitbang_gmlan(CAN_FIFOMailBox_TypeDef *to_bang) {
159
164
160
165
fail :
161
166
set_bitbanged_gmlan (1 ); // recessive
162
- exit_critical_section ();
163
167
set_gpio_mode (GPIOB , 13 , MODE_INPUT );
164
-
165
- puts ("bitbang done\n" );
168
+ exit_critical_section ();
166
169
}
167
170
168
171
#endif
0 commit comments