30
30
* ownership rights.
31
31
*******************************************************************************
32
32
*/
33
-
33
+
34
34
#include "mbed_assert.h"
35
35
#include "i2c_api.h"
36
36
#include "cmsis.h"
@@ -230,14 +230,16 @@ int i2c_byte_write(i2c_t *obj, int data)
230
230
// Wait for the FIFO to be empty
231
231
while (!(obj -> i2c -> intfl & MXC_F_I2CM_INTFL_TX_FIFO_EMPTY )) {}
232
232
233
- if (obj -> i2c -> intfl & MXC_F_I2CM_INTFL_TX_NACKED ) {
233
+ if (obj -> i2c -> intfl & MXC_F_I2CM_INTFL_TX_NACKED ) {
234
+ i2c_reset (obj );
234
235
return 1 ;
235
236
}
236
237
237
- if (obj -> i2c -> intfl & (MXC_F_I2CM_INTFL_TX_TIMEOUT | MXC_F_I2CM_INTFL_TX_LOST_ARBITR )) {
238
+ if (obj -> i2c -> intfl & (MXC_F_I2CM_INTFL_TX_TIMEOUT | MXC_F_I2CM_INTFL_TX_LOST_ARBITR )) {
239
+ i2c_reset (obj );
238
240
return 2 ;
239
241
}
240
-
242
+
241
243
return 0 ;
242
244
}
243
245
@@ -256,6 +258,7 @@ int i2c_byte_read(i2c_t *obj, int last)
256
258
}
257
259
258
260
if ((err = write_tx_fifo (obj , fifo_value )) != 0 ) {
261
+ i2c_reset (obj );
259
262
return err ;
260
263
}
261
264
@@ -264,7 +267,8 @@ int i2c_byte_read(i2c_t *obj, int last)
264
267
int timeout = MXC_I2CM_RX_TIMEOUT ;
265
268
while (!(obj -> i2c -> intfl & MXC_F_I2CM_INTFL_RX_FIFO_NOT_EMPTY ) &&
266
269
(!(obj -> i2c -> bb & MXC_F_I2CM_BB_RX_FIFO_CNT ))) {
267
- if ((-- timeout < 0 ) || !(obj -> i2c -> trans & MXC_F_I2CM_TRANS_TX_IN_PROGRESS )) {
270
+ if ((-- timeout < 0 ) || (obj -> i2c -> trans & (MXC_F_I2CM_TRANS_TX_TIMEOUT |
271
+ MXC_F_I2CM_TRANS_TX_LOST_ARBITR | MXC_F_I2CM_TRANS_TX_NACKED ))) {
268
272
break ;
269
273
}
270
274
}
@@ -274,6 +278,8 @@ int i2c_byte_read(i2c_t *obj, int last)
274
278
return * obj -> rxfifo ;
275
279
}
276
280
281
+ i2c_reset (obj );
282
+
277
283
return -1 ;
278
284
}
279
285
@@ -291,6 +297,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
291
297
292
298
// write the address to the fifo
293
299
if ((err = write_tx_fifo (obj , (MXC_S_I2CM_TRANS_TAG_START | address ))) != 0 ) { // start + addr (write)
300
+ i2c_reset (obj );
294
301
return err ;
295
302
}
296
303
obj -> start_pending = 0 ;
@@ -319,13 +326,15 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
319
326
obj -> stop_pending = 1 ;
320
327
int timeout = MXC_I2CM_TX_TIMEOUT ;
321
328
// Wait for TX fifo to be empty
322
- while (!(obj -> i2c -> intfl & MXC_F_I2CM_INTFL_TX_FIFO_EMPTY ) && timeout -- ) {}
329
+ while (!(obj -> i2c -> intfl & MXC_F_I2CM_INTFL_TX_FIFO_EMPTY ) && timeout -- );
323
330
}
324
331
325
332
if (retval == 0 ) {
326
333
return length ;
327
334
}
328
335
336
+ i2c_reset (obj );
337
+
329
338
return retval ;
330
339
}
331
340
@@ -379,7 +388,8 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
379
388
while (i < length ) {
380
389
while (!(obj -> i2c -> intfl & MXC_F_I2CM_INTFL_RX_FIFO_NOT_EMPTY ) &&
381
390
(!(obj -> i2c -> bb & MXC_F_I2CM_BB_RX_FIFO_CNT ))) {
382
- if ((-- timeout < 0 ) || !(obj -> i2c -> trans & MXC_F_I2CM_TRANS_TX_IN_PROGRESS )) {
391
+ if ((-- timeout < 0 ) || (obj -> i2c -> trans & (MXC_F_I2CM_TRANS_TX_TIMEOUT |
392
+ MXC_F_I2CM_TRANS_TX_LOST_ARBITR | MXC_F_I2CM_TRANS_TX_NACKED ))) {
383
393
retval = -3 ;
384
394
goto read_done ;
385
395
}
@@ -412,5 +422,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
412
422
return length ;
413
423
}
414
424
425
+ i2c_reset (obj );
426
+
415
427
return retval ;
416
428
}
0 commit comments