50
50
#include "nrf_gpio.h"
51
51
#include "nrf_delay.h"
52
52
53
- // An arbitrary value used as the counter in loops waiting for given event
54
- // (e.g. STOPPED), needed to avoid infinite loops (and not involve any timers
55
- // or tickers).
56
- #define TIMEOUT_VALUE 1000
53
+ #include "us_ticker_api.h"
54
+
55
+ // An arbitrary value used as the timeout in loops waiting for given event
56
+ // (e.g. STOPPED), needed to avoid infinite loops.
57
+ // This value might be defined externally.
58
+ #ifndef I2C_TIMEOUT_VALUE_US
59
+ #define I2C_TIMEOUT_VALUE_US 1000000
60
+ #endif
57
61
58
62
#if DEVICE_I2C_ASYNCH
59
63
#define TWI_IDX (obj ) ((obj)->i2c.twi_idx)
@@ -371,17 +375,20 @@ int i2c_start(i2c_t *obj)
371
375
int i2c_stop (i2c_t * obj )
372
376
{
373
377
NRF_TWI_Type * twi = m_twi_instances [TWI_IDX (obj )];
378
+ uint32_t t0 ;
374
379
375
380
// The current transfer may be suspended (if it is RX), so it must be
376
381
// resumed before the STOP task is triggered.
377
382
nrf_twi_task_trigger (twi , NRF_TWI_TASK_RESUME );
378
383
nrf_twi_task_trigger (twi , NRF_TWI_TASK_STOP );
379
- uint32_t remaining_time = TIMEOUT_VALUE ;
384
+
385
+ t0 = ticker_read (get_us_ticker_data ());
386
+
380
387
do {
381
388
if (nrf_twi_event_check (twi , NRF_TWI_EVENT_STOPPED )) {
382
389
return 0 ;
383
390
}
384
- } while (-- remaining_time );
391
+ } while ((( uint32_t ) ticker_read ( get_us_ticker_data ()) - t0 ) < I2C_TIMEOUT_VALUE_US );
385
392
386
393
return 1 ;
387
394
}
@@ -464,11 +471,15 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
464
471
465
472
static uint8_t twi_byte_write (NRF_TWI_Type * twi , uint8_t data )
466
473
{
474
+ uint32_t t0 ;
475
+
467
476
nrf_twi_event_clear (twi , NRF_TWI_EVENT_TXDSENT );
468
477
nrf_twi_event_clear (twi , NRF_TWI_EVENT_ERROR );
469
478
470
479
nrf_twi_txd_set (twi , data );
471
- uint32_t remaining_time = TIMEOUT_VALUE ;
480
+
481
+ t0 = ticker_read (get_us_ticker_data ());
482
+
472
483
do {
473
484
if (nrf_twi_event_check (twi , NRF_TWI_EVENT_TXDSENT )) {
474
485
nrf_twi_event_clear (twi , NRF_TWI_EVENT_TXDSENT );
@@ -478,7 +489,7 @@ static uint8_t twi_byte_write(NRF_TWI_Type *twi, uint8_t data)
478
489
nrf_twi_event_clear (twi , NRF_TWI_EVENT_ERROR );
479
490
return 0 ; // some error occurred
480
491
}
481
- } while (-- remaining_time );
492
+ } while ((( uint32_t ) ticker_read ( get_us_ticker_data ()) - t0 ) < I2C_TIMEOUT_VALUE_US );
482
493
483
494
return 2 ; // timeout;
484
495
}
@@ -500,6 +511,9 @@ static void start_twi_write(NRF_TWI_Type *twi, int address)
500
511
int i2c_write (i2c_t * obj , int address , const char * data , int length , int stop )
501
512
{
502
513
twi_info_t * twi_info = TWI_INFO (obj );
514
+ bool timeout = false;
515
+ uint32_t t0 , t1 ;
516
+
503
517
#if DEVICE_I2C_ASYNCH
504
518
if (twi_info -> active ) {
505
519
return I2C_ERROR_BUS_BUSY ;
@@ -522,12 +536,16 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
522
536
nrf_twi_event_clear (twi , event );
523
537
nrf_twi_task_trigger (twi , NRF_TWI_TASK_SUSPEND );
524
538
}
525
- uint32_t remaining_time = TIMEOUT_VALUE ;
539
+
540
+ t0 = ticker_read (get_us_ticker_data ());
541
+
526
542
do {
527
543
if (nrf_twi_event_check (twi , event )) {
528
544
break ;
529
545
}
530
- } while (-- remaining_time );
546
+ t1 = ticker_read (get_us_ticker_data ());
547
+ timeout = (t1 - t0 ) >= I2C_TIMEOUT_VALUE_US ;
548
+ } while (!timeout );
531
549
532
550
uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear (twi );
533
551
if (errorsrc & NRF_TWI_ERROR_ADDRESS_NACK ) {
@@ -537,7 +555,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
537
555
return I2C_ERROR_NO_SLAVE ;
538
556
}
539
557
540
- return (remaining_time ? 0 : I2C_ERROR_BUS_BUSY );
558
+ return (timeout ? I2C_ERROR_BUS_BUSY : 0 );
541
559
}
542
560
543
561
int result = length ;
@@ -574,13 +592,15 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
574
592
int i2c_byte_read (i2c_t * obj , int last )
575
593
{
576
594
NRF_TWI_Type * twi = m_twi_instances [TWI_IDX (obj )];
595
+ uint32_t t0 ;
577
596
578
597
if (last ) {
579
598
nrf_twi_shorts_set (twi , NRF_TWI_SHORT_BB_STOP_MASK );
580
599
}
581
600
nrf_twi_task_trigger (twi , NRF_TWI_TASK_RESUME );
582
601
583
- uint32_t remaining_time = TIMEOUT_VALUE ;
602
+ t0 = ticker_read (get_us_ticker_data ());
603
+
584
604
do {
585
605
if (nrf_twi_event_check (twi , NRF_TWI_EVENT_RXDREADY )) {
586
606
nrf_twi_event_clear (twi , NRF_TWI_EVENT_RXDREADY );
@@ -590,7 +610,7 @@ int i2c_byte_read(i2c_t *obj, int last)
590
610
nrf_twi_event_clear (twi , NRF_TWI_EVENT_ERROR );
591
611
return I2C_ERROR_NO_SLAVE ;
592
612
}
593
- } while (-- remaining_time );
613
+ } while ((( uint32_t ) ticker_read ( get_us_ticker_data ()) - t0 ) < I2C_TIMEOUT_VALUE_US );
594
614
595
615
return I2C_ERROR_BUS_BUSY ;
596
616
}
0 commit comments