@@ -317,6 +317,9 @@ void TwoWire::begin(void) {
317
317
318
318
m_i2c_cfg.p_extend = &m_i2c_extend;
319
319
m_i2c_cfg.p_callback = WireMasterCallback;
320
+
321
+ m_i2c_extend.timeout_mode = IIC_MASTER_TIMEOUT_MODE_SHORT;
322
+ m_i2c_extend.timeout_scl_low = IIC_MASTER_TIMEOUT_SCL_LOW_DISABLED;
320
323
}
321
324
322
325
m_i2c_cfg.channel = channel;
@@ -325,7 +328,7 @@ void TwoWire::begin(void) {
325
328
m_i2c_cfg.addr_mode = (address_mode == ADDRESS_MODE_7_BITS) ? I2C_MASTER_ADDR_MODE_7BIT : I2C_MASTER_ADDR_MODE_10BIT;
326
329
m_i2c_cfg.p_transfer_tx = NULL ;
327
330
m_i2c_cfg.p_transfer_rx = NULL ;
328
-
331
+
329
332
m_i2c_cfg.p_context = &m_i2c_cfg;
330
333
m_i2c_cfg.ipl = (12 );
331
334
@@ -457,13 +460,13 @@ uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsig
457
460
}
458
461
if (err == FSP_SUCCESS) {
459
462
if (m_read != nullptr ) {
463
+ bus_status = WIRE_STATUS_UNSET;
460
464
err = m_read (&m_i2c_ctrl,data,length,!sendStop);
461
465
}
462
466
}
463
- bus_status = WIRE_STATUS_UNSET;
464
- while (timeout_ms > 0 && bus_status == WIRE_STATUS_UNSET) {
465
- timeout_ms--;
466
- delay (1 );
467
+ timeout_ms = millis () + timeout_ms;
468
+ while (millis () < timeout_ms && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {
469
+
467
470
}
468
471
}
469
472
@@ -485,13 +488,13 @@ uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsign
485
488
}
486
489
if (err == FSP_SUCCESS) {
487
490
if (m_write != nullptr ) {
491
+ bus_status = WIRE_STATUS_UNSET;
488
492
err = m_write (&m_i2c_ctrl,data,length,!sendStop);
489
493
}
490
494
}
491
- bus_status = WIRE_STATUS_UNSET;
492
- while (err == FSP_SUCCESS && timeout_ms > 0 && bus_status == WIRE_STATUS_UNSET) {
493
- timeout_ms--;
494
- delay (1 );
495
+ timeout_ms = millis () + timeout_ms;
496
+ while (millis () < timeout_ms && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {
497
+
495
498
}
496
499
497
500
if (err != FSP_SUCCESS) {
@@ -529,14 +532,20 @@ void TwoWire::setClock(uint32_t freq) {
529
532
if (is_master) {
530
533
m_i2c_cfg.rate = (i2c_master_rate_t )freq;
531
534
535
+ int clock_divisor = (R_FSP_SystemClockHzGet (BSP_FEATURE_SCI_CLOCK) / 48000000u ) - 1 ;
536
+
532
537
if (is_sci) {
538
+ m_sci_i2c_extend.clock_settings .clk_divisor_value = 0 ;
539
+ m_sci_i2c_extend.clock_settings .cycles_value = 15 ;
540
+ m_sci_i2c_extend.clock_settings .snfr_value = (1 );
533
541
switch (m_i2c_cfg.rate ) {
534
542
case I2C_MASTER_RATE_STANDARD:
535
543
m_sci_i2c_extend.clock_settings .brr_value = 14 ;
536
544
m_sci_i2c_extend.clock_settings .mddr_value = 255 ;
537
545
m_sci_i2c_extend.clock_settings .bitrate_modulation = false ;
538
546
break ;
539
547
case I2C_MASTER_RATE_FAST:
548
+ default :
540
549
m_sci_i2c_extend.clock_settings .brr_value = 2 ;
541
550
m_sci_i2c_extend.clock_settings .mddr_value = 204 ;
542
551
m_sci_i2c_extend.clock_settings .bitrate_modulation = true ;
@@ -547,18 +556,20 @@ void TwoWire::setClock(uint32_t freq) {
547
556
case I2C_MASTER_RATE_STANDARD:
548
557
m_i2c_extend.clock_settings .brl_value = 27 ;
549
558
m_i2c_extend.clock_settings .brh_value = 26 ;
550
- m_i2c_extend.clock_settings .cks_value = 2 ;
559
+ m_i2c_extend.clock_settings .cks_value = 2 + clock_divisor ;
551
560
break ;
552
561
case I2C_MASTER_RATE_FAST:
553
- m_i2c_extend.clock_settings .brl_value = 24 ;
554
- m_i2c_extend.clock_settings .brh_value = 23 ;
555
- m_i2c_extend.clock_settings .cks_value = 0 ;
562
+ m_i2c_extend.clock_settings .brl_value = 16 ;
563
+ m_i2c_extend.clock_settings .brh_value = 15 ;
564
+ m_i2c_extend.clock_settings .cks_value = 0 + clock_divisor ;
556
565
break ;
566
+ #if BSP_FEATURE_IIC_FAST_MODE_PLUS
557
567
case I2C_MASTER_RATE_FASTPLUS:
558
568
m_i2c_extend.clock_settings .brl_value = 6 ;
559
569
m_i2c_extend.clock_settings .brh_value = 5 ;
560
570
m_i2c_extend.clock_settings .cks_value = 0 ;
561
571
break ;
572
+ #endif
562
573
}
563
574
}
564
575
}
0 commit comments