@@ -85,8 +85,10 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
85
85
error ("Cannot initialize CAN" );
86
86
}
87
87
88
- // Set initial CAN frequency to requested kb/s
89
- can_frequency (obj , hz );
88
+ // Set initial CAN frequency to 100 kb/s
89
+ if (can_frequency (obj , 100000 ) != 1 ) {
90
+ error ("Can frequency could not be set\n" );
91
+ }
90
92
91
93
uint32_t filter_number = (obj -> can == CAN_1 ) ? 0 : 14 ;
92
94
can_filter (obj , 0 , 0 , CANStandard , filter_number );
@@ -195,19 +197,40 @@ int can_frequency(can_t *obj, int f)
195
197
int pclk = HAL_RCC_GetPCLK1Freq ();
196
198
int btr = can_speed (pclk , (unsigned int )f , 1 );
197
199
CAN_TypeDef * can = (CAN_TypeDef * )(obj -> can );
200
+ uint32_t tickstart = 0 ;
201
+ int status = 1 ;
198
202
199
203
if (btr > 0 ) {
200
204
can -> MCR |= CAN_MCR_INRQ ;
205
+ /* Get tick */
206
+ tickstart = HAL_GetTick ();
201
207
while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
208
+ if ((HAL_GetTick () - tickstart ) > 2 ) {
209
+ status = 0 ;
210
+ break ;
211
+ }
202
212
}
203
- can -> BTR = btr ;
204
- can -> MCR &= ~(uint32_t )CAN_MCR_INRQ ;
205
- while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
213
+ if (status != 0 ) {
214
+ can -> BTR = btr ;
215
+ can -> MCR &= ~(uint32_t )CAN_MCR_INRQ ;
216
+ /* Get tick */
217
+ tickstart = HAL_GetTick ();
218
+ while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
219
+ if ((HAL_GetTick () - tickstart ) > 2 ) {
220
+ status = 0 ;
221
+ break ;
222
+ }
223
+ }
224
+ if (status == 0 ) {
225
+ error ("can ESR 0x%04x.%04x + timeout status %d" , (can -> ESR & 0xFFFF0000 ) >> 16 , (can -> ESR & 0xFFFF ), status );
226
+ }
227
+ } else {
228
+ error ("can init request timeout\n" );
206
229
}
207
- return 1 ;
208
230
} else {
209
- return 0 ;
231
+ status = 0 ;
210
232
}
233
+ return status ;
211
234
}
212
235
213
236
int can_write (can_t * obj , CAN_Message msg , int cc )
@@ -243,8 +266,8 @@ int can_write(can_t *obj, CAN_Message msg, int cc)
243
266
((uint32_t )msg .data [1 ] << 8 ) |
244
267
((uint32_t )msg .data [0 ]));
245
268
can -> sTxMailBox [transmitmailbox ].TDHR = (((uint32_t )msg .data [7 ] << 24 ) |
246
- ((uint32_t )msg .data [6 ] << 16 ) |
247
- ((uint32_t )msg .data [5 ] << 8 ) |
269
+ ((uint32_t )msg .data [6 ] << 16 ) |
270
+ ((uint32_t )msg .data [5 ] << 8 ) |
248
271
((uint32_t )msg .data [4 ]));
249
272
/* Request transmission */
250
273
can -> sTxMailBox [transmitmailbox ].TIR |= CAN_TI0R_TXRQ ;
0 commit comments