@@ -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,34 @@ 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 = 0 ;
198
202
199
203
if (btr > 0 ) {
200
204
can -> MCR |= CAN_MCR_INRQ ;
201
205
while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
202
206
}
207
+ /* Get tick */
208
+ tickstart = HAL_GetTick ();
203
209
can -> BTR = btr ;
204
210
can -> MCR &= ~(uint32_t )CAN_MCR_INRQ ;
205
211
while ((can -> MSR & CAN_MSR_INAK ) == CAN_MSR_INAK ) {
212
+ if ((HAL_GetTick () - tickstart ) > 2 )
213
+ {
214
+ status = HAL_CAN_STATE_TIMEOUT ;
215
+ break ;
216
+ }
217
+ }
218
+ if (status != 0 ) {
219
+ error ("can ESR 0x%04x.%04x + timeout status %d" , (can -> ESR & 0XFFFF0000 )>>16 , (can -> ESR & 0XFFFF ), status );
220
+ status = 0 ;
221
+ } else {
222
+ status = 1 ; //mbed OK value
206
223
}
207
- return 1 ;
208
224
} else {
209
- return 0 ;
225
+ status = 0 ;
210
226
}
227
+ return status ;
211
228
}
212
229
213
230
int can_write (can_t * obj , CAN_Message msg , int cc )
@@ -243,8 +260,8 @@ int can_write(can_t *obj, CAN_Message msg, int cc)
243
260
((uint32_t )msg .data [1 ] << 8 ) |
244
261
((uint32_t )msg .data [0 ]));
245
262
can -> sTxMailBox [transmitmailbox ].TDHR = (((uint32_t )msg .data [7 ] << 24 ) |
246
- ((uint32_t )msg .data [6 ] << 16 ) |
247
- ((uint32_t )msg .data [5 ] << 8 ) |
263
+ ((uint32_t )msg .data [6 ] << 16 ) |
264
+ ((uint32_t )msg .data [5 ] << 8 ) |
248
265
((uint32_t )msg .data [4 ]));
249
266
/* Request transmission */
250
267
can -> sTxMailBox [transmitmailbox ].TIR |= CAN_TI0R_TXRQ ;
0 commit comments